在XSLT处理中,apply-template和call-template之间是否存在性能差异?在我的样式表中有很多我可以使用的实例,这是最好的选择吗?
答案 0 :(得分:57)
与所有性能问题一样,答案取决于您的特定配置(特别是您正在使用的XSLT处理器)以及您正在进行的处理类型。
<xsl:apply-templates>
接受一系列节点并逐个浏览。对于每个模板,它定位具有与节点匹配的最高优先级的模板,并调用它。因此,<xsl:apply-templates>
就像<xsl:for-each>
内部<xsl:choose>
,但更模块化。
相反,<xsl:call-template>
按名称调用模板。上下文节点没有变化(没有<xsl:for-each>
),也没有选择使用哪个模板。
因此,在完全相同的情况下,您可能会认为<xsl:call-template>
会更快,因为它的工作量更少。但是,如果您处于可以使用<xsl:apply-templates>
或<xsl:call-template>
的情况,您可能会在XSLT中自己执行<xsl:for-each>
和<xsl:choose>
,而不是处理器为你做的,在幕后。所以最后我猜它可能会平衡。但正如我所说,这在很大程度上取决于您的处理器所采用的优化程度以及您正在进行的处理。测量并查看。
关于何时使用匹配模板以及何时使用命名模板的经验法则是:
<xsl:apply-templates>
和匹配模板;如果需要以多种不同的方式处理特定节点(例如在目录与文档正文中),则使用模式<xsl:call-template>
和命名模板<xsl:function>
答案 1 :(得分:10)
apply-template和call-template不执行相同的任务,性能比较在这里并不重要。 call-template将模板名称作为参数,而apply-template采用xpath表达式。因此,应用模板功能更强大,因为您实际上并不知道将执行哪个模板。 如果使用复杂的xpath表达式,则会出现性能问题。在xpath表达式中避免使用“//”,因为将评估输入文档的每个节点。
答案 2 :(得分:4)
它可能取决于您使用的xml解析器。除了.NET 2003解析器之外,我不能说任何事情,我在push vs pull XSLT代码上进行了一些非正式的性能测试。这与您的要求类似:apply-template = push和call-template = pull。我确信推动会更快,但事实并非如此。这是关于平等的。
抱歉,我现在没有准确的测试。我建议您使用您选择的解析器进行尝试,看看是否有任何重大差异。我的赌注是不会有。