XSLT изменить строку на дату - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь получить атрибут @start и @stop и изменить его на дату с помощью XSLT.

Это довольно странный формат даты, который я не могу изменить (школьное задание).

<programme start="20181011154000 +0200" stop="20181011172000 +0200" channel="1.bluemovie.de" clumpidx="0/1">

Я зашел так далеко

<xsl:variable name="start" select="@start"/>
                                        <xsl:variable name="stop" select="@stop"/>
                                        <xsl:value-of select="format-dateTime($start, '')"/>

Я столкнулся с проблемой при предоставлении второго аргумента функции format-dateTime.

Есть идеи, как мне это отформатировать?

1 Ответ

0 голосов
/ 19 октября 2018

Итак, у вас есть строка ввода вида 20181011154000 +0200, в которую вы хотите преобразовать XSLT / XPath 2.0 xs:date или xs:dateTime?Я полагаю, что в 2018-10-11T15:40:00+02:00, если у вас есть согласованный формат, вы можете использовать функцию replace, чтобы создать правильный формат для xs:dateTime с, например,

xs:dateTime(replace('20181011154000 +0200', '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\s([+-])([0-9]{2})([0-9]{2})', '$1-$2-$3T$4:$5:$6$7$8:$9'))

Таким образом, вы можете написать функцию

  <xsl:function name="mf:date-time-string-to-dateTime" as="xs:dateTime">
      <xsl:param name="input" as="xs:string"/>
      <xsl:sequence select="xs:dateTime(replace($input, '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\s([+-])([0-9]{2})([0-9]{2})', '$1-$2-$3T$4:$5:$6$7$8:$9'))"/>
  </xsl:function>

и используйте его:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 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="#all"
    expand-text="yes"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:function name="mf:date-time-string-to-dateTime" as="xs:dateTime">
      <xsl:param name="input" as="xs:string"/>
      <xsl:sequence select="xs:dateTime(replace($input, '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\s([+-])([0-9]{2})([0-9]{2})', '$1-$2-$3T$4:$5:$6$7$8:$9'))"/>
  </xsl:function>

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="programme">
      <p>Start {mf:date-time-string-to-dateTime(@start)}, end {mf:date-time-string-to-dateTime(@stop)}</p>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / eiZQaG4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...