0

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

4

1 回答 1

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>
于 2013-01-19T21:16:25.553 回答