0

私は以下の形式のXMLファイルを持っています。

<Main>
    <root>
        <group firstname="daniel" secondname="creig">
            <a firstname="tin" secondname="tao"/>
                <b firstname="bella" secondname="james">
                    <c firstname="khadhar" secondname="abdul">
                        <d firstname="xiang" secondname="tin"/>
                    </c>
                </b>
        </group>
    </root>
</Main>

そして、私は以下のような出力を得ようとしています。

<members>
    <member><id>group</id><firstname>daniel</firstname><secondname>creig</secondname></member>
    <member><id>a</id><firstname>tin</firstname><secondname>tao</secondname></member>
    <member><id>b</id><firstname>bella</firstname><secondname>james</secondname></member>
    <member><id>c</id><firstname>khadhar</firstname><secondname>abdul</secondname></member>
    <member><id>d</id><firstname>xiang</firstname><secondname>tin</secondname></member>
</members>

これまでのところ、私のXSLは次のようになります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- Elements Section -->
<xsl:template match="/*/root/*">
<member>
    <id>
        <xsl:value-of select="local-name()" />  
    </id>
    <attr>
        <xsl:apply-templates select="@*" /> 
    </attr>
</member>
</xsl:template>

<xsl:template match="@*">
    <xsl:element name="{local-name()}">
        <xsl:value-of select="(.)" />
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

必要なのは、任意の深さのXMLツリーのノードを配列に変換することだけです。前もって感謝します。

4

1 に答える 1

1

どうですか:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
   <members>
     <xsl:apply-templates select="@* | node()" />
   </members>
</xsl:template>

<xsl:template match="root//*">
    <member>
       <id><xsl:value-of select="local-name(.)" /></id>
       <xsl:apply-templates select="@*" />
    </member>
    <xsl:apply-templates select="*" />
</xsl:template>

<xsl:template match="root//@*">
    <xsl:element name="{local-name(.)}">
       <xsl:value-of select="." />
    </xsl:element>
</xsl:template>

</xsl:stylesheet>
于 2013-01-09T11:38:38.267 に答える