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 に答える