XSLT函数和命名空间

时间:2009-09-05 16:31:40

标签: xslt xpath

我是XSLT的新手,我已经完成了基本的转换。接下来我想尝试日期操作,因为我的数据将有时间戳。但是,我似乎无法使用任何日期功能,这让我非常沮丧。我正在使用Firefox 3.5,xsltproc 1.1.24,xalan 1.10和XMLSpy 2009进行测试,他们都说我尝试使用的功能不存在。

我的xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="datetime.xsl"?>

<watcher>
  <event id="1" date="2009-09-04T13:49:10-0500" type="ABCD">This is a test  </event>
</watcher>
</code>

我的xsl看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsl:template match="event[@type='ABCD']">
<!--            Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/> -->
<!--            Date: <xsl:value-of select="day-from-dateTime(@date)"/> -->
                Date: <xsl:value-of select="fn:day-from-dateTime(@date)"/>
</xsl:template>

</xsl:stylesheet>

如果我制作样式表版本2,XMLSpy会抱怨它无法投射我的日期:XSLT 2.0 Debugging Error: Error in XPath 2.0 expression (Cast failed, invalid lexical value - xs:dateTime '2009-09-04T13:49:10-0500')

如果我将其保留为版本1,则会抱怨其他错误:XSLT 1.0 Debugging Error: Error in XPath expression (Unknown function - Name and number of arguments do not match any function signature in the static context - 'day-from-dateTime')

每当我尝试更改XSL以使用命名空间(例如fn:day-from-dateTime)时,它都会拒绝工作,我的所有解析器都会说The function number 'http://www.w3.org/2005/02/xpath-functions:day-from-dateTime' is not available及其变体。我从其他测试中知道我可以完美地使用substring()函数,而不需要任何名称空间前缀,并且我相信它与day-from-dateTime位于相同的名称空间中。

我觉得它非常容易,因为所有的教程都显示了正在使用的功能,但似乎有些东西在逃避我。有人能告诉我我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

哎呀,讨厌的版本在这里发生的事情。你看到的很多问题都是因为你使用的XSLT处理器不支持XPath 2.0,而这就是那个day-from-dateTime函数的来源。

我可以通过Saxon processor - Saxon-B 9.1.0.6作为我的处理器而不是Xalan来获得你想要做的工作。 (Xalan似乎只支持XPath 1.0,根据documentation

您的文档中存在一些错误:

源文档的时区应为05:00,而不是0500

<?xml version="1.0" encoding="UTF-8"?>
<watcher>
    <event id="1" date="2009-09-04T13:49:10-05:00" type="ABCD">This is a test  </event>
</watcher>

XSLT应该将字符串2009-09-04T13:49:10-05:00转换为xs:dateTime,这是day-from-dateTime所需的参数类型。

Date: <xsl:value-of select="day-from-dateTime(xs:dateTime(@date))"/>

然后它起作用

<?xml version="1.0" encoding="UTF-8"?>



        Date: 4

希望有所帮助,