性能:call-template vs apply-template

33 xslt

在XSLT处理中,apply-template和call-template之间是否存在性能差异?在我的样式表中有很多我可以使用的实例,这是最好的选择吗?

Jen*_*niT 58

与所有性能问题一样,答案取决于您的特定配置(特别是您正在使用的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>也可以使用,你可能会做的<xsl:for-each><xsl:choose>自己,在XSLT,而不是处理器这样做是为了你,在幕后.所以最后我猜它可能会平衡.但正如我所说,这在很大程度上取决于您的处理器所采用的优化程度以及您正在进行的处理.测量它,看看.

关于何时使用匹配模板以及何时使用命名模板的经验法则是:

  • <xsl:apply-templates>如果您正在处理单个节点以创建结果,请使用和匹配模板; 如果需要以多种不同方式处理特定节点(例如在目录与文档正文中),请使用模式
  • <xsl:call-template>如果您正在处理单个节点以外的其他内容,例如字符串或数字或节点集,请使用和命名模板
  • (在XSLT 2.0中)使用,<xsl:function>如果您返回原子值或现有节点


Ale*_*oor 10

apply-template和call-template不执行相同的任务,性能比较在这里并不重要.call-template将模板名称作为参数,而apply-template采用xpath表达式.因此,应用模板功能更强大,因为您实际上并不知道将执行哪个模板.如果使用复杂的xpath表达式,则会出现性能问题.避免在xpath表达式中使用"//",因为将评估输入文档的每个节点.