XPath 性能 - 哪一个更好?

seb*_*t26 2 performance xpath

我有一个关于使用 XPath 时的性能问题的问题。

哪一个更好,为什么?(当然,如果是性能的话):

//A/B/C[@id="x"]/../..
Run Code Online (Sandbox Code Playgroud)

与

//A[B/C[@id="x"]] 
Run Code Online (Sandbox Code Playgroud)

G. *_*man 7

如果有的话,您会通过使用...来影响性能//...处理器很可能不会优化这样的表达式,并且会浪费时间寻找A元素作为元素的后代C,因为您要求它这样做。我在课堂上强调这一点,认为这是 XSLT 处理性能不佳的最常见原因之一(每次看到它在 StackOverflow 问题中被滥用时,我都会感到畏缩,但我会花一整天的时间谈论它,因为它使用得如此频繁) 。

至于A/B/C[@id='x']/../..和之间的区别A[B/C[@id="x"]],取决于处理器是否将前者重写为后者作为优化的一部分(因为它是声明性的)。

如果没有发生这样的优化,前者将比后者慢,因为前者要求处理器花时间收集所有C元素并在树上遍历备份,将每个元素的祖父母元素联合起来。而后一个表达式使用的谓词是作为节点集的数据类型的布尔 true()/false() 测试,并且处理器在第一次检测到此类时知道返回的布尔值是 true()C元素并且不需要查找任何其他C元素(也不应该查找任何其他C元素)。