Я не уверен, что это правильный путь, но следующая функция берет часть вашей строки даты без часового пояса и преобразует ее в xs:dateTime
, помещая T
между xs:date
и xs:time
часть, затем форматирует его в формат, который может анализировать parse-ietf-date
, включая предыдущую часть часового пояса в данных:
<?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:parse-date" as="xs:dateTime">
<xsl:param name="input" as="xs:string"/>
<xsl:variable name="components" select="tokenize($input, ' ')"/>
<xsl:variable name="dateTimeWithoutTz" select="xs:dateTime($components[1] || 'T' || $components[2])"/>
<xsl:variable name="ietf-date" as="xs:string"
select="format-dateTime($dateTimeWithoutTz, '[FNn,3-3], [D01] [MNn,3-3] [Y0004] [H01]:[m01]:[s01] ' || $components[3], 'en', (), ())"/>
<xsl:sequence select="parse-ietf-date($ietf-date)"/>
</xsl:function>
<xsl:template match="date">
<date input="{.}">{mf:parse-date(.)}</date>
</xsl:template>
</xsl:stylesheet>
В https://xsltfiddle.liberty -development.net / bFDb2D5 , который дает результат 2015-10-15T11:45:46-04:00
для входа 2015-10-15 11:45:46 EDT
.
Может быть проще построить отображение из известных имен часовых поясов в смещения, а затем преобразовать входные данные непосредственно в xs:dateTime
, заменив пробел между датой и временем на T
и имя часового пояса с соответствующим смещением.