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

xsl:call-template 用于在 XSLT 中显式调用一个已定义的命名模板(xsl:template),它不依赖匹配规则,而是靠名字触发,适合复用逻辑、封装通用处理过程。
必须配合 name 属性使用
被调用的模板必须用 name 属性定义名称,不能只靠 match。例如:
这个模板无法通过 apply-templates 自动匹配,只能靠 call-template 主动调用。
支持传参:用 xsl:with-param
调用时可向模板传递参数,参数名需与模板内 xsl:param 一致:
- 若未传参,且
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 结构的遍历处理