XPath 是不是对逻辑表达式进行短路评估?

Posted

技术标签:

【中文标题】XPath 是不是对逻辑表达式进行短路评估?【英文标题】:Does XPath do short-circuit evaluation of logical expressions?XPath 是否对逻辑表达式进行短路评估? 【发布时间】:2013-08-25 12:27:46 【问题描述】:

我的问题是关于 XPath 中的执行顺序。

我有这样一个表达式:

//person[@created and customFunction(.)]

我的问题是我的自定义函数计算量很大,我只希望它在具有 created 属性集的节点上运行。 @created 是否总是在 customFunction 之前被评估?我可以编写一个程序来测试这一点,但实际上这种实验的成功并不能保证,至少从长远来看是这样。

如果这是 XPath 实现的问题,我使用的是 .NET 4.0。

【问题讨论】:

我知道这是一个老问题,但我认为我的新答案正是您要寻找的。​​span> 【参考方案1】:

XPath 1.0 进行短路评估,在 XPath 2.0 和 XPath 3.0 中它依赖于实现

根据XPath 1.0 specs, section 3.4: booleans:

or 表达式 [...] 如果左操作数不计算右操作数 计算结果为真

and 表达式 [...] 如果左操作数不计算右操作数 计算结果为假

根据XPath 2.0 specs, section 3.6: Logical Expressions和XPath 3.0 specs, section 3.8: Logical Expressions:

如果 XPath 1.0 兼容模式为真 [...] 定义当不需要计算第二个操作数以确定结果时,则不 计算第二个操作数可能会导致错误

如果 XPath 1.0 兼容模式为 false,则 逻辑表达式的操作数被评估为 依赖于实现。在这种情况下,一个 or 表达式可以返回 如果评估的第一个表达式为真,则为真,并且它可以引发 如果对第一个表达式的评估引发错误,则错误。 类似地,如果第一个表达式,and 表达式可以返回 false 评估为假,如果评估 第一个表达式引发错误。由于这些规则,一个 存在错误时,逻辑表达式不是确定性的,因为 如下例所示。

使用 XPath 2.0 或 XPath 3.0 时,您可以通过评估以下示例表达式来了解当前实现是否进行短路评估:

true() or name(1234)

函数name返回节点参数的名称,或者如果你传递它例如一个数字会引发错误,所以:

如果它返回 true 而没有出现错误,则实现会进行短路评估。 如果引发错误,则实现不会进行短路评估(因为它评估了不必要的正确操作数)。

【讨论】:

【参考方案2】:

你也可以改写成

//person[@created][customFunction(.)]

这种方式只对第一个谓词过滤掉的子集进行评估

【讨论】:

请注意,这在语义上是不同的(参见***.com/a/1006439/18771)。不过,在这种情况下,它没有任何区别。 这是一个实用的解决方法,谢谢!但是它并没有回答我最初的问题。

以上是关于XPath 是不是对逻辑表达式进行短路评估?的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符可以等效于与逻辑运算符的短路吗?

短路逻辑评估运算符

单线逻辑或短路评估的 AHK 等效项是啥?

在 Haskell 中为逻辑表达式生成真值表

看过来,这里有JavaScript技术干货?

c中的内部短路评估