2013-08-08 2 views
1

Я пытаюсь преобразовать дату/время в формате строки в формат даты и времени. Сейчас у меня это, но это не работает:Строка преобразования XSLT в формат даты и времени

<xsl:function name="hcim:ParseDateTime" as="xs:dateTime"> 
    <xsl:param name="DateTimeAsString" as="xs:string"/> 

    <xsl:variable name="date" select="xs:date(substring($DateTimeAsString, 0, 10))"/> 
    <xsl:variable name="time" select="xs:time(substring($DateTimeAsString, 11, 8))"/> 
    <xsl:value-of select="dateTime($date, $time)" /> 
</xsl:function> 

Ошибка я получаю:

XSLT2 Transformation failed: Error in XPath 2.0 expression 
    (Cast failed, invalid lexical value - xs:date 'String' - xs:date) 
Error occurred in file '******' in statement 
    'select="xs:date(substring($DateTimeAsString, 0, 10))"'. 

Есть ли лучший способ сделать это? Моя входящая строка в формате:

2011-07-15 01:05:14 PM 

ответ

3

Для 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 времени.

+0

Да, 'substring ($ DateTimeAsString, 0, 10)' производит '2011-07-1' в этом случае, потому что на 0-й позиции нет символа. – JLRishe

Смежные вопросы