我有以下代码。
<!-- 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()
我不确定为什么您会在此代码段中遇到错误,但是我可以告诉您错误消息的含义。
[当使用路径表达式,例如$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从未实现过。