You need to work with dates in the International standard ISO-8601 calendar.
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.
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> ...