Displaying multi level Xml data into a single level by XSLT

I have some XML that is a multi level with an attribute.

Need to convert this to a single level Xml by Xslt.

<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>

below is the expected result after transforming the above Xml. input Xmls may contain more attributes also. Here in the sample I have entered only one attribute.

<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>

please tell me the appropriate way to convert to the above desired format.

Thanks.

Upvotes: 0

Views: 352

Answers (1)

Martin Honnen
Martin Honnen

Reputation: 167696

If you want to flatten a nested XML document then you usually apply-templates to all descendants or in your case to .//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>

Online at http://xsltransform.net/bFN1y9v.

Upvotes: 1

Related Questions