【发布时间】:2021-05-30 08:18:51
【问题描述】:
假设我有一个这样的文档:
<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 < $value/@age) then . else $value"/>
</xsl:accumulator>
然后在我需要的时候拨打accumulator-after('acc')。
在非流媒体环境中,使用其中一个是否有好处?我认为,至少,使用累加器可以使我免于编写可能效率低下的 XPath 表达式。或者一个复杂的 XPath 处理器(在我的例子中是 Saxon)是否会将查询优化为相当于使用累加器,因此我如何做到这一点并不重要?
【问题讨论】: