如何在另一个xsl中使用一个函数

时间:2010-08-22 10:45:00

标签: xslt

我有两个xsl文件:“one.xsl”和“two.xsl”

one.xsl:       

 <xsl:function name="x:trans" as="xs:string">
    <xsl:param name="str"></xsl:param>
    <xsl:variable name="res1" select="x:translate_string($str)"/>
    <xsl:sequence select="$res1"/> 
</xsl:function>
</xsl:stylesheet>

我想在“one.xsl”中使用函数“x:trans”

如何将该功能引用到另一个文件?


问题在于,当我尝试以这种方式调用此函数时:

< xsl:value-of select="x:trans('Hello World')"/>

我从浏览器收到以下错误消息:

对未声明的命名空间前缀的引用:'x'

3 个答案:

答案 0 :(得分:7)

除了<xsl:include><xsl:import>所需的正确回复(我推荐后者,因为前者通常会导致重复错误),您的其他问题如下

  1. 函数名称必须属于命名空间

  2. 必须在定义函数的同一文件中声明名称空间(已定义并绑定到前缀)。

  3. 对函数的任何调用都必须以函数名称作为前缀,并且该前缀必须绑定到函数名称所属的同一名称空间

  4. 这是一个简单的例子:

    <强>予。文件deleteA.xsl定义了函数my:double

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:my="my:my"
        >
     <xsl:function name="my:double" as="xs:double">
      <xsl:param name="pArg" as="xs:double"/>
    
      <xsl:sequence select="2*$pArg"/>
     </xsl:function>
    </xsl:stylesheet>
    

    <强> II。文件deleteB.xsl导入文件deleteA.xsl并使用函数my:double

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:my="my:my">
        <xsl:import href="deleteA.xsl"/>
    
        <xsl:output method="text"/>
    
        <xsl:template match="/">
          <xsl:sequence select="my:double(.)"/>
        </xsl:template>
    </xsl:stylesheet>
    

    <强> III。 deleteB.xsl中包含的转换适用于以下XML文档:

    <t>1</t>
    

    并生成正确的结果

    2
    

    其他评论:目前没有浏览器支持XSLT 2.0转换 - xsl:function仅适用于XSLT 2.0 +。

答案 1 :(得分:4)

您想要<xsl:include /><xsl:import /><xsl:include />更简单(它只是拖入所有内容),而<xsl:import />更灵活(如果两者之间存在模板冲突,则调用的被调用的覆盖更好地定义并且通常是合理的)

编辑以添加信息:

您需要确保使用appopriate命名空间调用导入的样式表中的模板。最简单的方法是确保在样式表中有匹配的xmlns:foo声明,尽管你可以在一个样式表中调用foo:template作为bar:另一个模板,如果它有xmlns:bar而不是。

答案 2 :(得分:1)

在two.xsl:

<xsl:include href="one.xsl" />

另请参阅XSLT 2.0 spec中的include说明。