XSLT:一个节点可以变量并在其他地方使用吗?

时间:2017-04-12 15:16:19

标签: xslt xslt-1.0

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>

但是生成空格代替变量。这是否可能,将节点作为变量并在其他地方使用?

1 个答案:

答案 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。