【发布时间】:2017-03-09 08:58:00
【问题描述】:
这个问题专门关于在 XSLT 2.0 和 Saxon 中使用 XPath。
以[1] 结尾的XPaths
对于 XPath 之类的
following-sibling::foo[1]
descendant::bar[1]
我想当然地认为,Saxon 不会遍历整个轴,而是在找到第一个匹配节点时停止 - 在以下情况下至关重要:
following-sibling::foo[some:expensivePredicate(.)][1]
我认为这样的 XPath 也是如此:
(following-sibling::foo/descendant::bar)[1]
即Saxon 不会在选择集合中的第一个节点之前编译与 following-sibling::foo/descendant::bar 匹配的整个节点集。相反,它会(即使对于链式轴)在第一个匹配节点处停止。
以[last()] 结尾的XPaths
现在变得有趣了。当在树中“倒退”时,我假设 XPaths 像
preceding-sibling::foo[1]
工作效率与 following-sibling 等效。但是当链接轴时会发生什么,例如
(preceding-sibling::foo/descendant::bar)[last()]
因为我们需要在这里使用[last()] 而不是[1],
- Saxon 是否会编译整个节点集以计算它们以获得
last()的数值? - 或者它会很聪明,在找到匹配的后代时停止迭代
preceding-sibling轴? - 或者它会更聪明并反向迭代
descendant轴以更有效地找到最后一个后代?
【问题讨论】: