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

Mar*_*cus 5 xpath xmldocument .net-4.0

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

我有一个表达式,例如:

//person[@created and customFunction(.)]
Run Code Online (Sandbox Code Playgroud)

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

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

ser*_*oFC 4

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

根据XPath 1.0 规范,第 3.4 节:布尔值

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

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

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

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

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

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

true() or name(1234)
Run Code Online (Sandbox Code Playgroud)

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

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