对于xs:date
我认为<xsl:variable name="date" select="xs:date(substring($DateTimeAsString, 1, 10))"/>
应该起作用的部分。对于这xs:time
部分,我认为您需要比提取子字符串更多的工作,因为您的示例有PM
,因此您需要将其转换为 24 小时制。并且要在函数中返回某种类型的值,请使用<xsl:sequence select="..."/>
,而不是<xsl:value-of select="..."/>
。
我已阅读http://en.wikipedia.org/wiki/12_hour_clock并尝试实现:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="xs mf">
<xsl:function name="mf:parseDateTime" as="xs:dateTime">
<xsl:param name="input" as="xs:string"/>
<xsl:variable name="date" as="xs:date" select="xs:date(substring($input, 1, 10))"/>
<xsl:variable name="clock" as="xs:string" select="substring($input, 12, 8)"/>
<xsl:variable name="hours" as="xs:integer" select="xs:integer(substring($clock, 1, 2))"/>
<xsl:variable name="suffix" as="xs:string" select="substring($input, 21)"/>
<xsl:message select="concat('Suffix: |', $suffix , '|')"/>
<xsl:variable name="time" as="xs:time"
select="if ($suffix eq 'AM')
then (if ($hours eq 12)
then xs:time($clock) - xs:dayTimeDuration('PT12H')
else xs:time($clock))
else (if ($hours eq 12)
then xs:time($clock)
else xs:time($clock) + xs:dayTimeDuration('PT12H'))"/>
<xsl:sequence select="dateTime($date, $time)"/>
</xsl:function>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* , node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="value">
<xsl:copy>
<xsl:value-of select="mf:parseDateTime(.)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
给定输入
<values>
<value>2013-08-08 12:00:00 AM</value>
<value>2013-08-08 12:01:00 AM</value>
<value>2013-08-08 12:59:00 AM</value>
<value>2013-08-08 01:00:00 AM</value>
<value>2013-08-08 11:00:00 AM</value>
<value>2013-08-08 11:59:00 AM</value>
<value>2013-08-08 12:00:00 PM</value>
<value>2013-08-08 12:01:00 PM</value>
<value>2013-08-08 12:59:00 PM</value>
<value>2013-08-08 01:00:00 PM</value>
<value>2013-08-08 11:00:00 PM</value>
<value>2013-08-08 11:59:00 PM</value>
</values>
Saxon 9.5 将其转换为
<values>
<value>2013-08-08T00:00:00</value>
<value>2013-08-08T00:01:00</value>
<value>2013-08-08T00:59:00</value>
<value>2013-08-08T01:00:00</value>
<value>2013-08-08T11:00:00</value>
<value>2013-08-08T11:59:00</value>
<value>2013-08-08T12:00:00</value>
<value>2013-08-08T12:01:00</value>
<value>2013-08-08T12:59:00</value>
<value>2013-08-08T13:00:00</value>
<value>2013-08-08T23:00:00</value>
<value>2013-08-08T23:59:00</value>
</values>
该函数可能应该明确检查是否存在,PM
而不是假设缺少与AM
意味着它是一个PM
时间。