在XSLT处理中,apply-template和call-template之间有性能差异吗?在我的样式表中有很多情况我可以使用其中任何一个,哪个是最好的选择?
与所有性能问题一样,答案取决于您的特定配置(特别是您正在使用的 XSLT 处理器)以及您正在执行的处理类型。
<xsl:apply-templates>
获取一系列节点并逐一遍历它们。对于每个模板,它都会找到与该节点匹配的具有最高优先级的模板,并调用它。所以<xsl:apply-templates>
就像一个<xsl:for-each>
与<xsl:choose>
内部,但更加模块化。
相比之下,<xsl:call-template>
按名称调用模板。上下文节点没有变化(没有<xsl:for-each>
)并且无法选择使用哪个模板。
所以在完全相同的情况下,你可能会想象<xsl:call-template>
会更快,因为它做的工作更少。但如果你处于以下任一情况<xsl:apply-templates>
or <xsl:call-template>
可以使用,你可能会这样做<xsl:for-each>
and <xsl:choose>
您自己,在 XSLT 中,而不是处理器在幕后为您做这件事。所以最终我猜测它可能会平衡。但正如我所说,这在很大程度上取决于您的处理器已实施的优化类型以及您正在执行的处理。测量一下看看。
我关于何时使用匹配模板以及何时使用命名模板的经验法则是:
- use
<xsl:apply-templates>
如果您正在处理单个节点以创建结果,则需要匹配模板;如果需要以多种不同方式处理特定节点(例如在目录与文档正文中),请使用模式
- use
<xsl:call-template>
以及命名模板(如果您正在处理除单个节点之外的其他内容),例如字符串、数字或节点集
- (在 XSLT 2.0 中)使用
<xsl:function>
如果您返回原子值或现有节点
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)