使用xslt转换嵌套的xml项

时间:2010-10-11 10:21:46

标签: xml xslt

如何使用xslt转换嵌套的XML元素,保留结构?

假设我有一个这样的XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node>
  </node>
  <node>
    <node>
      <node>
      </node>
    </node>
  </node>
</root>

我想得到这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <element>
    </element>
    <element>
      <element>
        <element>
        </element>
      </element>
    </element>
</root>

我应该使用什么样的xslt?

谢谢!

2 个答案:

答案 0 :(得分:5)

在XSLT中执行此操作的方法是这样的(使用identity rule和推送样式)

<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="node">
  <element>
    <xsl:apply-templates select="node()|@*"/>
  </element>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<root>
  <node>
  </node>
  <node>
    <node>
      <node>
      </node>
    </node>
  </node>
</root>

产生了想要的正确结果

<root>
   <element/>
   <element>
      <element>
         <element/>
      </element>
   </element>
</root>

请注意

  1. 使用身份规则及其仅覆盖特定元素 - 这是最基本和最强大的XSLT设计模式。

  2. 如何通过使用1.我们实现优雅而纯粹的“推动式”转型。

答案 1 :(得分:3)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
    <root>
      <xsl:apply-templates />
    </root>
  </xsl:template>
  <xsl:template match="node">
    <element>
      <xsl:apply-templates />
    </element>
  </xsl:template>
</xsl:stylesheet>

密钥是apply-templates标记,用于递归处理标记内容。