如何在XSLT 2.0中使用xpath函数?

时间:2012-04-08 23:57:29

标签: xslt xpath xslt-1.0 xslt-2.0

为了使用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的specified

然而,当我使用fn:document-uri时,我的XSLT引擎告诉我,我调用了一个未知函数/扩展名:

  <xsl:variable name="uri" select="fn:document-uri()" />

Opera说:

  

此文档包含无效的XSLT样式表。来自XSLT引擎的错误消息:
  错误:XPath表达式编译失败:fn:document-uri()
  详细信息:编译错误(字符1-17,“fn:document-uri()”):名为“{http://www.w3.org/2005/xpath-functions,document-uri}”的未知函数

Firefox说:

  

XSLT转换期间出错:调用了一个未知的XPath扩展函数。

由于xslt 2.0,xsltproc拒绝转换。

那么,如何正确指定fn命名空间?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-3)

你可以在php中使用xpath函数 请参考此链接 http://php.net/manual/en/simplexmlelement.xpath.php 我认为此示例对您有用