我有两个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'
答案 0 :(得分:7)
除了<xsl:include>
或<xsl:import>
所需的正确回复(我推荐后者,因为前者通常会导致重复错误),您的其他问题如下强>:
函数名称必须属于命名空间。
必须在定义函数的同一文件中声明名称空间(已定义并绑定到前缀)。
对函数的任何调用都必须以函数名称作为前缀,并且该前缀必须绑定到函数名称所属的同一名称空间
这是一个简单的例子:
<强>予。文件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)