1

在 XSLT 2.0 中是否可以在 xsl:template 匹配模式中使用存储在全局变量中的节点集?

例如:

<!-- GLOBAL PARAMETERS -->
<xsl:param name="tktDocRS" />

<xsl:variable name="tktDoc" select="saxon:parse($tktDocRS)" />

...

<xsl:template match="$tktDoc//someNodeInTktDoc">

...

</xsl:template>
4

3 回答 3

3

在 XSLT 2.0 中是否可以使用存储在 xsl:template 匹配模式中的全局变量中的节点集。

是的,但是变量引用只能出现在谓词中

根据W3C XSLT 2.0 规范中的八个语法规则,

模式是*relativePathPattern*s 的联合(最终可以由 '/' 或 '//' 前置),每个relativePathPattern由 *patternStep*s 组成,每个都具有以下语法:

[4]   PatternStep   ::=   PatternAxis? NodeTest PredicateList

PatternAxisNodeTest都不能包含该$字符,这意味着变量引用只允许在谓词中。

这是一个非常简单的例子

<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>
于 2012-04-12T12:31:46.417 回答
3

XSLT 3.0(未发布!)使以下内容合法:

<xsl:template match="$x//a">

这将匹配任何以 $x 作为祖先的元素。

在 XSLT 2.0 中,您必须将其编写为:

<xsl:template match="a[ancestor::node() intersect $x]">
于 2012-04-12T14:53:04.727 回答
2

我认为您不能将变量引用作为模式中的一个步骤。而且你不必,它应该足以使用

<xsl:template match="someNodeInTktDoc">...</xsl:template>

那么你只需要确保你在$tktDoc.

于 2012-04-12T12:35:54.877 回答