我的问题是关于XPath中的执行顺序。
我有一个表达式如:
//person[@created and customFunction(.)]
我的问题是我的自定义函数计算量很大,我只希望它在具有已创建属性集的节点上运行。在@created
之前始终会评估customFunction
吗?我可以做一个程序来测试这个,但实际上这样的实验的成功并不能保证,至少从长远来看是这样。
如果这是XPath实现的问题,我使用的是.NET 4.0。
答案 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 Expressions和XPath 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
返回节点参数的名称,如果您传递一个数字,它会引发错误,因此: