如何使用XSLT组合复杂的XML元素

时间:2012-04-04 09:05:27

标签: xml xslt

我有以下输入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>

提前致谢。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>