XPath 3.1 имеет функцию parse-ietf-date
. Вы должны быть в состоянии использовать с лентами, имеющими даты формата RFC822. Например, с саксонскими 9,8 и doc('http://www.kuechenstud.io/lagedernation/feed/mp3/')//pubDate/parse-ietf-date(.)
я получаю последовательность значений xs:dateTime
. Однако формат в вашем образце (например, Tuesday, April 24, 2018 - 15:45
) не проходит через валидатор RSS-канала, и упомянутая функция не может его проанализировать.
С другой стороны, должно быть возможно проанализировать его с помощью analyze-string
и извлечь компоненты, а затем построить xs:dateTime
:
<xsl:value-of select="//pubDate/(let $result := analyze-string(., '[a-z]+,\s*([a-z]+)\s+([0-9]{1,2}),\s*([0-9]{4})\s*-\s*([0-9]{2}:[0-9]{2})', 'i') return xs:dateTime($result//*:group[@nr = 3] || '-' || format-number(index-of($month-names, $result//*:group[@nr = 1]), '00') || '-' || $result//*:group[@nr = 2] || 'T' || $result//*:group[@nr = 4] || ':00'))"
separator=" "/>
для вашего опубликованного образца возвращает время 2018-04-24T15:45:00
.
Для форматирования xs:dateTime
с format-dateTime
вы можете использовать
, который затем выводит, например, 2018-04-24 3:45 P.M.
.
Полный образец
<?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:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
exclude-result-prefixes="xs math map array"
version="3.0">
<xsl:param name="month-names"
as="xs:string*"
select="('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="pubDate">
<xsl:copy>
<xsl:value-of
select="let $result := analyze-string(., '[a-z]+,\s*([a-z]+)\s+([0-9]{1,2}),\s*([0-9]{4})\s*-\s*([0-9]{2}:[0-9]{2})', 'i')
return format-dateTime(
xs:dateTime($result//*:group[@nr = 3] || '-' || format-number(index-of($month-names, $result//*:group[@nr = 1]), '00') || '-' || format-number($result//*:group[@nr = 2], '00') || 'T' || $result//*:group[@nr = 4] || ':00'),
'[Y0001]-[M01]-[D01] [h]:[m01] [PN]'
)"
separator=" "/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
который в https://xsltfiddle.liberty -development.net / nc4NzQ7 / 3 выводит pubDate
как <pubDate>2018-04-24 3:45 P.M.</pubDate>
.