Преобразование часового пояса в xslt - PullRequest
3 голосов
/ 21 августа 2010

Мне нужно конвертировать этот формат GMT в EST в xslt 1.0.

  <Date>Mon, 11 Aug 2009 13:15:10 GMT</Date>

Есть ли что-нибудь из этого?

1 Ответ

1 голос
/ 22 августа 2010

Вот чистое решение XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" >
 <xsl:import href=
  "C:\Program Files\Marrowsoft\Xselerator25\Samples\Libraries\datetime_lib.xsl"/>
 <xsl:output method="text"/>

 <xsl:param name="pnewZone" select="'EST'"/>

 <my:zones>
   <zone name="GMT" offset="+00:00"/>
   <zone name="EST" offset="-05:00"/>
 </my:zones>

 <xsl:template match="/">
   <xsl:variable name="vDay" select=
   "substring-before(substring-after(., ' '), ' ')
   "/>

   <xsl:variable name="vMonthName" select=
   "substring-before(substring-after(., concat($vDay, ' ')), ' ')
   "/>

   <xsl:variable name="vYear" select=
   "substring-before(substring-after(., concat($vMonthName, ' ')), ' ')
   "/>

   <xsl:variable name="vTime" select=
   "substring-before(substring-after(., concat($vYear, ' ')), ' ')
   "/>

   <xsl:variable name="vMonth" select=
   "substring-before(
       substring($default-month-names,
                 string-length(substring-before($default-month-names,
                                                $vMonthName)
                               )-2),
       ']'
                    )
    "/>


  <xsl:variable name="vZone"
   select="substring-after(., concat($vTime, ' '))"/>

  <xsl:variable name="vzoneOffset" select=
   "document('')/*/my:zones/*[@name=$vZone]/@offset"/>

  <xsl:variable name="vnewzoneOffset" select=
   "document('')/*/my:zones/*[@name=$pnewZone]/@offset"/>

  <xsl:variable name="vDateTimeUTC" select=
   "concat($vYear, '-', $vMonth, '-', $vDay, 'T', $vTime, 'Z', $vzoneOffset)"/>

  <xsl:call-template name="local-to-local">
    <xsl:with-param name="datetime" select="$vDateTimeUTC"/>
    <xsl:with-param name="local-offset" select="$vnewzoneOffset"/>
  </xsl:call-template>

 </xsl:template>
</xsl:stylesheet>

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

<Date>Mon, 11 Aug 2009 13:15:10 GMT</Date>

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

2009-08-11T08:15:10Z-05:00

Примечание :

  1. Я использую библиотеку шаблонов datetime_lib.xsl Мартина Роулинсона . Эта библиотека является частью XSelerator , который в настоящее время является бесплатным продуктом и может быть загружен с SourceForge.

  2. Вся обработка в приведенном выше коде заключается в подготовке параметров к шаблону local-to-local из импортированной библиотеки.

  3. Я нашел ошибку в local-to-local и исправил ее . Заменить в строке 1143 следующее:

    <xsl:when test="($offset != 0) and ($new-offset != 0)">
    

с

    <xsl:when test="($offset != 0) or ($new-offset != 0)">
  1. Преобразование результата в исходный формат dateTime оставляется в качестве упражнения для читателя:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...