The week number ranges from 1 to 53. Although most years have 52 weeks, years containing 53 Thursdays have 53.
The solution reuses the Julian day template:
<xsl:template name="date:calculate-week-number"> <xsl:param name="year"/> <xsl:param name="month"/> <xsl:param name="day"/> <xsl:variable name="date:j-day"> <xsl:call-template name="date:calculate-julian-day"> <xsl:with-param name="year" select="$year"/> <xsl:with-param name="month" select="$month"/> <xsl:with-param name="day" select="$day"/> </xsl:call-template> </xsl:variable> <xsl:variable name="d4" select="($j-day + 31741 - ($j-day mod 7)) mod 146097 mod 36524 mod 1461"/> <xsl:variable name="L" select="floor($d4 div 1460)"/> <xsl:variable name="d1" select="(($d4 - $L) mod 365) + $L"/> <xsl:value-of select="floor($d1 div 7) + 1"/> </xsl:template>
The week number is the number assigned to each week of the year. Week 1 of any year is the week that contains January 4 or, equivalently, the week that contains the first Thursday in January. A week that overlaps the end of one year and the beginning of the next is assigned to the year when most of the week’s days lie. This will occur when the year starts on Thursday or Wednesday in a leap year. The U.S. does not currently use this numbering system.
See Recipe 3.8, later in this chapter.