XSLT 2.0 中的日期时间格式
Posted
技术标签:
【中文标题】XSLT 2.0 中的日期时间格式【英文标题】:Date-Time Formatting in XSLT 2.0 【发布时间】:2021-07-09 16:14:41 【问题描述】:我有一个 XML,其中有一个带有日期时间戳的字段,如下所示:
<?xml version='1.0' encoding='UTF-8'?
<root>
<row>
<Code>A1</Code>
<ID>20202020</ID>
<Date-Changed>April 01, 2021, 1:13 pm</Date-Changed>
</row>
<row>
<Code>A1</Code>
<ID>20202020</ID>
<Date-Changed>April 01, 2021, 1:14 pm</Date-Changed>
</row>
</root>
我需要将其转换为 XSLT 可以理解的格式,以便我可以只过滤具有最新日期时间戳的行。我想出了一种方法来过滤具有最新日期时间戳的记录。但是,XML 中的日期时间戳格式使我在过滤最新更改记录时失去了逻辑。
我该怎么做才能让我的 XSLT 能够理解上述 XML 中的日期时间格式并输出以下 XML?
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xs="http://www.w3.org/2001/XMLSchema">
<row>
<Code>A1</Code>
<ID>1234ABCD</ID>
<Date-Changed>2021-04-01T13:14:00</Date-Changed>
</row>
</root>
我的 XSLT 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
<xsl:template match="/">
<root>
<xsl:for-each select="root">
<xsl:for-each-group select="row" group-by="(concat(ID, Code))">
<xsl:variable name="Mod_Dt">
<xsl:value-of select="max(current-group()/Date-Changed/xs:dateTime(.))"/>
</xsl:variable>
<row>
<Code>
<xsl:value-of select="(current-group()[Date-Changed=$Mod_Dt]/Code)"/>
</Code>
<ID>
<xsl:value-of select="(current-group()[Date-Changed=$Mod_Dt]/ID)"/>
</ID>
<Date-Changed>
<xsl:value-of select="(current-group()[Date-Changed=$Mod_Dt]/Date-Changed)"/>
</Date-Changed>
</row>
</xsl:for-each-group>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
任何帮助将不胜感激!
【问题讨论】:
您的问题没有得到解答吗? 【参考方案1】:您可以定义一个函数来将给定的字符串转换为有效的日期时间 - 例如:
<xsl:function name="my:string-to-dateTime">
<xsl:param name="string"/>
<!-- extract components -->
<xsl:variable name="parts" select="tokenize($string, ',\s|\s|:')"/>
<!-- adjust -->
<xsl:variable name="m" select="index-of(('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'), substring($parts[1], 1, 3))" />
<xsl:variable name="H12" select="number($parts[4]) mod 12" />
<xsl:variable name="H" select="if($parts[6]='pm') then $H12 + 12 else $H12" />
<!-- output -->
<xsl:sequence select="xs:dateTime(concat($parts[3], format-number($m, '-00') , '-', $parts[2], format-number($H, 'T00'), format-number(number($parts[5]), ':00'), ':00'))" />
</xsl:function>
演示:https://xsltfiddle.liberty-development.net/6qaHaQz/2
【讨论】:
【参考方案2】:看起来好像可以使用 XSLT 3.0 中的 parse-ietf-date()
函数进行解析
【讨论】:
我不这么认为:xsltfiddle.liberty-development.net/6qaHaQz/1以上是关于XSLT 2.0 中的日期时间格式的主要内容,如果未能解决你的问题,请参考以下文章