Преобразование строки в день недели, месяц дд, год-время в формат даты гггг-мм-дд в XSLT 3.0 - PullRequest
0 голосов
/ 29 апреля 2018

Я использую XSLT 3.0 и мне нужна помощь, чтобы преобразовать строку даты в виде (день недели, месяц дд, год-время) в формат даты гггг-мм-дд время в xslt Например, «вторник, 29 января 2018 - 10:10» следует преобразовать в формат 2018-01-29 10:10. У нас есть ограничения и мы не можем использовать <msxsl:script>.

Вот мой ввод XML

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="https://www.hhs.gov/rss/news.xml" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Latest News Releases</title>
        <link>https://www.hhs.gov/rss/news.xml</link>
        <description>HHS News Releases</description>
        <language>en</language>
        <atom:link href="https://www.hhs.gov/rss/news.xml" rel="self" type="application/rss+xml" />
        <item>
            <title>HHS Takes New Steps in Secretary Azar’s Value-Based Agenda</title>
            <link>https://www.hhs.gov/about/news/2018/04/24/hhs-takes-new-steps-in-secretary-azars-value-based-agenda.html</link>
            <pubDate>Tuesday, April 24, 2018 - 15:45</pubDate>
            <dc:creator>HHS Press Office</dc:creator>

        </item>
    </channel>
</rss>

1 Ответ

0 голосов
/ 29 апреля 2018

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="&#10;"/>

для вашего опубликованного образца возвращает время 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="&#10;"/>          
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

который в https://xsltfiddle.liberty -development.net / nc4NzQ7 / 3 выводит pubDate как <pubDate>2018-04-24 3:45 P.M.</pubDate>.

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