Reputation: 15
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
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