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>

これは単純な例ですが、ネストされた「ノード」要素ではなく、各ノードのすべての要素をコピーしたいと思います。タグを保持するためにcopy-ofを試しましたが、ネストも保持されます。私もコピーを試しましたが、それはすべての子供を除外します。

何か案は?

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 に答える