只有 name 属性的 xsl:template 和 xsl:function 有什么区别

What are the differences between xsl:template which has only name attribute and xsl:function

我发现它们都可以带参数调用,return xsl:value-ofxsl:sequence,但有什么区别?什么情况下应该用一个代替另一个更好?它们在大量使用时会出现小的性能问题吗?

非常感谢。

顺便说一句:我的 XSLT 处理器是 saxon-he 9.8+。

恕我直言,有几点不同:

  • 您可以在 XPath 中使用 XSL 函数。使用模板无法做到这一点。
  • 您需要显式调用函数。隐式应用模板(不需要 call-template
  • 早期版本的 XSL 支持模板

关于性能:在您确定性能问题之前,请不要打扰。正如 Donald Knuth 所说:"Premature optimization is the root of all evil"。只使用最适合该目的的任何东西。

还有一些重要的区别是:

XSLT 是一种双语系统; XSLT 和 XPath 共享相同的数据模型,但它们不是完全可组合的。您可以在 XSLT 指令中嵌套 XPath 表达式,但不能反过来。

为了弥补可组合性的不足,许多 "flow of control" 操作在两种语言中是重复的。 XSLT 有条件指令,XPath 有条件表达式。 XSLT 有一个映射运算符 (xsl:for-each),XPath 也有 (!)。 XSLT 可以声明变量 (xsl:variable),XPath 也可以 (let)。 XSLT 有调用机制(xsl:call-template),XPath(函数调用)也有。这些重复的存在是为了减少为常见的简单任务在两种语言之间切换的不便。函数调用和命名模板之间的双重性只是一个例子。

更具体地说,xsl:function 是在 XSLT 2.0 中引入的,作为一种使 XSLT 构造(xsl:numberxsl:sort 是经典示例)能够从 XPath 表达式中调用的方法,因此提高两种语言的可组合性,即使直接语法嵌套是不可能的。