Преобразовать строку времени в XSLT - PullRequest
2 голосов
/ 15 ноября 2010

Как мне преобразовать строку времени, например

20101115083000 +0200

до

2010-11-15 08:30:00 +0200

с использованием XSLT?

Ответы [ 3 ]

10 голосов
/ 15 ноября 2010

Используем шаблоны:

<xsl:template name="format-date-time">
    <xsl:param name="date" select="'%Y-%m-%dT%H:%M:%S%z'"/>
    <xsl:value-of select="substring($date, 9, 2)"/>
    <xsl:text>/</xsl:text>
    <xsl:value-of select="substring($date, 6, 2)"/>
    <xsl:text>/</xsl:text>
    <xsl:value-of select="substring($date, 1, 4)"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="substring($date, 12, 2)"/>
    <xsl:text>:</xsl:text>
    <xsl:value-of select="substring($date, 15, 2)"/>
    <xsl:text>:</xsl:text>
    <xsl:value-of select="substring($date, 18, 2)"/>
</xsl:template>

Мы называем эти шаблоны так:

<xsl:call-template name="format-date-time">
    <xsl:with-param name="date" select="./Startdate"/>
</xsl:call-template>

. / Startdate - это дата XML, но с помощью метода подстроки, я думаю, вы тоже можете решить свою проблему.

2 голосов
/ 15 ноября 2010

Вот наиболее общий формат обработки даты-времени .Формат ввода и вывода полностью настраивается и передается как параметры:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:call-template name="convertDateTime">
   <xsl:with-param name="pDateTime" select="."/>
  </xsl:call-template>
 </xsl:template>

 <xsl:template name="convertDateTime">
  <xsl:param name="pDateTime"/>
  <xsl:param name="pInFormat">
    <year offset="0" length="4"/>
    <month offset="4" length="2"/>
    <day offset="6" length="2"/>
    <hour offset="8" length="2"/>
    <minutes offset="10" length="2"/>
    <seconds offset="12" length="2"/>
    <zone offset="15" length="5"/>
  </xsl:param>

  <xsl:param name="pOutFormat">
   <y/>-<mo/>-<d/> <h/>:<m/>:<s/> <z/>
  </xsl:param>

  <xsl:variable name="vInFormat" select=
   "document('')/*/xsl:template[@name='convertDateTime']
                       /xsl:param[@name='pInFormat']"/>
  <xsl:variable name="vOutFormat" select=
   "document('')/*/xsl:template[@name='convertDateTime']
                       /xsl:param[@name='pOutFormat']"/>
  <xsl:apply-templates select="$vOutFormat/node()"
       mode="_convertDateTime">
    <xsl:with-param name="pDateTime" select="$pDateTime"/>
    <xsl:with-param name="pInFormat" select="$vInFormat"/>
   </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="y" mode="_convertDateTime">
  <xsl:param name="pDateTime"/>
  <xsl:param name="pInFormat"/>

  <xsl:value-of select=
     "substring($pDateTime,
                1+$pInFormat/year/@offset,
                $pInFormat/year/@length)"/>
 </xsl:template>

 <xsl:template match="mo" mode="_convertDateTime">
  <xsl:param name="pDateTime"/>
  <xsl:param name="pInFormat"/>

  <xsl:value-of select=
     "substring($pDateTime,
                1+$pInFormat/month/@offset,
                $pInFormat/month/@length)"/>
 </xsl:template>

 <xsl:template match="d" mode="_convertDateTime">
  <xsl:param name="pDateTime"/>
  <xsl:param name="pInFormat"/>

  <xsl:value-of select=
     "substring($pDateTime,
                1+$pInFormat/day/@offset,
                $pInFormat/day/@length)"/>
 </xsl:template>

 <xsl:template match="h" mode="_convertDateTime">
  <xsl:param name="pDateTime"/>
  <xsl:param name="pInFormat"/>

  <xsl:value-of select=
     "substring($pDateTime,
                1+$pInFormat/hour/@offset,
                $pInFormat/hour/@length)"/>
 </xsl:template>

 <xsl:template match="m" mode="_convertDateTime">
  <xsl:param name="pDateTime"/>
  <xsl:param name="pInFormat"/>

  <xsl:value-of select=
     "substring($pDateTime,
                1+$pInFormat/minutes/@offset,
                $pInFormat/minutes/@length)"/>
 </xsl:template>

 <xsl:template match="s" mode="_convertDateTime">
  <xsl:param name="pDateTime"/>
  <xsl:param name="pInFormat"/>

  <xsl:value-of select=
     "substring($pDateTime,
                1+$pInFormat/seconds/@offset,
                $pInFormat/seconds/@length)"/>
 </xsl:template>

 <xsl:template match="z" mode="_convertDateTime">
  <xsl:param name="pDateTime"/>
  <xsl:param name="pInFormat"/>

  <xsl:value-of select=
     "substring($pDateTime,
                1+$pInFormat/zone/@offset,
                $pInFormat/zone/@length)"/>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML :

<dateTime>20101115083000 +0200</dateTime>

желаемый, правильный результат выдается :

   2010-11-15 08:30:00 +0200
2 голосов
/ 15 ноября 2010

Если у вас XSLT 2.0, вы можете использовать функции анализа и форматирования даты .

Если у вас XSLT 1.0, но вы можете использовать EXSLT, он предоставляет аналогичные функции .

Они будут менее прозрачны в использовании, чем явный код @ Peter, но, возможно, будут более надежными, если ваш формат ввода может отличаться.

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