我有一些带有属性的多层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>
请告诉我转换为上述所需格式的适当方法。
感谢。
答案 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>