2

次の入力XMLがあります。

<root age="1">
<description>some text</description>
<section>
    <item name="a">
        <uuid>1</uuid>
    <item>
</section>
<section>
    <item name="b">
        <uuid>2</uuid>
    <item>
</section>
</root>

次のXMLに変換したいと思います。

<root age="1">
<description>some text</description>
<section>
    <item name="a">
        <uuid>1</uuid>
    <item>
    <item name="b">
        <uuid>2</uuid>
    <item>
</section>
</root>

前もって感謝します。

4

2 に答える 2

1

よりシンプルで短いソリューション

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="section[1]">
   <section>
     <xsl:apply-templates select="../section/node()"/>
   </section>
 </xsl:template>

 <xsl:template match="section[position() > 1]"/>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合

<root age="1">
    <description>some text</description>
    <section>
        <item name="a">
            <uuid>1</uuid>
        </item>
    </section>
    <section>
        <item name="b">
            <uuid>2</uuid>
        </item>
    </section>
</root>

必要な正しい結果が生成されます。

<root age="1">
   <description>some text</description>
   <section>
      <item name="a">
         <uuid>1</uuid>
      </item>
      <item name="b">
         <uuid>2</uuid>
      </item>
   </section>
</root>
于 2012-04-04T12:59:50.797 に答える
1

これが私のxslt-1.0の試みです:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates select="*[name() != 'section']"/>
      <xsl:element name="section">
        <xsl:apply-templates select="section"/>
      </xsl:element>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="section">
    <xsl:apply-templates select="*"/>
  </xsl:template>

</xsl:stylesheet>
于 2012-04-04T09:47:31.077 に答える