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 中的日期时间格式的主要内容,如果未能解决你的问题,请参考以下文章

Saxon XSLT 2.0 和 RFC 822 日期格式

如何在 xslt 2.0 中将字符串解析为日期

XSLT 2.0 如何更改数字的默认格式?

XSLT 3.0 中的日期排序

通过 XSLT 在 XML 中格式化日期

XSLT 2.0 中的尾递归函数不起作用