Проблема с форматом даты XSL

Я получаю входной xml со значениями даты, как показано ниже.

<date-data>
  <name>selectedDate</name>
  <value>2013-10-21 8:03</value>
</date-data>
<date-data>
  <name>selectedDate</name>
  <value>2013-10-24 9:03</value>
</date-data>

Я пытаюсь преобразовать формат даты в виде ГГГГ-ДД-ММ ЧЧ: ММ и ожидаю вывода полей даты как

2013-10-21 08:03
2013-10-24 09:03

Я использую xsl, как показано ниже

<xsl:variable name="dt" as="xs:dateTime" select="value"/>
<xsl:value-of select="{format-dateTime($dt, '[Y0001]-[M01]-[D01]T[H01]:[m01]')}" />

Я получаю сообщение об ошибке с этой строкой формата даты. Любая помощь очень ценится.


person Kiran    schedule 25.09.2013    source источник


Ответы (1)


Вам нужно будет извлечь части вашего формата даты, чтобы создать значение xs:dateTime, а затем вы можете использовать format-dateTime. Вот пример:

<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:output method="xml" indent="yes"/> 

<xsl:function name="mf:pad" as="xs:string">
  <xsl:param name="value" as="xs:string"/>
  <xsl:param name="length" as="xs:integer"/>
  <xsl:variable name="zeros" as="xs:string" select="'0000000000'"/>
  <xsl:sequence select="concat(substring($zeros, 1, $length - string-length($value)), $value)"/>
</xsl:function>

<xsl:template match="date-data">
  <xsl:variable name="dt" as="xs:dateTime">
    <xsl:analyze-string select="value" regex="([0-9]{{4}})-([0-9]{{1,2}})-([0-9]{{1,2}}) ([0-9]{{1,2}}):([0-9]{{1,2}})">
      <xsl:matching-substring>
        <xsl:sequence select="xs:dateTime(concat(regex-group(1), '-', 
                                                 mf:pad(regex-group(2), 2), '-', 
                                                 mf:pad(regex-group(3), 2), 'T', 
                                                 mf:pad(regex-group(4), 2), ':', 
                                                 mf:pad(regex-group(5), 2), 
                                                 ':00'))"/>
      </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:variable>
  <xsl:value-of select="format-dateTime($dt, '[Y0001]-[M01]-[D01]T[H01]:[m01]')" />
</xsl:template>

</xsl:stylesheet>

Возможно, вам придется адаптировать код в зависимости от вариантов вашего формата.

person Martin Honnen    schedule 25.09.2013