2

私はこのようなxmlを持っています:

<span reference="1">Reference Text 1</span>
<term reference="2">Reference Text 2</term>

そして私はこれになるためにそれが必要です:

<span class="referenceText">Reference Text 1</span> <a href="1">[1]</a>
<i>Reference Text 2</i> <a href="2">[2]</a>

したがって、基本的に、reference属性を持つ要素がスパンである場合は、そのままにして、を追加しclass="referenceText"ます。ただし、それが他の要素である場合は、この要素用に作成されたテンプレートも適用する必要があります。そういうわけ<term>でなる必要があります<i>-私はそれのためのテンプレートを持っています:

<xsl:template match="term">
  <i><xsl:apply-templates select="@* |node()"/></i>
</xsl:template>

属性を持つすべての要素の変換のために、reference私はこのテンプレートを持っています:

<xsl:template match="*[@reference]">

  <xsl:param name="href" select="./@reference"/>

  <xsl:choose>
    <xsl:when test="name() = 'span'">
      <span class="referenceText">
        <xsl:value-of select="."/>
      </span>
    </xsl:when>
    <xsl:otherwise>
      <xsl:element name="{name()}">
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:otherwise>
  </xsl:choose>

  <xsl:text> </xsl:text><a href="#{$href}">[<xsl:value-of select="./@href"/>]</a>

</xsl:template>

残念ながら、これにより次の出力が生成されます。

<span class="referenceText">Reference Text 1</span> <a href="1">[1]</a>
<term>Reference Text 2</term> <a href="2">[2]</a>

したがって、に<term>変換されません<i>。生成されたものにテンプレートを再適用するには、ある種の再帰が必要なようですが、何も思いつきません。

4

1 に答える 1

2

XSLT 1.0を使用している場合は、出力を変数にキャプチャしてから、exslt:node-set関数を使用してテンプレートを変数に適用できます。ただし、無限再帰は避けてください:)

<xsl:variable name="foo">
...
</xsl:variable>
<xsl:apply-templates select="exslt:node-set($foo)"/>

編集:この回答に関連する追加のコメントを組み込む)

EXSLT拡張機能を使用するための最初のステップは、その名前空間を宣言することです。EXSLTプロジェクトのWebサイトでは、<xsl:stylesheet>ノードでこれを行うことを推奨しています。

EXSLTで説明されている拡張機能を使用するための最初のステップは、EXSLTモジュールに関連する名前空間を定義することです。スタイルシートのxsl:stylesheet要素で名前空間を宣言する必要があります。

<xsl:stylesheet xmlns:exslt="http://exslt.org/common">
  //...
</xsl:stylesheet>

さらに、このextension-element-prefixes属性を使用して、拡張機能の名前空間が結果のドキュメントに追加されないようにすることができます。

<xsl:stylesheet xmlns:exslt="http://exslt.org/common" extension-element-prefixes="exslt">
  //...
</xsl:stylesheet>
于 2013-02-06T23:23:19.447 に答える