xsl
<xsl:variable name="varName>
<xsl:value-of select="/can/be/a/long/path/down/xml/item[@id=1] />
</xsl:variable>
xml
<xml>
<item id="1" text="Yes">
<item id="2" text="No">
</xml>
使用
我以为我可以这样使用:
<xsl:when test="$varName/@text = 'Yes'">
blah
</xsl:when>
但是生成空格代替变量。这是否可能,将节点作为变量并在其他地方使用?
答案 0 :(得分:4)
<xsl:variable name="varName">
<xsl:value-of select="/can/be/a/long/path/down/xml/item[@id=1]" />
</xsl:variable>
这是我看到的最常见的XSLT错误之一。通常人们的意图是:
<xsl:variable name="varName" select="/can/be/a/long/path/down/xml/item[@id=1]"/>
大多数情况下,代码运行得很好,除了它比它需要的慢得多。但有时候,两个结构在封面下完全不同的事实又回来咬你。
为了理解差异,带有select属性的xsl:variable将变量绑定到select表达式求值的任何值,在这种情况下是一组零个或多个item元素。相比之下,带有嵌套指令的xsl:variable创建了一个文档节点(XSLT 2.0)或结果树片段(XSLT 1.0),其内容是这些指令产生的COPY。在这种情况下,因为内容是xsl:value-of指令,所以变量包含所选节点的字符串值的副本。
当然,所选节点的字符串值没有任何属性,因此test="$varname/@text = 'x'"
将始终返回false。