XPath:テキストノードを選択


150

次のXMLがあります。

<node>Text1<subnode/>text2</node>

XPathを介して最初または2番目のテキストノードを選択するにはどうすればよいですか?

このようなもの:

/node/text()[2]

もちろん、それはノード内のすべてのテキストをマージした結果なので機能しません。


11
あなたが書いた:/node/text()[2][...]はノード内のすべてのテキストのマージ結果であるため機能しません。間違っています:ルート要素の2番目のテキストノードの子をnode意味します文字列値(子孫テキストノードの連結)があろうstring(/node)

Xpathクエリが機能する必要があるということですか?さて、私は別の場所で別の問題を抱えていると思います。;)ありがとう!
カーネル

良い質問です、+ 1。説明とトップ要素のすべてまたは特定のテキストノードの子を選択するいくつかのXPath式については、私の回答を参照してください。
Dimitre Novatchev、2011

回答:


183

次のXMLがあります。

<node>Text1<subnode/>text2</node> 

XPathを介して最初または2番目のテキストノードを選択するにはどうすればよいですか?

使用

/node/text()

これにより、XMLドキュメントの最上位要素(「ノード」という名前)のすべてのテキストノードの子が選択されます。

/node/text()[1]

これにより、XMLドキュメントの最上位要素(「ノード」という名前)の最初のテキストノードの子が選択されます。

/node/text()[2]

これにより、XMLドキュメントの最上位要素(「ノード」という名前)の2番目のテキストノードの子が選択されます。

/node/text()[someInteger]

これにより、XMLドキュメントの最上位要素(「ノード」という名前)のsomeInteger番目のテキストノードの子が選択されます。これは、次のXPath式と同等です。

/node/text()[position() = someInteger]

@NaftuliTzviKay:これはChromeが壊れていることを意味します。/node[2]ソースXMLドキュメントが整形式である場合は、ノードを選択しないでください。整形式のXML文書の定義では、1つの(単一の)最上位要素のみが存在します。別名はdocument-element
Dimitre Novatchev、2015

1
これはPHPで動作しますか?タグのセットの間にあっても、テキストノードのみをループ処理しようとしています。問題は、タグに関係なく、複数のテキストノードのコンテンツをまとめて壊すことです。//*[text()]とにかく使う。/html/text()動作しません。
Aaron Gillion

2
@AaronGillion、はい、AFAIK PHPにはXPath 1.0評価が正しく機能しています。/html/text()文書内のすべてのテキストノードを選択するのではなく、最上位のhtml要素の子孫(子孫ではない)であるテキストノードのみを選択することに注意してください。おそらく欲しいでしょう/html//text() 。XPath式を構築するには、通常、XPathに関するある程度の知識と理解が必要です。
Dimitre Novatchev 2015年

ありがとう。少し前にダブルスラッシュのトリックを見つけました!
アーロンギリオン

@AaronGillion、どういたしまして。あなたはこのオンライントレーニングコースのモジュール2でXPath 1.0と2.0の基礎を学ぶことができます。pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev

29

xpathが機能するはずです。MarkLogicとZorba Xquery / Xpath実装の両方でxpathとmineをテストしました。

両方とも動作するはずです。

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.