只有 name 属性的 xsl:template 和 xsl:function 有什么区别
What are the differences between xsl:template which has only name attribute and xsl:function
我发现它们都可以带参数调用,return xsl:value-of
和 xsl:sequence
,但有什么区别?什么情况下应该用一个代替另一个更好?它们在大量使用时会出现小的性能问题吗?
非常感谢。
顺便说一句:我的 XSLT 处理器是 saxon-he 9.8+。
恕我直言,有几点不同:
- 您可以在 XPath 中使用 XSL 函数。使用模板无法做到这一点。
- 您需要显式调用函数。隐式应用模板(不需要
call-template
)
- 早期版本的 XSL 支持模板
关于性能:在您确定性能问题之前,请不要打扰。正如 Donald Knuth 所说:"Premature optimization is the root of all evil"。只使用最适合该目的的任何东西。
还有一些重要的区别是:
- 次要结果文档只能在模板中创建,不能在函数中创建,请参阅 https://www.w3.org/TR/xslt-30/#result-document-restrictions 指定“[ERR XTDE1480] 评估
xsl:result-document
指令是一个动态错误临时输出状态。”和 "xsl:variable, xsl:param, xsl:with-param, xsl:function, xsl:key, xsl:sort, xsl:accumulator-rule, and xsl:merge-key always evaluate the instructions in their contained sequence constructor in temporary output state".
- 在函数体内,焦点(上下文项、上下文位置、上下文大小)最初是不存在的(请参阅 https://www.w3.org/TR/xslt-30/#function-result 指定 "Within the sequence constructor, the focus is initially absent; this means that any attempt to reference the context item, context position, or context size is a dynamic error"),这意味着,任何未存储在全局中的项目变量需要作为参数传递给函数
- 在 Saxon(至少 9.8 和 9.9)中,而 API (http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/Xslt30Transformer.html#callFunction-net.sf.saxon.s9api.QName-net.sf.saxon.s9api.XdmValue:A-) 已扩展为支持新的 XSLT 3 功能,通过调用命名的(和 public) 函数,命令行界面不允许这样做,因为它没有用于此的新命令行选项
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:number
和 xsl:sort
是经典示例)能够从 XPath 表达式中调用的方法,因此提高两种语言的可组合性,即使直接语法嵌套是不可能的。
我发现它们都可以带参数调用,return xsl:value-of
和 xsl:sequence
,但有什么区别?什么情况下应该用一个代替另一个更好?它们在大量使用时会出现小的性能问题吗?
非常感谢。
顺便说一句:我的 XSLT 处理器是 saxon-he 9.8+。
恕我直言,有几点不同:
- 您可以在 XPath 中使用 XSL 函数。使用模板无法做到这一点。
- 您需要显式调用函数。隐式应用模板(不需要
call-template
) - 早期版本的 XSL 支持模板
关于性能:在您确定性能问题之前,请不要打扰。正如 Donald Knuth 所说:"Premature optimization is the root of all evil"。只使用最适合该目的的任何东西。
还有一些重要的区别是:
- 次要结果文档只能在模板中创建,不能在函数中创建,请参阅 https://www.w3.org/TR/xslt-30/#result-document-restrictions 指定“[ERR XTDE1480] 评估
xsl:result-document
指令是一个动态错误临时输出状态。”和 "xsl:variable, xsl:param, xsl:with-param, xsl:function, xsl:key, xsl:sort, xsl:accumulator-rule, and xsl:merge-key always evaluate the instructions in their contained sequence constructor in temporary output state". - 在函数体内,焦点(上下文项、上下文位置、上下文大小)最初是不存在的(请参阅 https://www.w3.org/TR/xslt-30/#function-result 指定 "Within the sequence constructor, the focus is initially absent; this means that any attempt to reference the context item, context position, or context size is a dynamic error"),这意味着,任何未存储在全局中的项目变量需要作为参数传递给函数
- 在 Saxon(至少 9.8 和 9.9)中,而 API (http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/Xslt30Transformer.html#callFunction-net.sf.saxon.s9api.QName-net.sf.saxon.s9api.XdmValue:A-) 已扩展为支持新的 XSLT 3 功能,通过调用命名的(和 public) 函数,命令行界面不允许这样做,因为它没有用于此的新命令行选项
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:number
和 xsl:sort
是经典示例)能够从 XPath 表达式中调用的方法,因此提高两种语言的可组合性,即使直接语法嵌套是不可能的。