表达式必须对节点集求值意味着什么?

问题描述 投票:0回答:1

我有以下代码。

 <!-- 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()
xml xslt xslt-1.0
1个回答
0
投票

我不确定为什么您会在此代码段中遇到错误,但是我可以告诉您错误消息的含义。

[当使用路径表达式,例如$X/Y时,“ /”运算符左侧的表达式必须求值为一个节点集,这是XSLT中少数基本数据类型之一1.0和XPath 1.0。 (在其他一些地方,该值必须是节点集,但是“ /”的lhs最常见。)

例如,当使用不带select属性的xsl:variable时

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

然后,v的值不是节点集,而是“结果树片段”,这意味着$ v不能在“ /”运算符的lh上使用。

这是XSLT 1.0中的严重设计错误。詹姆斯·克拉克(James Clark)在这里解释了基本原理:https://markmail.org/message/uafk4pxqawkjuaid

等于XSL WG期望XSLT 1.0将很快被XSLT 1.1所遵循,从而解除了此类限制;他们从来没有期望过20年后会有人继续使用XSLT 1.0。在XSLT 2.0中,限制当然解除了,但是Microsoft从未实现过。

© www.soinside.com 2019 - 2024. All rights reserved.