2

ツリーをコピーする必要があります。しかし、特定のノード (attr2="yyy") については、2 つのコピーを作成したいと考えています。

  1. 1枚目「そのまま」
  2. 2 つ目は、attr2 の値を変更します。

入力:

<root>
    <element>
        <node1 attr1="xxx">copy once</node1>
        <node2 attr2="yyy">copy twice, modify attr2 in 2nd copy</node2>
        <node3 attr2="yyy" attr3="zzz">copy twice, modify attr2 in 2nd copy</node3>
    </element>
</root>

望ましい出力:

<root>
    <element>
        <node1 attr1="xxx">copy once</node1>
        <node2 attr2="yyy">copy twice, modify attr2 in 2nd copy</node2>
        <node2 attr2="changed">copy twice, modify attr2 in 2nd copy</node2>
        <node3 attr2="yyy" attr3="zzz">copy twice, modify attr2 in 2nd copy</node3>
        <node3 attr2="changed" attr3="zzz">copy twice, modify attr2 in 2nd copy</node3>
    </element>
</root>

私はこのスタイルシートを使用しています:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="node()[@attr2='yyy']">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        <xsl:copy>
            <xsl:attribute name="attr2">changed</xsl:attribute>
            <xsl:apply-templates />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

次の出力を取得します。

<root>
    <element>
        <node1 attr1="xxx">copy once</node1>
        <node2 attr2="yyy">copy twice, modify attr2 in 2nd copy</node2>
        <node2 attr2="changed">copy twice, modify attr2 in 2nd copy</node2>
        <node3 attr2="yyy" attr3="zzz">copy twice, modify attr2 in 2nd copy</node3>
        <node3 attr2="changed">copy twice, modify attr2 in 2nd copy</node3>
    </element>
</root>

node3 の 2 番目のコピーでは attr3 が欠落していることに注意してください。ノードと属性に適用されるように 2 番目のテンプレートを変更すると、次のようになります。

<xsl:copy>
    <xsl:attribute name="attr2">changed</xsl:attribute>
    <xsl:apply-templates select="node()|@*"/>
</xsl:copy>

その場合、attr2 は置き換えられません。

私はこれを自分で理解しようとしてきましたが、これまでのところ成功していません。私を正しい方向に向けてくれてありがとう。

4

1 に答える 1

3

あなたはかなり近いです。先取特権が 1 つだけありません。 attr2 の内容を変更する前に、
すべての属性をコピーする行を追加します 。<xsl:apply-templates select="@*"/>

これを試して:

<xsl:template match="node()[@attr2='yyy']">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="attr2">changed</xsl:attribute>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>
于 2013-06-16T16:22:03.623 に答える