ツリーをコピーする必要があります。しかし、特定のノード (attr2="yyy") については、2 つのコピーを作成したいと考えています。
- 1枚目「そのまま」
- 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 は置き換えられません。
私はこれを自分で理解しようとしてきましたが、これまでのところ成功していません。私を正しい方向に向けてくれてありがとう。