「foo」を含む属性を選択するための正しいXPathは何ですか?


176

このXMLの場合、どのXPathがprop属性を含むすべての要素を返しますかFoo(最初の3つのノード):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>

1
なぜ誰もが「prop」属性を見ているのですか?私は何か見落としてますか?最初の3つのノードを取得するだけです。

6
誰もがprop属性を見ているのはそれが求められているからです。propに "Foo"が含まれるすべてのノードを取得します。<a prop="Foo5"を追加/>そして、あなたはそれだけで「最初の3つのノード」ではありません、なぜでしょう...
erlando

本文にある質問は、タイトルに関係なく、あいまいです。fooは本当に任意のprop属性に入れることができますか、それとも真剣に最初の3つのノードが欲しいだけですか?

3
はい、タイトルを参照してください(そして自由に編集してください)。
ripper234 2009

大文字と小文字を区別しない比較が必要な場合は、 find-an-element-whose-attribute-contains-a-text-case-insensitively
Michael Freidgeim

回答:


307
//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')]  

徹底とスタックオーバーフローの精神でこれを追加しました。:)


3
xmlme.com現在、他のホストにリダイレクトし、ツールやそのようなものをホストしているようには見えません。
jpmc26 2017

26

このXPathは、ノード名または属性名に関係なく、「Foo」を含む属性を持つすべてのノードを提供します。

//attribute::*[contains(., 'Foo')]/..

もちろん、属性の内容にもっと興味があり、必ずしも親ノードに興味がない場合は、/をドロップするだけです。

//attribute::*[contains(., 'Foo')]

2
すべてのノード//@*[contains(., 'Foo')]
aliopi 2017年

16
descendant-or-self::*[contains(@prop,'Foo')]

または:

/bla/a[contains(@prop,'Foo')]

または:

/bla/a[position() <= 3]

解剖:

descendant-or-self::

Axis-下にあるすべてのノードとノード自体を検索します。多くの場合、これは//よりも優れています。//がどこでも(ルートノードの子孫または自己)を意味するいくつかの実装に遭遇しました。もう1つはデフォルトの軸を使用します。

* or /bla/a

タグ-ワイルドカード一致。/bla/aは絶対パスです。

[contains(@prop,'Foo')] or [position() <= 3]

[]内の条件。@propはattribute :: propの省略形です。attributeは別の検索軸だからです。または、position()関数を使用して最初の3つを選択することもできます。


6

John Cが最も近いですが、XPathでは大文字と小文字が区別されるため、正しいXPathは次のようになります。

/bla/a[contains(@prop, 'Foo')]

4

あなたは次のようなことを試しましたか?

// a [contains(@prop、 "Foo")]

私は以前にcontains関数を使用したことがありませんが、宣伝どおりに機能するはずです...


@toddk ...存在しない属性@fooをターゲットにしました。@propをターゲットにしたい;-)
Metro Smurf

4

リンク自体のコンテンツも一致させる必要がある場合は、text()を使用します。

//a[contains(@href,"/some_link")][text()="Click here"]



1

上記のコードの場合... // * [contains(@ prop、 'foo')]


これはfooが含まれるすべての要素に対するものですが、属性は「prop」である必要があります
digiguru

1

これを試して:

// a [contains(@ prop、 'foo')]

ドキュメント内の「a」タグで機能するはずです

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