Xml 表达式必须计算为节点集意味着什么?
我有以下代码Xml 表达式必须计算为节点集意味着什么?,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有以下代码 <!-- 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-
<!-- 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()
System.Xml.Xsl.Xsl异常
HResult=0x80131942
Message=表达式必须计算为节点集。
Source=System.Private.Xml
堆栈跟踪:
位于System.Xml.Xsl.Runtime.XsltConvert.EnsureNodeSet(IList`1列表项)
在System.Xml.Xsl.XmlILCommand.Execute(对象defaultDocument、XmlResolver数据源、XslTargetList argumentList、XmlSequenceWriter结果)
在System.Xml.Xsl.XmlILCommand.Execute(对象defaultDocument、XmlResolver数据源、XslTargetList argumentList、XmlWriter)
在System.Xml.Xsl.xslcomiledTransform.Transform(IXPathNavigable输入、XSLTargetList参数、XmlWriter结果、XmlResolver documentResolver)
在System.Xml.Xsl.xslcomiledtransform.Transform(IXPathNavigable输入、XsltArgumentList参数、XmlWriter结果)
在中的WZDxConversion.Controllers.ValuesController.Post()处--------------------------------------------------------
位于Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(对象目标,对象[]参数)
位于Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper映射器、ObjectMethodExecutor执行器、对象控制器、对象[]参数)
在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d_u12.MoveNext()中
我不确定您为什么会收到此代码片段的错误,但我可以告诉您错误消息的含义
使用路径表达式(如$X/Y
)时,“/”运算符左侧的表达式必须计算为节点集,节点集是XSLT 1.0和XPath 1.0中为数不多的基本数据类型之一。(在其他一些地方,值必须是节点集,但最常见的是左撇子“/”
例如,当使用xsl:variable时,没有选择属性
<xsl:variable name="v">
<a><b/></a>
</xsl:variable>
这意味着XSL工作组期望XSLT1.0会很快被XSLT1.1取代,从而取消这些限制;他们从未想到20多年后还会有人使用XSLT1.0。XSLT2.0当然取消了这一限制,但微软从未实现过。这只是一个转录错误。是的,我使用的是.NET,但是错误在XSLT 1.0处理器中很常见,XslCompiledTransform是这样的:如果您创建了一个结果树片段,然后尝试在其上使用XPath,那么您首先需要使用exsl:node set($var)
将结果树片段转换为一个节点集。这种限制在XSLT2或3处理器(如Saxon 9或XmlPrime)中不存在。