私は XSLT を初めて使用し、この問題に行き詰まりました。
入力 XML
<Root>
<Family>
<Entity>
<SomeElement1/>
<Child1>
<Element1/>
</Child1>
<Child2>
<Element2/>
</Child2>
<Entity>
<SomeElement1/>
<Child1>
<Element111/>
</Child1>
<Child2>
<Element222/>
</Child2>
</Entity>
</Entity>
</Family>
</Root>
出力 XML
<Response>
<EntityRoot>
<SomeElement1/>
</EntityRoot>
<Child1Root>
<Element1>
</Child1Root>
<Child2Root>
<Element2>
</Child2Root>
<MetadataEntityRoot>
<SomeElement1/>
</MetadataEntityRoot>
<Child1Root>
<Element111>
</Child1Root>
<Child2Root>
<Element222>
</Child2Root>
</Response>
入力xmlからすべてをコピーする方法を知っています。しかし、子要素を除外して別のルート要素に再度コピーする方法がわかりません。
<!-- Copy everything -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
与えられた答えに基づいてこれを試しました
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Entity">
<EntityRoot>
<xsl:apply-templates select="@* | node()[not(self::Child1 | self::Child2)]" />
</EntityRoot>
<xsl:apply-templates select="Child1 | Child2" />
</xsl:template>
<xsl:template match="Child1">
<Child1Root><xsl:apply-templates select="@*|node()" /></Child1Root>
</xsl:template>
<xsl:template match="Child2">
<Child2Root><xsl:apply-templates select="@*|node()" /></Child2Root>
</xsl:template>
</xsl:stylesheet>
しかし、出力は次のようになりました。
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Family>
<EntityRoot>
<SomeElement1/>
</EntityRoot>
<Child1Root>
<Element1/>
</Child1Root>
<Child2Root>
<Element2/>
</Child2Root>
</Family>
</Root>