1

文字列形式の日付/時刻を日時形式に変換しようとしています。私は現在これを持っていますが、機能していません:

<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
4

1 に答える 1

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仮定するのではなく、おそらく明示的に の存在をチェックする必要があります。AMPM

于 2013-08-08T16:35:46.543 に答える