Xpath では、特定の値に等しい要素を選択したいと考えています。
サンプル XML データ:
<aaa id="11" >
<aaa id="21" >
<aaa id="31" ></aaa>
<bbb id="32" >
<aaa id="41" ></aaa>
<bbb id="42" ></bbb>
<ccc id="43" ></ccc>
<ddd id="44" >qwerty</ddd>
<ddd id="45" ></ddd>
<ddd id="46" ></ddd>
</bbb>
</aaa>
<bbb id="22" >
<aaa id="33" >qwerty</aaa>
<bbb id="34" ></bbb>
<ccc id="35" ></ccc>
<ddd id="36" ></ddd>
<ddd id="37" ></ddd>
<ddd id="38" ></ddd>
</bbb>
<ccc id="23" >qwerty</ccc>
<ccc id="24" ></ccc>
</aaa>
ここで、XPath を使用します。
//ccc[.='qwerty']
正解です期待される結果:
Name Value
ccc qwerty
ここで、XPath を使用します。
//aaa[.='qwerty']
私は予想外の結果:
Name Value
aaa
aaa qwerty
そして私が特に興味を持っているのは、どれでもその値を持つ要素
パス:
//*[.='qwerty']
とても奇妙に感じる予想外の結果:
Name Value
aaa
bbb
ddd qwerty
bbb qwerty
aaa qwerty
ccc qwerty
これらの結果と、より期待される結果を得るために XPath 式を修正する方法を誰か説明してもらえますか?
ベストアンサー1
XPath仕様は、文字列値要素をそのすべてのテキストノードの子孫の連結(文書順)として表す。
これが「奇妙な結果」を説明します。
以下の式を使用すると、「より良い」結果が得られます。
//*[text() = 'qwerty']
上記は、ドキュメント内で値 'qwerty' を持つテキストノード子が少なくとも 1 つあるすべての要素を選択します。
//*[text() = 'qwerty' and not(text()[2])]
上記は、ドキュメント内でテキストノード子が 1 つだけあり、その値が「qwerty」であるすべての要素を選択します。