XPath:値に基づいて要素を選択する方法は?


221

XPathを使うのは初めてですが、これは基本的な質問かもしれません。親切に私に耐え、問題の解決を手伝ってください。次のようなXMLファイルがあります。

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

私は<Element>タグの存在を検証できます:

// Element [@ attribute1 = "abc" and @ attribute2 = "xyz"]

次に、stringのタグの値もチェックします"Data"。これを達成するために、私は使用するように言われました:

// Element [@ attribute1 = "abc" and @ attribute2 = "xyz" and Data]

後者の式を使用すると、次のエラーが発生します。

アサーションエラーメッセージ:一致するノードがありません //Element[@attribute1="abc" and @attribute2="xyz" and Data]

私が使用したXPath式が有効であるかどうかのアドバイスを提供してください。そうでない場合、有効なXPath式は何ですか?

回答:


329

以下の条件:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

Element内にエレメントDataの存在をチェックし、エレメント値Dataをチェックしません。

代わりに使用できます

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

25
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

私はこの答えを追加した理由は、私はとの関係を説明したいということである.text()

最初に使用[]するのは、2種類のデータのみです。

  1. [number] ノードセットからノードを選択するには
  2. [bool] ノードセットからノードセットをフィルタリングする

この場合、値はfunctionによってブール値に評価されboolean()、ルールがあります。

フィルターは常にコンテキストに関して評価されます。

文字列と比較しtext()たり.、文字列と比較したりする必要がある場合は"Data"、最初にstring()関数を使用して文字列型に変換し、ブール値の結果を取得します。

次の2つの重要なルールがありますstring()

  1. このstring()関数は、ノードセットの最初のノードの文字列値を返すことにより、ノードセットを文字列に変換します。これにより、予期しない結果が生じる場合があります。

    text()のように、現在のノード(コンテキストノード)のすべてのテキストノードを含むノードセットを返す相対パスです["Data"]。によって評価されるとstring(["Data"])、ノードセットの最初のノードが返されるため、ノードセットにテキストノードが1つしかない場合にのみ「データ」を取得します。

  2. 必要に応じてstring()機能は、すべての子テキストを連結するために、あなたは、代わりにノードセットの単一のノードを渡す必要があります。

    たとえば、ノードセットを取得し、['a', 'b']そこに親ノードを渡すことができますstring(parent)。これはを返し'ab'string(.)場合によっては連結された文字列を返します"Data"

どちらの方法でも、テキストノードがある場合にのみ同じ結果が得られます。

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