Finding the difference between two dates in xslt

Is there a less than kludgey way to find the difference in days between two dates in xslt? If so, you can point me in the right direction. I get dates in mm / dd / yyyy format.

+7
source share
3 answers

Use XSLT 2.0 (XPath 2.0) for this :

<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> 

when this conversion is applied to the following XML document:

 <t> <d1>04/06/2011</d1> <d2>01/11/2010</d2> </t> 

the desired, correct result is created (the difference is 450 days) :

 450 
+4
source

A nicer (and shorter) alternative for XSLT 1.0 is to compute equivalent Julian dates and subtract them.

Template:

 <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"/> 

Using:

 <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> 

Repeat for the second date and you will have two integers. Then just subtract them.

+6
source

This can be easily done using the following expression:

 days-from-duration(xs:date('yyyy-MM-dd')-xs:date('yyyy-MM-dd')) 

For example:

 days-from-duration(xs:date('2012-06-30')-xs:date('2012-06-18')) 

will give a result of 12

+6
source

All Articles