<xsl:call-template> 与在传统编程语言中调用函数非常相似。您可以在XSLT中定义函数,例如这种简单的输出字符串的函数。<xsl:template name="dosomething"> <xsl:text>A function that does something</xsl:text></xsl:template>可以通过调用此函数<xsl:call-template name="dosomething">。<xsl:apply-templates>略有不同,它是XSLT的真正功能:它接受任意数量的XML节点(无论您在select属性中定义的是什么),都对它们进行迭代(这很重要:apply-templates就像一个循环!)并找到匹配的模板对于他们:<!-- sample XML snippet --><xml> <foo /><bar /><baz /></xml><!-- sample XSLT snippet --><xsl:template match="xml"> <xsl:apply-templates select="*" /> <!-- three nodes selected here --></xsl:template><xsl:template match="foo"> <!-- will be called once --> <xsl:text>foo element encountered</xsl:text></xsl:template><xsl:template match="*"> <!-- will be called twice --> <xsl:text>other element countered</xsl:text></xsl:template>这样,您就可以放弃对XSLT处理器的一点控制-不必确定程序流向何处,而是可以通过为当前正在处理的节点找到最合适的匹配项来实现。如果多个模板可以匹配一个节点,则具有更具体匹配表达式的模板将获胜。如果存在多个具有相同特异性的匹配模板,则最后声明的一个为准。您可以将更多的精力放在开发模板上,而花费更少的时间进行“管道”。您的程序将变得更强大,更模块化,更少嵌套和更快(因为XSLT处理器针对模板匹配进行了优化)。XSLT可以理解的一个概念是“当前节点”的概念。随着<xsl:apply-templates>当前节点与每个迭代上移动,而<xsl:call-template>不会改变当前节点。即,.被调用模板中的指代与.调用模板中相同的节点。套用范本不是这种情况。这是基本区别。模板还有其他一些方面会影响其行为:mode和priority,模板可以同时具有name和match。模板是否已导入(<xsl:import>)也都会产生影响。这些是高级用途,您可以在到达那里时进行处理。