XSLT函数和命名空间

huf*_*man 5 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>
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

如果我制作样式表版本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位于相同的名称空间中.

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

bra*_*ter 7

哎呀,讨厌的版本在这里发生的事情.您所看到的许多问题都将是因为您使用的XSLT处理器不支持XPath 2.0,这是日常时间函数的来源.

我可以使用Saxon处理器 - Saxon-B 9.1.0.6作为我的处理器而不是Xalan 来获得你想要做的工作.(根据文档,Xalan似乎只支持XPath 1.0 )

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

源文档的时区应为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>
Run Code Online (Sandbox Code Playgroud)

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

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

然后它的工作原理

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



        Date: 4
Run Code Online (Sandbox Code Playgroud)

希望有所帮助,

  • 除非您仅使用XPath 2.0支持库,否则使用XPath 2.0内置时会遇到问题.如果不能仅使用XPath 2.0库,则可以创建自定义函数库,以重新实现所需的日期和时间处理功能.我认为FunctX可能会有所帮助.http://www.xqueryfunctions.com/xq/fn_day-from-datetime.html (2认同)