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 マッチ パターンで使用することは可能ですか。

はい。ただし、変数参照は predicate でのみ発生できます

W3C XSLT 2.0 仕様の 8 つの構文規則によると、

パターンは *relativePathPattern* の結合であり(最終的には '/' または '//' を先頭に追加できます)、各relativePathPatternは *patternStep* で構成され、それぞれの構文は次のとおりです。

[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 に答える
2

変数参照をパターンのステップとして入れることはできないと思います。そして、あなたはする必要はありません、それは使用するのに十分なはずです

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

次に、apply-templates on を確認する必要があります$tktDoc

于 2012-04-12T12:35:54.877 に答える