在 XSLT 处理中,apply-template 和 call-template 之间是否存在性能差异?在我的样式表中,我可以使用许多实例,哪个是最佳选择?
3 回答
与所有性能问题一样,答案将取决于您的特定配置(特别是您使用的 XSLT 处理器)和您正在执行的处理类型。
<xsl:apply-templates>
获取一系列节点并一个接一个地遍历它们。对于每一个,它找到与节点匹配的具有最高优先级的模板,并调用它。所以<xsl:apply-templates>
就像一个<xsl:for-each>
有<xsl:choose>
内部但更模块化的东西。
相反,<xsl:call-template>
按名称调用模板。上下文节点(no <xsl:for-each>
)没有变化,也没有选择使用哪个模板。
因此,在完全相同的情况下,您可能会想象这<xsl:call-template>
会更快,因为它做的工作更少。但是,如果您处于使用其中之一<xsl:apply-templates>
或<xsl:call-template>
可以使用的情况,那么您可能会在 XSLT<xsl:for-each>
中<xsl:choose>
自己做这件事,而不是处理器在幕后为您做这件事。所以最后我猜它可能会平衡。但正如我所说,这在很大程度上取决于您的处理器已实施的优化类型以及您正在执行的处理。测量一下看看。
关于何时使用匹配模板以及何时使用命名模板,我的经验法则是:
<xsl:apply-templates>
如果您正在处理单个节点以创建结果,请使用和匹配模板;如果需要以多种不同方式处理特定节点(例如在目录与文档正文中),则使用模式<xsl:call-template>
如果您要处理的不是单个节点,例如字符串、数字或节点集,请使用和命名模板- (在 XSLT 2.0 中)
<xsl:function>
在返回原子值或现有节点时使用
apply-template 和 call-template 不执行相同的任务,性能比较在这里并不重要。call-template 采用模板名称作为参数,而 apply-template 采用 xpath 表达式。Apply-template 因此功能更强大,因为您并不真正知道将执行哪个模板。如果您使用复杂的 xpath 表达式,您将遇到性能问题。避免在 xpath 表达式中使用“//”,因为将评估输入文档的每个节点。
它可能取决于您使用的 xml 解析器。除了 .NET 2003 解析器,我什么都不能说,我在其中对推送和拉取XSLT 代码进行了一些非正式的性能测试。这与您要问的类似:apply-template = push 和 call-template = pull。我确信 push 会更快,但事实并非如此。差不多了。
对不起,我现在没有确切的测试。我建议使用您选择的解析器进行尝试,看看是否有任何重大差异。我敢打赌不会有。