XSLT :比较日期时区



我是XSLT的新手。

如何比较XSLT中的日期字符串并输出结果?

下面是我的输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<dates>
    <date1>2003-09-15T16:53:22.000-07:00</date1>
    <date2>2003-09-15T16:53:23.000-07:00</date2>
</dates>

下面是我的 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:variable name="date1" select="/dates/date1"/>
    <xsl:variable name="date2" select="/dates/date2"/>
    
    <xsl:template match="/">
        <xsl:if test="$date1  &gt;  $date2">
            date1 is greater
        </xsl:if>
        
        <xsl:if test="$date1  =  $date2">
            both dates are equal
        </xsl:if>
        
        <xsl:if test="$date1  &lt;=  $date2">
            date1 is lesser than date2
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>
现在在 XSLT 中我想比较

上述日期,那么是否可以在 XSLT 1.0 中比较(更大、更小、等于)日期?

我相信在 XSLT 1.0 中这是不可能的。可以在 XSLT 2.0 中完成吗?

(在我目前的学习项目中,我使用了XSLT 1.0,所以如果可能的话,请在XSLT 1.0中提出答案)。

若要在 XSLT 1.0 中执行此操作,必须首先将给定的日期时间转换为数值,并将它们均衡为公共时区。

在下面的样式表中,每个日期时间都转换为自公元前 4714 年 11 月 24 日中午 UTC 以来经过的秒数 - 请参阅:https://en.wikipedia.org/wiki/Julian_day

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="dates">
    <xsl:variable name="date1">
        <xsl:call-template name="dateTime-to-seconds">
            <xsl:with-param name="dateTime" select="date1" />
        </xsl:call-template>
    </xsl:variable> 
    <xsl:variable name="date2">
        <xsl:call-template name="dateTime-to-seconds">
            <xsl:with-param name="dateTime" select="date2" />
        </xsl:call-template>
    </xsl:variable> 
    <result>
        <xsl:choose>
            <xsl:when test="$date1 &lt; $date2">date1 occurs earlier than date2</xsl:when>
            <xsl:when test="$date1 = $date2">the two dates are concurrent</xsl:when>
            <xsl:when test="$date1 &gt; $date2">date1 occurs later than date2</xsl:when>
        </xsl:choose>
    </result>
</xsl:template>
<xsl:template name="dateTime-to-seconds">
    <xsl:param name="dateTime"/>
    <xsl:variable name="date" select="substring-before($dateTime, 'T')" />
    <xsl:variable name="time" select="substring-after($dateTime, 'T')" />
    <xsl:variable name="local-time" select="substring($time, 1, string-length($time) - 6)" />
    <xsl:variable name="offset" select="substring-after($time, $local-time)" />
    <xsl:variable name="year" select="substring($date, 1, 4)" />
    <xsl:variable name="month" select="substring($date, 6, 2)" />
    <xsl:variable name="day" select="substring($date, 9, 2)" />
    <xsl:variable name="hour" select="substring($local-time, 1, 2)" />
    <xsl:variable name="minute" select="substring($local-time, 4, 2)" />
    <xsl:variable name="second" select="substring($local-time, 7)" />
    <xsl:variable name="offset-sign" select="1 - 2 * starts-with($offset, '-')" />
    <xsl:variable name="offset-hour" select="substring($offset, 2, 2) * $offset-sign" />
    <xsl:variable name="offset-minute" select="substring($offset, 5, 2) * $offset-sign" />
    <xsl:variable name="a" select="floor((14 - $month) div 12)"/>
    <xsl:variable name="y" select="$year + 4800 - $a"/>
    <xsl:variable name="m" select="$month + 12*$a - 3"/>    
    <xsl:variable name="jd" select="$day + floor((153*$m + 2) div 5) + 365*$y + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045" />
    <xsl:value-of select="86400*$jd + 3600*$hour + 60*$minute + $second - 3600*$offset-hour - 60*$offset-minute" />
</xsl:template> 
</xsl:stylesheet>

应用于以下测试输入:

.XML

<dates>
    <date1>2003-09-15T16:53:22.000-07:00</date1>
    <date2>2003-09-15T17:53:22.000-06:00</date2>
</dates>

结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<result>the two dates are concurrent</result>

相关内容

  • 没有找到相关文章

最新更新