5

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

我有一个表达式,例如:

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

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

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

4

2 回答 2

4

XPath 1.0 进行短路评估,在 XPath 2.0 和 XPath 3.0 中它是 implementation-dependent

根据XPath 1.0 规范,第 3.4 节: booleans

一个or表达式[...]如果左操作数的计算结果为 true ,则不计算右操作数

一个and表达式[...]如果左操作数的计算结果为 false ,则不计算右操作数

根据XPath 2.0 规范,第 3.6 节:逻辑表达式XPath 3.0 规范,第 3.8 节:逻辑表达式

如果 XPath 1.0 兼容模式为 true [...] ,则定义当不需要评估第二个操作数以确定结果时,不会因评估第二个操作数而发生错误

如果 XPath 1.0 兼容模式为 false,则计算逻辑表达式的操作数的顺序取决于实现。在这种情况下,如果计算的第一个表达式为真,则 or 表达式可以返回真,并且如果对第一个表达式的计算引发错误,它会引发错误。类似地,如果评估的第一个表达式为 false,and-expression 可以返回 false,如果第一个表达式的评估引发错误,它会引发错误。由于这些规则,逻辑表达式在存在错误的情况下是不确定的,如下面的示例所示。

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

true() or name(1234)

该函数name返回节点参数的名称,或者如果您将其传递给例如数字,则会引发错误,因此:

  • 如果它返回 true 而没有出现错误,那么实现会进行短路评估。
  • 如果引发错误,则实现不会进行短路评估(因为它已经评估了不必要的正确操作数)。
于 2015-06-20T13:04:09.173 回答
3

您也可以将其重写为

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

这样,它只被评估为通过第一个谓词过滤掉的子集

于 2013-08-22T16:45:12.047 回答