XPath 3.1transform
函数允许您应用模板或调用命名模板或调用样式表函数。
但是,当我尝试使用现有的 XSLT 2.0 样式表模块时(例如,在 http://www.xsltfunctions.com/ 上记录的 functx 模块并在http://www.xsltfunctions.com/上作为 XSLT 2 提供xsl/functx-1.0-doc-2007-01.xslxsl:stylesheet
)在一个或xsl:transform
根元素中以 XSLT 2 方式声明许多函数,但不使用 XSLT 3xsl:package
构造,我无法说服 Saxon 9.8 或 9.9 运行任何使用transform
函数和参数声明的函数,initial-function
因为我总是收到错误“ XTDE0041
:无法从外部调用函数 foo#2,因为它不是公共的”。
示例可能是:
transform(
map {
'stylesheet-location': 'http://www.xsltfunctions.com/xsl/functx-1.0-doc-2007-01.xsl',
'delivery-format': 'raw',
'initial-function': QName('http://www.functx.com', 'substring-before-match'),
'function-params': ['abc-def-ghi', '[dg]']
})?output
但给出了上述错误。
我发现的唯一解决方法是动态构建(例如在 XQuery 中)一个 XSLT 3 包,导入 functx 模块并xsl:expose
用于公开函数:
let $functxNs := 'http://www.functx.com',
$functxLoc := 'http://www.xsltfunctions.com/xsl/functx-1.0-doc-2007-01.xsl',
$libPackage := <xsl:package
name="http://example.com/import-functx"
package-version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:functx="http://www.functx.com">
<xsl:expose
component="function"
names="functx:*"
visibility="public"/>
<xsl:import
href="{$functxLoc}"/>
</xsl:package>
return
transform(
map {
'stylesheet-node': $libPackage,
'delivery-format': 'raw',
'initial-function': QName('http://www.functx.com', 'substring-before-match'),
'function-params': ['abc-def-ghi', '[dg]']
})?output
这可行,但需要使用 XPath 3.1 的宿主语言(如上面的 XQuery 3.1)。
有没有更简单的方法来使用该transform
函数并initial-function
使用现有的 XSLT 2 样式表模块声明函数?