我正在使用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>
答案 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=" "/>
发布的示例返回时间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>
。