XSLT2不导入用户功能?

时间:2011-01-04 15:12:33

标签: import xslt-2.0

我刚刚发现如果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会导入这些功能。

2 个答案:

答案 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产生同样的结果。

以下是上述转化的导入层次结构的部分视图

alt text

我们可以看到,只显示了不到一半的所有进口 ......:)

当然,我们只看到导入的模板,但在每个导入的样式表模块中,每个模板至少有两个<xsl:function>