2

子ノード(H、W、P)をランダムな順序で含むノード(Z)を含むXMLファイルがあります。

<X>
  <Y>
    <Z>
      <H>Hello</H>
      <W>World</W>
      <P>!</P>
    </Z>
    <Z>
      <P>!</P>
      <W>World</W>
      <H>Hello</H>
    </Z>
  </Y>
</X>

そして、子ノードのコンテンツを指定された順序で選択したいと思います。

私はこれを結びました:

/X/Y/Z/*[self::H or self::W or self::P]/text()

しかし、これは間違った順序を維持します:

Hello World !
! World Hello

Hを基準にしてWとPを順番に選択する方法が必要です。どうやってやるの?

私はこれを試しました:

/X/Y/Z/(H,W,P)/text()

しかし、順序はまだ間違っています。

編集:質問は、テキスト部分だけが必要であるが、テキストだけでなくノードも必要であることを示唆しています。その理由は、XPath text()関数にCDATAセクションの問題があるように思われるためです。

4

2 に答える 2

3

XPath 2 の場合:

/ を使用してノードを選択すると、記述方法に関係なく、常にドキュメントの順序でノードが返されます。

ただし、ノードの代わりにアトミック値を選択すると、順序が維持されます。

/X/Y/Z/concat(H,W,P)

順序を変更しない for-in-return を使用することもできます。

for $z in /X/Y/Z return ($z/H,$z/W,$z/P)

XPath 3 の場合:

実際の最新の実装では、 ! も使用できます。/ の代わりに、これも常に順序を保持し、それ以外は / と同じです (また、重複も保持します):

 /X/Y/Z ! (H,W,P) ! text()
于 2013-03-11T15:16:28.820 に答える
0

XPathは常にXMLドキュメントツリー自体の構造に従うため、XPath[self::H or self::W or self::P]/text()は常にH、W、およびPノードを表示順に返します。これが「HelloWorld!」と表示される理由です。と「!ワールドハロー」。

ここではテキストのみが必要なので、次のように連結関数を使用できます。

concat(/X/Y/Z/H, /X/Y/Z/W, /X/Y/Z/P)

于 2013-03-11T15:18:16.520 に答える