私はXPathを使用するのは初めてであり、これは基本的な質問かもしれません。どうかご容赦ください。問題の解決にご協力ください。次のようなXMLファイルがあります。
<RootNode>
<FirstChild>
<Element attribute1="abc" attribute2="xyz">Data</Element>
<FirstChild>
</RootNode>
<Element>
タグの存在を検証するには:
// Element [@ attribute1 = "abc"および@ attribute2 = "xyz"]
ここで、文字列"Data"
のタグの値も確認します。これを達成するために私は使用するように言われました:
// Element [@ attribute1 = "abc" and @ attribute2 = "xyz" and Data]
後の式を使用すると、次のエラーが表示されます。
アサーション失敗メッセージ:一致するノードがありません
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
私が使用したXPath式が有効であるかどうか、アドバイスをください。そうでない場合、有効なXPath式は何になりますか?
以下の条件:
//Element[@attribute1="abc" and @attribute2="xyz" and Data]
要素値データではなく、要素内の要素データの存在をチェックします。
代わりに使用できます
//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]
この答えを追加する理由は、.
とtext()
の関係を説明したいからです。
最初のことは、[]
を使用する場合、データには2つのタイプしかありません。
*[number]
*[bool]
は、ノードセットからノードセットをフィルタリングしますこの場合、値は関数boolean()
によってブール値に評価され、ルールがあります。
フィルターは常にコンテキストに関して評価されます。
text()
または.
を文字列"Data"
と比較する必要がある場合、最初にstring()
関数を使用してそれらを文字列型に変換し、ブール値の結果を取得します。
string()
には2つの重要なルールがあります。
string()
関数は、ノードセットの最初のノードの文字列値を返すことにより、ノードセットを文字列に変換します。場合によっては、予期しない結果が生じる可能性があります。
text()
は、["Data"]
のように、現在のノード(コンテキストノード)のすべてのテキストノードを含むノードセットを返す相対パスです。 string(["Data"])
によって評価されると、ノードセットの最初のノードが返されるため、ノードセットにテキストノードが1つしかない場合にのみ「データ」を取得します。
string()
関数ですべての子テキストを連結する場合は、ノードセットではなく単一のノードを渡す必要があります。
たとえば、ノードセット['a', 'b']
を取得し、そこに親ノードをstring(parent)
に渡すことができます。これは'ab'
を返し、原因のstring(.)
は連結文字列"Data"
を返します。
どちらの方法でも、テキストノードがある場合にのみ同じ結果が得られます。