Вот чистое решение 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
Примечание :
Я использую библиотеку шаблонов datetime_lib.xsl
Мартина Роулинсона . Эта библиотека является частью XSelerator , который в настоящее время является бесплатным продуктом и может быть загружен с SourceForge.
Вся обработка в приведенном выше коде заключается в подготовке параметров к шаблону local-to-local
из импортированной библиотеки.
Я нашел ошибку в local-to-local
и исправил ее . Заменить в строке 1143 следующее:
<xsl:when test="($offset != 0) and ($new-offset != 0)">
с
<xsl:when test="($offset != 0) or ($new-offset != 0)">
- Преобразование результата в исходный формат dateTime оставляется в качестве упражнения для читателя:)