「foo」を含む属性を選択するための正しい XPath は何ですか?
質問
この XML を考慮すると、XPath は、その要素を含むすべての要素を返します。 prop
属性に含まれる Foo
(最初の 3 つのノード):
<bla>
<a prop="Foo1"/>
<a prop="Foo2"/>
<a prop="3Foo"/>
<a prop="Bar"/>
</bla>
解決
//a[contains(@prop,'Foo')]
この XML を使用して結果を取得すると機能します。
<bla>
<a prop="Foo1">a</a>
<a prop="Foo2">b</a>
<a prop="3Foo">c</a>
<a prop="Bar">a</a>
</bla>
編集:もう 1 つ注意すべき点は、上記の XPath はその特定の XML に対して正しい答えを返しますが、要素 "bla" 内の "a" 要素のみを取得することを保証したい場合は、他の人が述べたように、次も使用する必要があることです。
/bla/a[contains(@prop,'Foo')]
これにより、「blah」要素にネストされているかどうかに関係なく、xml ドキュメント全体のすべての「a」要素が検索されます。
//a[contains(@prop,'Foo')]
私はこれを徹底するために、またスタックオーバーフローの精神に基づいて追加しました。:)
他のヒント
この XPath では、ノード名や属性名に関係なく、「Foo」を含む属性を持つすべてのノードが表示されます。
//attribute::*[contains(., 'Foo')]/..
もちろん、必ずしも親ノードではなく、属性自体の内容に興味がある場合は、/.. をドロップするだけです。
//attribute::*[contains(., 'Foo')]
descendant-or-self::*[contains(@prop,'Foo')]
または:
/bla/a[contains(@prop,'Foo')]
または:
/bla/a[position() <= 3]
分析した内容:
descendant-or-self::
軸 - その下のすべてのノードとノード自体を検索します。多くの場合、// よりもこれを言ったほうがよいでしょう。// が任意の場所 (ルート ノードの子孫または自身) を意味する実装をいくつか遭遇しました。もう 1 つはデフォルトの軸を使用します。
* or /bla/a
タグ - ワイルドカード一致、/bla/a は絶対パスです。
[contains(@prop,'Foo')] or [position() <= 3]
[ ]内の条件です。@prop は、attribute::prop の短縮形です。attribute は別の検索軸です。あるいは、position() 関数を使用して最初の 3 つを選択することもできます。
John C が最も近いですが、XPath では大文字と小文字が区別されるため、正しい XPath は次のようになります。
/bla/a[contains(@prop, 'Foo')]
次のようなことを試してみましたか?
//a[contains(@prop, "Foo")]
これまでに contains 関数を使用したことがありませんが、宣伝どおりに機能するはずだと疑っています...
リンク自体のコンテンツも一致させる必要がある場合は、text() を使用します。
//a[contains(@href,"/some_link")][text()="Click here"]
/bla/a[含む(@prop, "foo")]
上記のコードの場合...//*[contains(@prop,'foo')]
これを試して:
//a[contains(@prop,'foo')]
これはドキュメント内のすべての「a」タグで機能するはずです