1

我有:

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

这是一个简单的示例,但我想复制每个节点中的所有元素,而不是嵌套的“节点”元素。我尝试复制以保留标签,但也保留了嵌套。我也尝试过复制,但忽略了所有孩子。

有任何想法吗?

4

2 回答 2

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>
于 2012-09-26T21:36:59.703 回答
0

我会使用 XQuery。它好多了:

<nodes>
  { //node/<node> { (name, other) } </node> }
</nodes> 
于 2012-09-26T21:29:45.680 回答