在XSLT 2.0中是否可以在xsl:template match patterns中使用存储在全局变量中的节点集?
例如:
<!-- GLOBAL PARAMETERS -->
<xsl:param name="tktDocRS" />
<xsl:variable name="tktDoc" select="saxon:parse($tktDocRS)" />
...
<xsl:template match="$tktDoc//someNodeInTktDoc">
...
</xsl:template>
答案 0 :(得分:3)
在XSLT 2.0中是否可以使用存储在全局变量中的节点集 在xsl:模板匹配模式中。
是的,但变量引用只能出现在谓词。
根据 W3C XSLT 2.0 specification 中的八个语法规则,
模式是* 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>
答案 1 :(得分:3)
XSLT 3.0(未发布!)使以下内容合法:
<xsl:template match="$x//a">
将匹配任何具有$ x作为祖先的元素。
在XSLT 2.0中,您必须将其写为:
<xsl:template match="a[ancestor::node() intersect $x]">
答案 2 :(得分:2)
我认为you can't put the variable reference as a step in a pattern。你没必要,它应该足够使用
<xsl:template match="someNodeInTktDoc">...</xsl:template>
然后您只需要确保在$tktDoc
上应用模板。