XSLT

时间:2015-12-28 08:20:01

标签: xslt

我有一些带有属性的多层XML。

需要通过Xslt将其转换为单个级别的Xml。

<root name="Measures" >
    <Member name="MAF94">
        <Member name="MAF95">
            <Member name="MAM1" />
            <Member name="MAM2" />
        </Member>
        <Member name="MAF96">
            <Member name="MAF97">
                <Member name="MAM254" />
                <Member name="MAF98">
                    <Member name="MAM73" />
                    <Member name="MAM74" />
                    <Member name="MAF99">
                        <Member name="MAM11" />
                        <Member name="MAM10" />
                    </Member>
                    <Member name="MAF100">
                        <Member name="MAM18" />
                        <Member name="MAM15" />
                    </Member>
                </Member>
            </Member>
        </Member>
        <Member name="MAF352">
            <Member name="MAM1814" />
            <Member name="MAM1815" />
        </Member>
    </Member>
</root>
下面的

是转换上述Xml后的预期结果。 输入Xmls也可能包含更多属性。在示例中,我只输入了一个属性。

<root>
    <Member name="MAF94" >
        <Member name="MAF95"/>
        <Member name="MAF96"/>
        <Member name="MAF352"/>
    </Member>
    <Member name="MAF95">
        <Member name="MAM1" />
        <Member name="MAM2" />
    </Member>
    <Member name="MAF96">
        <Member name="MAF97" />
    </Member>
    <Member name="MAF97">
        <Member name="MAM254" />
        <Member name="MAF98" />
    </Member>
    <Member name="MAF98">
        <Member name="MAM73" />
        <Member name="MAM74" />
        <Member name="MAF99" />
        <Member name="MAF100" />
    </Member>
    <Member name="MAF99">
        <Member name="MAM11" />
        <Member name="MAM10" />
    </Member>
    <Member name="MAF100">
        <Member name="MAM18" />
        <Member name="MAM15" />
    </Member>
    <Member name="MAF352">
        <Member name="MAM1814" />
        <Member name="MAM1815" />
    </Member>
</root>

请告诉我转换为上述所需格式的适当方法。

感谢。

1 个答案:

答案 0 :(得分:1)

如果您想展平嵌套的XML文档,那么您通常会apply-templates为所有后代,或者在您的情况下为.//Member[Member]

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output indent="yes"/>

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

    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select=".//Member[Member]"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Member">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="Member" mode="shallow"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Member" mode="shallow">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
        </xsl:copy>
    </xsl:template>

</xsl:transform>

http://xsltransform.net/bFN1y9v在线。