首页 > 解决方案 > 只有 name 属性的 xsl:template 和 xsl:function 有什么区别

问题描述

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

非常感谢你。

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

标签: xsltxslt-2.0xslt-3.0

解决方案


还有一些重要的区别是:

  • 次要结果文档只能在模板中创建,不能在函数中创建,请参阅https://www.w3.org/TR/xslt-30/#re ​​sult-document-restrictions 指定“[ERR XTDE1480] 它是评估xsl:result-document处于临时输出状态的指令的动态错误。” 和 "xsl:variable、xsl:param、xsl:with-param、xsl:function、xsl:key、xsl:sort、xsl:accumulator-rule 和 xsl:merge-key 总是在它们包含的序列构造函数中评估指令临时输出状态”。
  • 在函数体内,焦点(上下文项、上下文位置、上下文大小)最初不存在(请参阅https://www.w3.org/TR/xslt-30/#function-result指定“在序列构造函数中,焦点最初不存在;这意味着任何引用上下文项、上下文位置或上下文大小的尝试都是动态错误”),这意味着任何未存储在全局变量中的项都需要作为参数传递给函数
  • 在撒克逊(至少 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 功能以通过调用命名(和公共)函数开始处理,命令行界面不允许这样做,因为它有没有新的命令行选项

推荐阅读