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

StackOverflow https://stackoverflow.com/questions/103325

  •  01-07-2019
  •  | 
  •  

質問

この 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」タグで機能するはずです

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top