将 OR 推入节点检查

Pushing an OR into the node check

要在两个不同的节点上执行 OR,我可以执行以下操作:

//C:Year[not(@value="2019")] | //R:Year[not(@value="2019")]

然而,如果有一个长表达式,这会变得有点笨拙,尤其是当有超过 2 个 OR 时。有没有办法做类似下面的事情:

//(C:Year or R:Year)[not(@value="2019")]

基本上,是否可以在节点测试本身中放置一个 OR,而不是评估完整的 axis-node-predicate 表达式并对整个内容进行 OR 运算。

这(仅)适用于 XPath 2.0+

//(C:Year | R:Year)[not(@value="2019")]

但是,不幸的是,不在 XPath 1.0 中。

W3C XPath 1.0 language reference 3.1 下的状态:

Parentheses may be used for grouping.

[14] Expr        ::= OrExpr   
[15] PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall

然而 /steps/ (*StepExpr) 没有提到。

但是 XPath 2.0 参考指出:

Parentheses must be used when "/" is used on the left hand side of an operator, as in "(/) * 5".

有了这个提示,我想出了这个也适用于 XPath 1.0 的查询:

((//C:Year)|(//C:Year))[not(@value="2019")]

因此,v2+ 更灵活,但适用相同的原则。 Gustafson、M. Kay 和其他人讨论了 XPath 2.0 bug long this lines leading to Errata XP.E3。 D.张伯伦:

On July 31, 2007, the Query and XSLT working groups agreed to add parentheses to the expansions of leading-/ and leading-// in path expressions, as suggested by this bug report. The revised expansions will appear in a future errata document. Regards, Don Chamberlin (for the joint working groups)