在XSLT 3.0中将字符串转换为星期几,月份dd,年份 - 日期格式yyyy-mm-dd时间

时间:2018-04-29 12:54:42

标签: xml xslt

我正在使用XSLT 3.0并需要帮助将日期字符串转换为(星期几,月份dd,年份时间)到xslt中的日期格式yyyy-mm-dd时间 例如 - “2018年1月29日星期二 - 10:10”应转换为2018-01-29 10:10 AM格式。我们有限制,无法使用<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 :(得分:3)

XPath 3.1有一个函数parse-ietf-date。您应该能够使用具有RFC822格式日期的Feed。例如,对于Saxon 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/3pubDate输出为<pubDate>2018-04-24 3:45 P.M.</pubDate>