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