使用xslt展平XML

时间:2012-09-26 21:16:31

标签: xml xslt

我有:

<nodes>
  <node>
    <name>node1</name>
    <other>stuff1</other>
    <node>
      <name>node11</name>
      <other>stuff11</other>
    </node>
    <node>
      <name>node12</name>
      <other>stuff12</other>
    </node>
  </node>
  <node>
    <name>node2</name>
    <other>stuff2</other>
  </node>
  <node>
    <name>node3</name>
    <other>stuff3</other>
  </node>
</nodes>

我希望最终得到一个扁平的结构,如:

<nodes>
  <node>
    <name>node1</name>
    <other>stuff1</other>
  </node>
  <node>
    <name>node11</name>
    <other>stuff11</other>
  </node>
  <node>
    <name>node12</name>
    <other>stuff21</other>
  </node>
  <node>
    <name>node2</name>
    <other>stuff2</other>
  </node>
  <node>
    <name>node3</name>
    <other>stuff3</other>
  </node>
</nodes>

这是一个简单的例子,但我希望复制每个节点中的所有元素,而不是嵌套的“节点”元素。我尝试了副本以保留标签,但这也保留了嵌套。我也尝试过复制,但这样就没有孩子了。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这应该做你想要的。对于顶级nodes元素,它按文档顺序为所有后代node元素应用模板。对于每个node,它会复制所有非node子元素。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="node">
    <xsl:copy><xsl:copy-of select="*[local-name() != 'node']"/></xsl:copy>
  </xsl:template>

  <xsl:template match="/nodes">
    <xsl:copy><xsl:apply-templates select="descendant::node" /></xsl:copy>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

我会使用XQuery。它好多了:

<nodes>
  { //node/<node> { (name, other) } </node> }
</nodes>