【问题标题】: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>

标签: xpath .net-4.0 xmldocument


【解决方案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 ExpressionsXPath 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(.)]
    

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

    【讨论】:

    • 请注意,这在语义上是不同的(参见stackoverflow.com/a/1006439/18771)。不过,在这种情况下,它没有任何区别。
    • 这是一个实用的解决方法,谢谢!但是它并没有回答我最初的问题。
    猜你喜欢
    • 2012-01-18
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2012-02-03
    相关资源
    最近更新 更多