XSLTを使用しています。
次の非常に単純な XML を想定します。
<ROOT>
<ELEMENT>
<ELEMENT>content of ELEMENT</ELEMENT>
</ELEMENT>
</ROOT>
子ノードの名前がその親の名前と等しい場合、XSLT で XML 階層を統合するにはどうすればよいですか? 結果の XML は次のようになります。
<ROOT>
<ELEMENT>content of ELEMENT</ELEMENT>
</ROOT>
この質問はあまり意味がありません。特に、CM Sperberg-McQueen や JLRishe の例のように XML がさらに複雑な場合や、属性が親または子/子のいずれかに存在する場合はなおさらです。
ただし、これを行いたい場合、XML 構造があなたの例と同じくらい単純であれば、次のようにします。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[name()=name(*)]">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
親に属性があり、それらを継承したい場合は、次のようにすることができます。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[name()=name(*)]" priority="1">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*[name()=name(../*)]">
<xsl:copy>
<xsl:copy-of select="../@*"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
最初に /ROOT/ELEMENT/ELEMENT 要素をコピーしてから /ROOT/ELEMENT を削除すると、コピーした ELEMENT 要素を再び元に戻すことができます...