3

为了使用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正确指定命名空间呢?

4

1 回答 1

4

问题是您使用的是 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>&#xA;</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
于 2012-04-09T00:20:47.660 回答