使用XSLT转换XML

时间:2017-05-23 18:19:42

标签: xml xslt

我想使用XSLT转换XML。 这是我的示例XML。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <aaa>
      <bbb>
         <ccc>123</ccc>
         <ggg>2010.2</ggg>
      </bbb>
   </aaa>
   <ddd>
      <eee>112</eee>
      <fff>234</fff>
   </ddd>
   <ddd>
      <eee>456</eee>
      <fff>345</fff>
   </ddd>
</root>

我试图使用xslt获得xml以下。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <aaa>
      <bbb>
         <ccc>123</ccc>
         <ggg>2010.2</ggg>
         <ddd>
            <eee>112</eee>
            <fff>234</fff>
         </ddd>
         <ddd>
            <eee>456</eee>
            <fff>345</fff>
         </ddd>
      </bbb>
   </aaa>
</root>

我尝试使用下面的XSLT来获得xml。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <!-- Identity transform -->
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="aaa[following-sibling::ddd]">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
         <xsl:copy-of select="following-sibling::ddd" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="ddd" />
</xsl:stylesheet>

但我的输出错误。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <aaa>
      <bbb>
         <ccc>123</ccc>
         <ggg>2010.2</ggg>
      </bbb>
      <ddd>
         <eee>112</eee>
         <fff>234</fff>
      </ddd>
      <ddd>
         <eee>456</eee>
         <fff>345</fff>
      </ddd>
   </aaa>
</root>

有人可以帮助我。

3 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

DefaultVehicle

答案 1 :(得分:0)

使用下面的XSLT,可以获得所需的xml。

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
       <xsl:template match="@*|node()">
          <xsl:copy>
             <xsl:apply-templates select="@*|node()" />
          </xsl:copy>
       </xsl:template>
       <xsl:template match="aaa[following-sibling::ddd]/bbb">
          <xsl:copy>
             <xsl:apply-templates select="@*|node()" />
             <xsl:copy-of select="parent::aaa/following-sibling::ddd" />
          </xsl:copy>
       </xsl:template>
       <xsl:template match="ddd" />
    </xsl:stylesheet>

答案 2 :(得分:0)

所需的更改非常小:

  • 模板与bbb匹配(不是aaa)。
  • foollowing-sibling谓词应附加../
  • copy-of
  • 相同

下面是一个完整的脚本:

<?xml version="1.0" encoding="UTF-8"?>
<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="bbb[../following-sibling::ddd]">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
         <xsl:copy-of select="../following-sibling::ddd" />
      </xsl:copy>
   </xsl:template>

   <xsl:template match="ddd" />

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