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

Mic*_*ael 6 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>
Run Code Online (Sandbox Code Playgroud)

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

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


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

< xsl:value-of select="x:trans('Hello World')"/>
Run Code Online (Sandbox Code Playgroud)

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

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

Dim*_*hev 7

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

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

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

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

这是一个简单的例子:

I.文件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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

III.包含的转换deleteB.xsl应用于以下XML文档:

<t>1</t>
Run Code Online (Sandbox Code Playgroud)

并产生正确的结果:

2
Run Code Online (Sandbox Code Playgroud)

附加说明:目前没有浏览器支持XSLT 2.0转换 - xsl:function仅在XSLT 2.0 +中可用.


Tom*_*lak 1

在两个.xsl中:

<xsl:include href="one.xsl" />
Run Code Online (Sandbox Code Playgroud)

另请参阅XSLT 2.0 规范中包含的描述。