首页 > 解决方案 > 与 XPath 表达式相比,非流模式下的 XSLT 3 累加器是否提供性能优势?

问题描述

假设我有一个这样的文件:

<persons>
  <person age="14" name="John"/>
  <person age="23" name="Rob"/>
  ...
</persons>

我想找到列表中最年轻的人。

看来我可以用一个普通的 XPath 表达式(类似//person[@age=min(//person/@age)])来做到这一点。在 XSLT 3 中,我还可以像这样编写一个累加器:

<xsl:accumulator name="acc" initial-value="()">
   <xsl:accumulator-rule match="person" select="if(@age &lt; $value/@age) then . else $value"/>
</xsl:accumulator>

然后accumulator-after('acc')在我需要的时候打电话。

在非流媒体环境中,使用一个比另一个有好处吗?我认为,至少,使用累加器可以使我免于编写可能效率低下的 XPath 表达式。或者一个复杂的 XPath 处理器(在我的例子中是 Saxon)是否会将查询优化为相当于使用累加器,因此我如何做到这一点并不重要?

标签: xsltsaxon

解决方案


累加器可能比常规 XPath 表达式更快的情况是,您需要为文档中的许多节点计算一些值(例如,节号或年初至今的总数),以及 node 的值N 可以方便地表示为较早节点的值的函数。xsl:number 是一个经典案例。但是您也可以使用 XSLT 3.0 备忘录函数来实现这一点。

如果您的 XPath 表达式使用前面的轴,那么这是累加器可能提供帮助的信号。


推荐阅读