私はXSLTにまったく慣れておらず、既存のXMLファイルをコピーしようとしていましたが、要素を並べ替えましたが、孫を並べ替えようとすると行き詰まりました。
私がこの入力を持っているとしましょう:
<grandParent>
<parent>
<c>789</c>
<b>
<b2>123</b2>
<b1>456</b1>
</b>
<a>123</a>
</parent>
....
</grandParent>
私がやりたいのは、同じXMLファイルを取得することですが、タグの順序をa、b、cに変更し、b = b1、b2の順序にします。そこで、XSLTファイルから始めました。
<xsl:template match="node()|@*"> <- This should copy everything as it is
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="grandParent/parent"> <- parent elements will copy in this order
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="a"/>
<xsl:copy-of select="b"/>
<xsl:copy-of select="c"/>
</xsl:copy>
</xsl:template>
ただし、「xsl:copy-of select = "b"」は、指定されたとおりに要素をコピーします(b2、b1)。「grandParent/parent / b」に別のxsl:templateを使用してみましたが、役に立ちませんでした。
多分私は物事を正しい方法でやっていない...何かヒントはありますか?
ありがとう!
解決策-Nilsに感謝します
あなたのソリューションはうまく機能します。Nilsは、「b」がオプションであり、タグの名前が相関していない可能性がある現在のシナリオに合うように、もう少しカスタマイズしました。最終的なコードは次のようになります。
<xsl:template match="node()|@*"> <- This should copy everything as it is
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="grandParent/parent"> <- parent elements will copy in this order
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="a"/>
<xslt:if test="b">
<b>
<xsl:copy-of select="b1"/>
<xsl:copy-of select="b2"/>
</b>
</xslt:if>
<xsl:copy-of select="b"/>
<xsl:copy-of select="c"/>
</xsl:copy>
</xsl:template>