我有两个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'
除了您需要的正确回复<xsl:include>或<xsl:import>(我推荐后者,因为前者通常会导致重复错误),您的另一个问题如下:
函数名称必须属于命名空间.
必须在定义函数的同一文件中声明(定义并绑定到前缀)命名空间.
对函数的任何调用都必须以函数名称作为前缀,并且该前缀必须绑定到函数名称所属的同一名称空间
这是一个简单的例子:
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 +中可用.
在两个.xsl中:
<xsl:include href="one.xsl" />
Run Code Online (Sandbox Code Playgroud)
另请参阅XSLT 2.0 规范中包含的描述。