web-dev-qa-db-ja.com

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

このXMLの場合、XPathは、prop属性にFoo(最初の3つのノード)が含まれるすべての要素を返します。

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
159
ripper234
//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>

編集:別の注意点は、上記のXPathはその特定のxmlの正しい答えを返しますが、要素「bla」の「a」要素のみを取得したい場合は、他の人が言及したように

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

これにより、「blah」要素にネストされているかどうかに関係なく、xmlドキュメント全体のすべての「a」要素が検索されます。

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

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

278
evilhomer

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

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

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

//attribute::*[contains(., 'Foo')]
22
Alex Beynenson
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の省略形です。属性は別の検索軸です。または、position()関数を使用して最初の3つを選択できます。

16
1729

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

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

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

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

4
DevDude

次のようなものを試しましたか:

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

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

4
toddk

/ bla/a [contains(@prop、 "foo")]

2
David Hill

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

1
digiguru

これを試して:

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

文書内の「a」タグに対して機能するはずです

1
Dani Duran