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
返回节点参数的名称,或者如果你传递它例如一个数字会引发错误,所以:
【讨论】:
【参考方案2】:你也可以改写成
//person[@created][customFunction(.)]
这种方式只对第一个谓词过滤掉的子集进行评估
【讨论】:
请注意,这在语义上是不同的(参见***.com/a/1006439/18771)。不过,在这种情况下,它没有任何区别。 这是一个实用的解决方法,谢谢!但是它并没有回答我最初的问题。以上是关于XPath 是不是对逻辑表达式进行短路评估?的主要内容,如果未能解决你的问题,请参考以下文章