XPath - 値に等しい要素を選択する 質問する

XPath - 値に等しい要素を選択する 質問する

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」であるすべての要素を選択します。

おすすめ記事