xsl中的全局变量:模板匹配模式?

时间:2012-04-12 12:13:52

标签: xslt xslt-2.0

在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>

3 个答案:

答案 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上应用模板。