The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:date="http://exslt.org/dates-and-times"
		xmlns:my="uri:local"
		extension-element-prefixes="date my"
		version="1.0">

   <xsl:template name="month-calendar">
      <xsl:param name="start-date"/>
      <xsl:param name="type"/>
	 <xsl:variable name="wd" select="date:day-in-week($start-date)"/>
	 <xsl:variable name="offset">
	    <xsl:choose>
	       <xsl:when test="$wd = 2">-P0D</xsl:when>
	       <xsl:when test="$wd = 1">-P6D</xsl:when>
	       <xsl:otherwise>-P<xsl:value-of select="$wd - 2"/>D</xsl:otherwise>
	    </xsl:choose>
	 </xsl:variable>
	 <xsl:variable name="title" select=
		       "concat(date:month-name($start-date),' ',date:year($start-date))"/>
      <div class="{$type}-calendar">
	 <xsl:variable name="not-year" select="$type != 'year'"/>
	 <xsl:variable name="not-sidebar" select="$type != 'sidebar'"/>
	 <xsl:variable name="size">
	    <xsl:choose>
	       <xsl:when test="$not-year and $not-sidebar">1</xsl:when>
	       <xsl:otherwise>2</xsl:otherwise>
	    </xsl:choose>
	 </xsl:variable>
	 <xsl:element name="h{$size}">
	    <xsl:copy-of select="my:href('month',$start-date,$title,$not-sidebar)"/>
	 </xsl:element>
	 <xsl:if test="$not-year and $not-sidebar">
	    <xsl:call-template name="wmy-nav">
	       <xsl:with-param name="type" select="$type"/>
	       <xsl:with-param name="date" select="$start-date"/>
	    </xsl:call-template>
	 </xsl:if>
      <table class="{$type}-calendar" summary="{$title}">
	 <colgroup>
	    <xsl:if test="$not-sidebar">
	       <col class="week-legend"/>
	    </xsl:if>
	    <col class="day" span="7"/>
	 </colgroup>
	 
	 <xsl:choose>
	    <xsl:when test="$type = 'sidebar'">
	       <tr class="day-names"><th>M</th><th>T</th><th>W</th>
	       <th>T</th><th>F</th><th>S</th><th>S</th></tr>
	    </xsl:when>
	    <xsl:otherwise>
	       <xsl:call-template name="day-name-row"/>
	    </xsl:otherwise>
	 </xsl:choose>

	 <xsl:call-template name="week">
	    <xsl:with-param name="start-date" select="date:add($start-date,$offset)"/>
	    <xsl:with-param name="month" select="date:month-in-year($start-date)"/>
	    <xsl:with-param name="this-month" select="date:month-in-year($start-date)"/>
	    <xsl:with-param name="type" select="$type"/>
	 </xsl:call-template>
      </table>
      </div>
   </xsl:template>

   <xsl:template name="week">
      <xsl:param name="start-date"/>
      <xsl:param name="this-month"/>
      <xsl:param name="type"/>
      <tr>
	 <xsl:if test="my:monday-week($start-date) = 
		       my:monday-week(ancestor-or-self::week/day[1]/@date)">
	    <xsl:attribute name="class">this-week</xsl:attribute>
	 </xsl:if>
	 <xsl:if test="$type != 'sidebar'">
	    <td class="week">
	       <xsl:copy-of select="my:href('week',$start-date,
				     date:week-in-year($start-date))"/></td>
	 </xsl:if>
	 <xsl:call-template name="day">
	    <xsl:with-param name="start-date" select="$start-date"/>
	    <xsl:with-param name="month" select="$month"/>
	    <xsl:with-param name="this-month" select="$this-month"/>
	    <xsl:with-param name="type" select="$type"/>
	 </xsl:call-template>
      </tr>
      <xsl:variable name="next-week" select="date:add($start-date,'P7D')"/>
      <xsl:if test="date:month-in-year($next-week) = $month">
	 <xsl:call-template name="week">
	    <xsl:with-param name="start-date"  select="$next-week"/>
	    <xsl:with-param name="month" select="$month"/>
	    <xsl:with-param name="this-month" select="$this-month"/>
	    <xsl:with-param name="type" select="$type"/>
	 </xsl:call-template>
      </xsl:if>
   </xsl:template>

   <xsl:template name="day">
      <xsl:param name="start-date"/>
      <xsl:param name="this-month"/>
      <xsl:param name="type"/>

      <xsl:variable name="wd" select="date:day-in-week($start-date)"/>
      <xsl:variable name="tomorrow" select="date:add($start-date,'P1D')"/>
      <xsl:variable name="class">
	 <xsl:if test="$start-date=substring(date:date(),1,10)">today </xsl:if>
	 <xsl:if test="$start-date=@date">this-day </xsl:if>
	 <xsl:if test="date:month-in-year($start-date) 
		       != $this-month">ignore </xsl:if>
      </xsl:variable>
      <td>
	 <xsl:if test="string-length($class) > 0">
	    <xsl:attribute name="class">
	       <!-- remove trailing space -->
	       <xsl:value-of select="substring($class,1,
				     string-length($class)-1)"/>
	    </xsl:attribute>
	 </xsl:if>
	 <p class="daynum">
	    <xsl:copy-of select="my:href('day',$start-date,
				  date:day-in-month($start-date))"/>
	 </p>
	 <xsl:if test="$type != 'sidebar'">
	    <xsl:apply-templates select="//month[@month=$month]//day[@date=$start-date]"/>
	 </xsl:if>
      </td>
      <xsl:if test="date:day-in-week($start-date) > 1">
	 <xsl:call-template name="day">
	    <xsl:with-param name="start-date" select="$tomorrow"/>
	    <xsl:with-param name="today" select="$today"/>
	    <xsl:with-param name="month" select="$month"/>
	    <xsl:with-param name="this-month" select="$this-month"/>
	    <xsl:with-param name="type" select="$type"/>
	 </xsl:call-template>
      </xsl:if>
   </xsl:template>

</xsl:stylesheet>