【问题标题】:What does expression must evaluate to a node set mean?表达式必须对节点集求值是什么意思?
【发布时间】:2020-01-03 16:48:57
【问题描述】:

我有以下代码。

 <!-- Error func -->
 <xsl:template name="myFunc">
    <xsl:param name="person"/>
    <xsl:variable name="name">
       "name": "<xsl:value-of select="$person/name"/>",
    </xsl:variable>
    <xsl:value-of select="$name"/>
 </xsl:template>

 <!-- Call function -->
 <xsl:template match="/">
    <xsl:call-template name="myFunc">
        <xsl:with-param name="person" select="list/person"/>
    </xsl:call-template>
 </xsl:template>

我正在将变量用于更复杂的事情,但到目前为止,我什至无法让这一点工作。有什么理由吗?我不断收到以下错误

System.Xml.Xsl.XslTransformException
  HResult=0x80131942
  Message=Expression must evaluate to a node-set.
  Source=System.Private.Xml
  StackTrace:
   at System.Xml.Xsl.Runtime.XsltConvert.EnsureNodeSet(IList`1 listItems)
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer)
   at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results, XmlResolver documentResolver)
   at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input, XsltArgumentList arguments, XmlWriter results)
   at WZDxConversion.Controllers.ValuesController.Post() in --------------------------------------------------------
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()

【问题讨论】:

  • 这只是一个转录错误。是的,我使用的是 .NET,但该错误在 xslt 中似乎很常见
  • 通常使用 XslCompiledTransform 的 XSLT 1.0 处理器,如果您创建了结果树片段然后尝试在其上使用 XPath,您首先需要将结果树片段转换为节点-设置使用例如exsl:node-set($var)。 XSLT 2 或 3 处理器(如 Saxon 9 或 XmlPrime)中不存在此限制。

标签: xml xslt xslt-1.0


【解决方案1】:

我不确定您为什么会收到此代码片段的错误,但我可以告诉您想要错误消息的含义。

当您使用诸如$X/Y 之类的路径表达式时,“/”运算符左侧的表达式必须计算为节点集,这是在XSLT 1.0 和 XPath 1.0。 (还有一些其他地方的值必须是节点集,但“/”的 lhs 是最常见的。)

当你使用没有选择属性的 xsl:variable 时,例如

<xsl:variable name="v">
  <a><b/></a>
</xsl:variable>

那么v 的值不是节点集,而是“结果树片段”,这意味着 $v 不能用于“/”运算符的 lhs。

这是 XSLT 1.0 中的一个严重设计错误。詹姆斯克拉克在这里解释了理由:https://markmail.org/message/uafk4pxqawkjuaid

这等于是 XSL WG 期望 XSLT 1.0 很快就会有一个取消这些限制的 XSLT 1.1;他们从没想到 20 多年后还有人还在使用 XSLT 1.0。 XSLT 2.0 中当然取消了该限制,但微软从未实施过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2022-07-22
    • 2013-10-02
    相关资源
    最近更新 更多