我有一些像这样的XML:
<doc>
<a a1="1" />
<a a1="1" a2="1" />
<a a2="1" a1="1" />
<a a2="1" />
</doc>
我需要对其进行转换,以便节点“a”的属性将其装饰为节点,如下所示:
<doc>
<a1><a /></a1>
<a1><a2><a /></a2></a1>
<a2><a1><a /></a1></a2>
<a2><a/></a2>
</doc>
有人会非常友好地指出XSLT解决方案吗?
答案 0 :(得分:1)
最简单的方法是递归一系列属性:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="a">
<xsl:param name="a" select="@*"/>
<xsl:choose>
<xsl:when test="$a">
<xsl:element name="{name($a[1])}">
<xsl:apply-templates select=".">
<xsl:with-param name="a" select="$a[position()!=1]"/>
</xsl:apply-templates>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<a/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
产生:
<doc>
<a1>
<a/>
</a1>
<a1>
<a2>
<a/>
</a2>
</a1>
<a2>
<a1>
<a/>
</a1>
</a2>
<a2>
<a/>
</a2>
</doc>