22

我有以下示例 XML 结构:

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

我需要做的是使用 XPATH 过滤“SavingAccount”节点,其中“ServiceOnline”的值为“yes”或“ServiceViaPhone”的值为“yes”。

XPATH 应该返回我两行!我可以过滤两个元素值都是“是”的“SavingAccount”节点,就像下面的 XPATH 示例一样,但我想要做的是或元素值比较???

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

3 回答 3

63

这是一个非常基本的 XPath 特性:用逻辑运算符 、 和函数 组成and许多or条件not()

and具有比关系相等运算符(、、、和)更高的优先级,并且or两个运算符的优先级都低于。=!=>>=&lt;&lt;=

因此,可以安全地编写A = B and C = D

一些最常见的错误

  1. 人们写AND和/或OR请记住,XPath 区分大小写

  2. 人们使用|(联合)运算符而不是or

最后,这是我的解决方案

/SavingAccounts/SavingAccount
           [ServiceOnLine='yes' 或 ServiceViaPhone='yes']

于 2009-01-23T14:27:42.283 回答
10
/SavingAccounts/SavingAccount[(ServiceOnLine='yes') or (ServiceViaPhone='yes')]
于 2009-01-23T14:07:38.890 回答
4

将要

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

做这个把戏?

目前我没有方便的 XPath 求值器。

编辑:
如果我没记错的话,你不需要 text(),所以

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

应该足够了,并且更具可读性。

编辑:
是的,当然,谓词表达式的“或”,我的错。

于 2009-01-23T14:07:38.890 回答