-1

XSLTを使用しています。

次の非常に単純な XML を想定します。

<ROOT>
  <ELEMENT>
    <ELEMENT>content of ELEMENT</ELEMENT>
  </ELEMENT>
</ROOT>

子ノードの名前がその親の名前と等しい場合、XSLT で XML 階層を統合するにはどうすればよいですか? 結果の XML は次のようになります。

<ROOT>
   <ELEMENT>content of ELEMENT</ELEMENT>
</ROOT>
4

2 に答える 2

0

この質問はあまり意味がありません。特に、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>
于 2013-02-02T04:46:28.530 に答える
0

最初に /ROOT/ELEMENT/ELEMENT 要素をコピーしてから /ROOT/ELEMENT を削除すると、コピーした ELEMENT 要素を再び元に戻すことができます...

于 2013-02-01T18:42:40.813 に答える