web-dev-qa-db-ja.com

XPATH複数要素フィルター

次のサンプルXML構造があります。

<SavingAccounts>
    <SavingAccount>
       <ServiceOnline>yes</ServiceOnline>
       <ServiceViaPhone>no</ServiceViaPhone>
    </SavingAccount>
    <SavingAccount>
       <ServiceOnline>no</ServiceOnline>
       <ServiceViaPhone>yes</ServiceViaPhone>
    </SavingAccount>
</SavingAccounts>

「ServiceOnline」の値が「yes」または「ServiceViaPhone」の値が「yes」であるXPATHを使用して「SavingAccount」ノードをフィルタリングする必要があります。

XPATHは2行を返すはずです!!次のXPATHサンプルのように、両方の要素値が「はい」である「SavingAccount」ノードをフィルタリングできますが、実行したいのは、または要素値の比較ですか?

/SavingAccounts/SavingAccount/ServiceOnline[text()='yes']/../ServiceViaPhone[text()='yes']/..
21
CroweMan

これは非常に基本的なXPath機能です:論理演算子 andor 、および関数 not()

andorよりも優先度が高く、両方の演算子は よりも優先度が低くなります) Relational および equality 演算子(=!=>>=&lt;および&lt;=)。

だから、書くのは安全ですA = B and C = D

最も頻繁に犯されたいくつかの間違い

  1. 人々はANDORを書きます。 XPathでは大文字と小文字が区別されることに注意してください

  2. 人々は|(共用体)演算子の代わりにor

最後に、これが私の解決策です


/SavingAccounts/SavingAccount 
 [ServiceOnLine = 'yes' or ServiceViaPhone = 'yes'] 
56
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]
10
AnthonyWJones

意志

/SavingAccounts/SavingAccount[ServiceOnline/text()='yes' or ServiceViaPhone/text()='yes']

トリック?

現在、XPathエバリュエーターはありません。

編集:
私が正しく覚えていれば、text()は必要ないので、

[ServiceOnline='yes' or ServiceViaPhone='yes']

十分で読みやすいはずです。

編集:
はい、もちろん、「または」、述語式の場合、私の悪いです。

4
falstro