XSLT:比较日期时区

时间:2016-07-13 17:33:46

标签: xslt xslt-1.0

我是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中建议回答 谢谢

1 个答案:

答案 0 :(得分:2)

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

在以下样式表中,每个dateTime都会转换为自公元前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>