如何将“日期”格式转换为 UTC 格式

时间:2021-07-27 12:37:08

标签: xml xpath xslt-1.0 xquery xslt-2.0

在下面的示例中,我们试图将“日期”从一种格式转换为另一种格式,例如要转换为 UTC 格式,例如2021-07-26T18:37:15.490Z

谁能帮忙。

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<date>
<finish_dstamp>20190716140831</finish_dstamp>
</date>

现有输出:

<?xml version="1.0" encoding="UTF-8"?>
<date>
<finish_dstamp>20190716140831</finish_dstamp>
</date>

XSLT 代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

参考网址: https://xsltfiddle.liberty-development.net/pNEj9dB/1

1 个答案:

答案 0 :(得分:0)

您还可以使用正则表达式解析日期和时间组件。构建日期时间值的正则表达式和捕获组示例(您也可以将其解析为日期时间以确保有效)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0">
    
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    
    
    <xsl:template match="finish_dstamp/text()">
        <xsl:sequence select="replace(., '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})', '$1-$2-$3T$4:$5:$6')"/>
    </xsl:template>
</xsl:stylesheet>

使用 xsl:analyze-string 的示例:

<xsl:template match="finish_dstamp/text()">
    <xsl:analyze-string select="." regex="(\d{{4}})(\d{{2}})(\d{{2}})(\d{{2}})(\d{{2}})(\d{{2}})">
        <xsl:matching-substring>
            <xsl:sequence select="xs:dateTime(
                string-join((
                  string-join((regex-group(1),regex-group(2),regex-group(3)), '-'), 
                  string-join((regex-group(4),regex-group(5),regex-group(6)), ':')), 
                'T')) "></xsl:sequence>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:sequence select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

您可以解析出日期和时间的组成部分,然后使用带有 xs:date()xs:time() 参数的 fn:dateTime() 函数,并将其放入与 finish_dstamp/text()<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="finish_dstamp/text()"> <xsl:sequence select="dateTime( xs:date( concat( substring(., 1, 4), '-', substring(., 5, 2), '-', substring(., 7, 2) ) ), xs:time( concat( substring(., 9, 2), ':', substring(., 11, 2), ':', substring(., 13, 2) ) ) )"/> </xsl:template> </xsl:stylesheet> 参数匹配的专用模板中{1}} 节点:

xs:dateTime()

您可以解析出 dateTime 的组件并使用 <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="finish_dstamp/text()"> <xsl:sequence select="xs:dateTime( concat( substring(., 1, 4), '-', substring(., 5, 2), '-', substring(., 7, 2), 'T', substring(., 9, 2), ':', substring(., 11, 2), ':', substring(., 13, 2) ) )"/> </xsl:template> 构造函数:

private val publisher: ApplicationEventPublisher 

override fun configure() {
    errorHandler(defaultErrorHandler())

    from("amqp:queue:$queue")
        .routeId(ID)
        .noAutoStartup()
        .unmarshal().json(JsonLibrary.Jackson, ControlEvent::class.java)
        .process { exchange -> publisher.publishEvent(exchange.`in`.body) }
}