Xpath 多个 AND OR 运算符

Jas*_*lan 0 xml xpath predicate

您好,我尝试使用 xpath 和多个 AND OR 运算符来选择 XML 项目,但没有成功。

我需要过滤某个字段等于某个值以及一个或多个其他字段等于另一个值的位置,例如。

field1[contains[value1]] and field2[contains[value2]] or field3[contains[value3]] or field4[contains[value4]]
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,这仍然给出字段 1 不包含 value1 的结果,因为 field3 包含 value3。我需要它仅在 field1 确实包含 value1 并且任何一个或多个其他字段包含相应的值时才给出结果。

这就是我目前所拥有的(注意方括号中的一些元素是变量)... //item[SubCategory[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),translate('[data:row("Title")]', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))] and Group[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),translate('[session:naroomaShown]', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]|Group[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),translate('[session:moruyaShown]', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]|Group[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),translate('[session:batemansShown]', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]]

Ian*_*rts 5

and运算符比 XPath 中的绑定更紧密(请参阅规范中 \xc2\xa73.4or末尾的注释),因此

\n\n
cond1 and cond2 or cond3 or cond4\n
Run Code Online (Sandbox Code Playgroud)\n\n

被视为

\n\n
(cond1 and cond2) or cond3 or cond4\n
Run Code Online (Sandbox Code Playgroud)\n\n

您需要使用显式括号来控制优先级

\n\n
cond1 and (cond2 or cond3 or cond4)\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,正如 Tomalak 在评论中指出的,|实际上并不是 XPath 中的布尔 OR 运算符,而是节点集之间的并集运算符。在这种特殊情况下,它不会产生差异,因为对于节点集 X 和 Y,布尔值X or Y(==“X 不为空或 Y 不为空或两者”) 将与布尔值相同of X | Y(== "X 中所有节点和 Y 中所有节点的并集不为空") 但它们是不同的运算符。

\n