XML转换递归并将属性作为节点名称

时间:2013-01-09 11:27:28

标签: xml xslt

我正在使用以下格式的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树中的节点转换为数组。在此先感谢。

1 个答案:

答案 0 :(得分: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>