我的问题是关于 XPath 中的执行顺序。
我有一个表达式,例如:
//person[@created and customFunction(.)]
我的问题是我的自定义函数计算量很大,我只希望它在具有创建属性集的节点上运行。会@created
一直被评价过customFunction
吗?我可以编写一个程序来测试这一点,但实际上这种实验的成功并不能保证,至少从长远来看不能。
如果这是 XPath 实现的问题,我使用的是 .NET 4.0。
我的问题是关于 XPath 中的执行顺序。
我有一个表达式,例如:
//person[@created and customFunction(.)]
我的问题是我的自定义函数计算量很大,我只希望它在具有创建属性集的节点上运行。会@created
一直被评价过customFunction
吗?我可以编写一个程序来测试这一点,但实际上这种实验的成功并不能保证,至少从长远来看不能。
如果这是 XPath 实现的问题,我使用的是 .NET 4.0。
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
返回节点参数的名称,或者如果您将其传递给例如数字,则会引发错误,因此:
您也可以将其重写为
//person[@created][customFunction(.)]
这样,它只被评估为通过第一个谓词过滤掉的子集