将子属性作为嵌套元素装饰器

时间:2013-01-19 20:44:40

标签: xml xslt

我有一些像这样的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解决方案吗?

1 个答案:

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