xsl:call-template用于显式调用命名模板,依赖name属性而非match匹配,支持传参(xsl:with-param)、默认值及空序列处理,不支持自身递归,适用于工具函数类逻辑;而xsl:apply-templates基于匹配规则声明式分发,适用于结构化遍历。

xsl:call-template 用于在 XSLT 中显式调用一个已定义的命名模板(xsl:template),它不依赖匹配规则,而是靠名字触发,适合复用逻辑、封装通用处理过程。
必须配合 name 属性使用
被调用的模板必须用 name 属性定义名称,不能只靠 match。例如:
<xsl:template name="format-date"> <xsl:param name="date" /> <xsl:value-of select="concat(substring($date,1,4), '-', substring($date,5,2), '-', substring($date,7,2))" /> </xsl:template>
这个模板无法通过 apply-templates 自动匹配,只能靠 call-template 主动调用。
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
支持传参:用 xsl:with-param
调用时可向模板传递参数,参数名需与模板内 xsl:param 一致:
<xsl:call-template name="format-date"> <xsl:with-param name="date" select="@pubDate" /> </xsl:call-template>
- 若未传参,且
xsl:param设有select默认值,则取默认值 - 若未传参也无默认值,参数值为
empty sequence(空序列) - 参数按名称绑定,不按顺序,所以名称拼写必须完全一致
不能递归调用自身(除非用 xsl:apply-templates)
xsl:call-template 不支持直接递归(即模板里再 call 自己的名字),XSLT 1.0/2.0 均会报错。如需递归,应改用 apply-templates 配合 match + 条件终止,或用 XSLT 3.0 的 xsl:iterate 或函数(xsl:function)替代。
和 xsl:apply-templates 的核心区别
-
call-template是“命令式”调用:你指定名字,它就执行,不关心当前上下文节点是否匹配 -
apply-templates是“声明式”分发:根据当前节点,查找匹配的match模板,自动选择并应用 - 前者适合工具函数类逻辑(如格式化、计算、生成固定结构),后者适合基于 XML 结构的遍历处理









