我是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 > $date2">
date1 is greater
</xsl:if>
<xsl:if test="$date1 = $date2">
both dates are equal
</xsl:if>
<xsl:if test="$date1 <= $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 < $date2">date1 occurs earlier than date2</xsl:when>
<xsl:when test="$date1 = $date2">the two dates are concurrent</xsl:when>
<xsl:when test="$date1 > $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>