我刚刚发现如果main.xsl
xsl:import
s lib.xsl
定义了某些XSLT2函数,那么这些函数就无法在main.xsl
中使用。
Error: There's no function in namespace http://foo.bar/my-library-ns
但是,xsl:include
会导入这些功能。
答案 0 :(得分:0)
此样式表:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:local="http://localhost/">
<xsl:import href="lib.xsl"/>
<xsl:template match="/">
<xsl:value-of select="local:function()"/>
</xsl:template>
</xsl:stylesheet>
使用此导入的模块:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:local="http://localhost/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:function name="local:function" as="xs:boolean">
<xsl:sequence select="true()"/>
</xsl:function>
</xsl:stylesheet>
输出 * :
true
*测试了Saxon和Altova。 (我的XQSharp已过期......)
答案 1 :(得分:0)
我刚发现如果是main.xsl xsl:import lib.xsl,它定义了一些 XSLT2函数,那些函数不能 用于main.xsl
当然,这不是真的。
查看FXSL库,其模板包含必须由使用XSLT代码导入的函数。 FXSL的样式表模块实际上导入了其他样式表模块并使用它们的功能。
这是一个简单的例子:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f"
>
<xsl:import href="../f/func-foldl.xsl"/>
<xsl:import href="../f/func-Operators.xsl"/>
<!--
This transformation calculates 10!
Expected result: 3628800 or 3.6288E6
-->
<xsl:output encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:value-of select="f:foldl(f:mult(), 1, 1 to 10 )"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于任何XML文档(未使用)时,它会计算10! (10阶乘)值:
3628800
我正在使用的所有三个XSLT 2.0处理器:Saxon 9,AltovaXML和XQSharp产生同样的结果。
以下是上述转化的导入层次结构的部分视图:
我们可以看到,只显示了不到一半的所有进口 ......:)
当然,我们只看到导入的模板,但在每个导入的样式表模块中,每个模板至少有两个<xsl:function>
。