Working with the ISO Calendar

Problem

You need to work with dates in the International standard ISO-8601 calendar.[5]

Warning

Readers familiar with XML Schema should not confuse the ISO calendar with the ISO format for standard Gregorian dates (e.g., 2002-04-12 or 2002-04-12T09:26:00). Both the calendar and the formatting standard are covered in the 8601 standard. This recipe is concerned with the ISO calendar.

Solution

A basic facility you need to work with ISO dates (and, later, for determining certain holidays) is a function for finding the absolute day of the kth day on or before a specific absolute day. For example, the first Monday (k = 1) on or before January 4, 2004 (absolute day 731,584) is December 29, 2003 (absolute day 731,578):

<xsl:template name="date:k-day-on-or-before-abs-day">
     <xsl:param name="abs-day"/>
     <xsl:param name="k"/>
     <xsl:value-of select="$abs-day - (($abs-day - $k) mod 7)"/>
</xsl:template>

You can now convert ISO dates to absolute days, which is a simple matter of determining the number of absolute days in prior years and adding in the remaining days in the given ISO date:

<xsl:template name="date:iso-date-to-absolute-day"> <xsl:param name="iso-week"/> <xsl:param name="iso-day"/> <xsl:param name="iso-year"/> <xsl:variable name="jan-4-of-year"> <xsl:call-template name="date:date-to-absolute-day"> <xsl:with-param name="year" select="$iso-year"/> <xsl:with-param name="month" select="1"/> <xsl:with-param name="day" select="4"/> </xsl:call-template> </xsl:variable> ...

Get XSLT Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.