xslt - 与 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 < $value/@age) then . else $value"/>
</xsl:accumulator>
然后accumulator-after('acc')
在我需要的时候打电话。
在非流媒体环境中,使用一个比另一个有好处吗?我认为,至少,使用累加器可以使我免于编写可能效率低下的 XPath 表达式。或者一个复杂的 XPath 处理器(在我的例子中是 Saxon)是否会将查询优化为相当于使用累加器,因此我如何做到这一点并不重要?
解决方案
累加器可能比常规 XPath 表达式更快的情况是,您需要为文档中的许多节点计算一些值(例如,节号或年初至今的总数),以及 node 的值N 可以方便地表示为较早节点的值的函数。xsl:number 是一个经典案例。但是您也可以使用 XSLT 3.0 备忘录函数来实现这一点。
如果您的 XPath 表达式使用前面的轴,那么这是累加器可能提供帮助的信号。
推荐阅读
- c# - 尝试使用在 Powershell 中使用 New-PSDrive 创建的路径时出现“URL 上的目录无效”
- javascript - 在 java servlet 中生成动态网页
- compression - 关于压缩的粗略想法
- xml - XML Text() 节点得到“修剪”的 SNOWFLAKE 问题
- javascript - 如何启用内联执行(chrome 扩展)
- html - 如何防止背景中的图像在模态模式下放大?
- file - 未创建卷曲输出文件
- javascript - Asp.net MVC:将值从 webgrid 文本框列传递到控制器
- java - Oracle 时间戳值未转换为 java 日期时间
- c# - 如何在 Visual Studio 2013 中安装 MongoDB.Driver