为了使用 xpath-functions(特别是fn
部分),我将相应的命名空间包含在我的 xslt 样式表中,如下所示:
<xsl:stylesheet
version="2.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
>
由 W3C 指定。
但是,当我使用 fn:document-uri
时,我的 XSLT 引擎告诉我我调用了一个未知的函数/扩展:
<xsl:variable name="uri" select="fn:document-uri()" />
歌剧 说:
此文档具有无效的 XSLT 样式表。来自 XSLT 引擎的错误消息:
错误:XPath 表达式编译失败:fn:document-uri()
详细信息:编译错误(字符 1-17,"fn:document-uri()"):调用的未知函数:"{ http://www.w3.org/2005/xpath-functions,文档 uri }"
火狐 说:
XSLT 转换期间出错:调用了未知的 XPath 扩展函数。
xsltproc
拒绝转型,因为 xslt 2.0。
那么,如何正确指定fn
命名空间呢?
问题是您使用的是 XSLT 1.0 处理器,而 XSLT 1.0 处理器不知道(并且一定不知道)有关 XPath 2.0 函数的任何信息。
如果使用真正的 XSLT 2.0 处理器,则甚至不必指定函数命名空间 - 它是任何无前缀函数名称的默认命名空间。
例如,此 XSLT 2.0 转换:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:sequence select="document-uri(.)" />
<xsl:text>
</xsl:text>
<xsl:sequence select="document-uri(document(''))" />
</xsl:template>
</xsl:stylesheet>
在 XSelerator 下使用 Saxon 9.1.5 执行时,会正确生成源 XML 文档和样式表本身的 URL:
file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml
file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xsl