在 XSLT 2.0 中是否可以使用存储在 xsl:template 匹配模式中的全局变量中的节点集。
是的,但是变量引用只能出现在谓词中。
根据W3C XSLT 2.0 规范中的八个语法规则,
模式是*relativePathPattern*s 的联合(最终可以由 '/' 或 '//' 前置),每个relativePathPattern由 *patternStep*s 组成,每个都具有以下语法:
[4] PatternStep ::= PatternAxis? NodeTest PredicateList
PatternAxis和NodeTest都不能包含该$
字符,这意味着变量引用只允许在谓词中。
这是一个非常简单的例子:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vOdds" select="/*/*[. mod 2 = 1]"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="num[. = count($vOdds)]">
<num special="yes"><xsl:value-of select="."/></num>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档时:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
产生了想要的正确结果:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num special="yes">05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>