Поиск разницы между 2 датами в xslt
Существует ли менее чем клуджейский способ найти разницу в днях между 2 датами в xslt? Если да, то вы можете указать мне правильное направление. Я получаю даты в формате ММ/ДД/гггг.
3 ответа:
Используйте XSLT 2.0 (XPath 2.0) для этого:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="/"> <xsl:variable name="vDate1" select="my:dateFromUsDate(/*/d1)"/> <xsl:variable name="vDate2" select="my:dateFromUsDate(/*/d2)"/> <xsl:sequence select= "($vDate1 - $vDate2) div xs:dayTimeDuration('P1D')"/> </xsl:template> <xsl:function name="my:dateFromUsDate" as="xs:date"> <xsl:param name="pUsDate" as="xs:string"/> <xsl:sequence select= "xs:date(concat(substring($pUsDate,7,4), '-', substring($pUsDate,1,2), '-', substring($pUsDate,4,2) ) ) "/> </xsl:function> </xsl:stylesheet>
Когда это преобразование применяется к следующему XML-документу:
<t> <d1>04/06/2011</d1> <d2>01/11/2010</d2> </t>
Желаемый, правильный результат (разница составляет 450 дней) получается :
450
Более приятной (и короткой) альтернативой для XSLT 1.0 является вычисление эквивалентных Юлианских дат и их вычитание.
Шаблон:
<xsl:template name="calculate-julian-day"> <xsl:param name="year"/> <xsl:param name="month"/> <xsl:param name="day"/> <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:value-of select="$day + floor((153 * $m + 2) div 5) + $y * 365 + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045"/>
Использование:
Повторите для второй даты, и у вас будет два целых числа. Затем просто вычтите их.<xsl:variable name="dateInv" select="'20120406'" /> <xsl:call-template name="calculate-julian-day"> <xsl:with-param name="year" select="substring($date,1,4)"/> <xsl:with-param name="month" select="substring($date,5,2)"/> <xsl:with-param name="day" select="substring($date,7,2)"/> </xsl:call-template>