0

次の xsl テンプレートがあります。

<xsl:template match="@*|node()" mode="fix-entity-references">   
    <xsl:copy>
        <xsl:for-each select="@*">
            <xsl:if test="name() = 'href'"> 
              <xsl:variable name="hrefvar">
                <xsl:value-of select="current()"/>
              </xsl:variable>
              <xsl:attribute name="href">
                anything
              </xsl:attribute>
            </xsl:if>
        </xsl:for-each>
        <xsl:apply-templates select="@*|node()" mode="fix-entity-references"/>
    </xsl:copy>
  </xsl:template>

このテンプレートを使用して現在のノードをコピーしたいのですが、それはすべての属性を処理した後でのみです。現在のサンプルは非常に単純で、非常に単純なブロックに置き換えることができます。テスト式はさらに複雑になります。ポイントは、式を満たすすべての要素に N 個の属性が存在する可能性があるということです。これが for-each が必要な理由です。これらの属性をすべて同じ方法で処理したいと考えています。「current()」値を出力しようとしましたが、常に正常に動作します。問題は、元のノードの属性を更新することです。「href」属性の値を「anything」に設定しても機能しません。これを呼び出すまでに、現在のノードが属性自体であることを意味する for-each ブロック内にあると思います。

コピーされたノードが変更された属性を使用するように、for-each ブロック内から元のブロックの属性を設定するにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

2

for-eachとではなく、if別の方法で処理したい属性に一致するテンプレートの使用を検討することもできます。

<xsl:template match="@*|node()" mode="fix-entity-references">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" mode="fix-entity-references"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@href | @foo | @bar" mode="fix-entity-references">
  <xsl:attribute name="{name()}">
    <xsl:value-of select=".."/>
  </xsl:attribute>
</xsl:template>

XPathデータモデルでは、属性ノードは要素の子とは見なされませんが、属性ノードの親は属性が属する要素です(つまり、コンテキストノードが属性の場合..、属性を見つけることができる要素です)。 )。したがって、このサンプルは、任意のhreffooまたはbar属性の値を、属性を含む要素のテキストコンテンツに置き換えます。

<a href="#">http://example.com</a>

になります

<a href="http://example.com">http://example.com</a>
于 2013-03-08T11:33:43.950 に答える