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

时间:2013-08-22 16:29:53

标签: xpath .net-4.0 xmldocument

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

我有一个表达式如:

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

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

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

2 个答案:

答案 0 :(得分:3)

您也可以将其重写为

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

这种方式只能通过第一个谓词来评估子集过滤

答案 1 :(得分:3)

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

根据XPath 1.0 specs, section 3.4: booleans

  

表达式 [...] 如果左操作数,则不评估右操作数   评估为真

     

表达式 [...] 如果左操作数,则不评估右操作数   评估为假

根据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-expression可以返回   如果第一个表达式求值为true,则为true,并且它可以引发一个   如果第一个表达式的计算引发错误,则会出错。   类似地,如果第一个表达式,和表达式可以返回false   如果评估是错误的,则可能会引发错误   第一个表达式引发错误。由于这些规则,a   逻辑表达式在存在错误时不是确定性的,如   如下例所示。

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

true() or name(1234)

函数name返回节点参数的名称,如果您传递一个数字,它会引发错误,因此:

  • 如果在没有出现错误的情况下返回true,则实现会进行短路评估。
  • 如果出现错误,则实现不会进行短路评估(因为它已经评估了不需要的右操作数)。