これはHTMLコードです:
<div> <span></span> Elangovan </div>
含まれているテキストに基づいてdiv
のXPathを書きたいのですが。私は試した
//div[contains(text(),'Elangovan')]
しかし、これは機能していません。
text()
を string()
に置き換えます。
//div[contains(string(), "Elangovan")]
または、span
の次のテキスト兄弟にテキストが含まれていることを確認できます。
//div[contains(span/following-sibling::text(), "Elangovan")]
こちらもご覧ください:
Alecxeの正解(+1)の代わりに、次のわずかに単純でやや慣用的なXPathも同じように機能します。
//div[contains(., "Elangovan")]
text()
を使用した元のXPathが機能しない理由は、text()
がdiv
のすべてのテキストノードの子を選択します。ただし、contains()
は最初の引数に文字列を期待します。テキストノードのノードセットが指定された場合、最初の引数のみを使用します。ここでは、最初のテキストノードにシーク後の文字列ではなく空白が含まれているため、テストは失敗します。暗黙の.
または明示的な string()
の最初の引数を使用すると、すべてのテキストノードの子孫はcontains()
テストを実行する前に連結されているため、テストに合格します。
@kjhughesのすでに良い答えをもう少し正確にするために、あなたが本当に求めているのは、div
の部分文字列を探す方法です string-value :
ノードのすべてのタイプについて、そのタイプのノードの文字列値を決定する方法があります。一部のタイプのノードでは、string-valueはノードの一部です。他のタイプのノードの場合、文字列値は子孫ノードの文字列値から計算されます。
コンテキストノード(_.
_またはdiv
自体)とtext()
-またはその他の引数によって返されるノードのセットの両方! -contains
に渡されると、最初に文字列に変換されます。 1つは単一の要素を参照し、もう1つはノードセットを参照するため、これらはさまざまな方法で変換されます。
単一の要素の文字列値は、そのすべてのテキストノードの子孫の文字列値を連結したものです。一方、ノードセットの文字列値は、ドキュメント順で最初にあるセット内のノードの文字列値です。
したがって、実際の違いは、文字列に変換するものとその変換がどのように行われるかです。