XPath-値と等しい要素の選択


109

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

そして私が特に興味を持っているのは、その値を持つ要素をどのように選択するです

XPath:

//*[.='qwerty']

非常に奇妙な予期しない結果が得られます。

Name    Value
aaa
bbb
ddd     qwerty
bbb     qwerty
aaa     qwerty
ccc     qwerty

誰かがこれらの結果を説明できますか、より期待される結果を得るためにXPath式を修正する方法はありますか?


1
XPath . =はXPath とは異なるためtext() =です。理由については、一致するテキストノードが一致する文字列値と異なるのを確認してください。
kjhughes 2017年

回答:


176

XPath仕様。要素の文字列値を、そのテキストノードのすべての子孫の(ドキュメント順の)連結として定義します

これは「奇妙な結果」を説明しています。

「より良い」結果は、以下の式を使用して取得できます。

//*[text() = 'qwerty']

上記は、値が 'qwerty'のテキストノードの子が少なくとも1つあるドキュメント内のすべての要素を選択します。

//*[text() = 'qwerty' and not(text()[2])]

上記は、テキストノードの子が1つだけあり、その値が 'qwerty'であるドキュメント内のすべての要素を選択します。


3
@iHeartGreek:機能してうれしい。受け入れ/賛成投票はどうですか?XPathでtext()可能なノードテストの 1つで、「これはテキストノードですか」を意味します。その他nodetestsはcomment()processing-instruction()、またはちょうどnode()
Dimitre Novatchev 2010

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