Tuesday, July 26

XSLT - Calculate Week Number based on date

 Calculate Week Number based on date


Template with Parameters:

Defining Template 1- [This template calls another template below]

   <xsl:template name="calculate-week-number">
        <xsl:param name="year"/>
        <xsl:param name="month"/>
        <xsl:param name="day"/>
        
        <xsl:variable name="j-day">
            <xsl:call-template name="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>

Defining Template 2 - [Used by above 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"/>
        
    </xsl:template>


Calling Template - [The returned value is stored in the variable WeekNumber]

<xsl:variable name="WeekNumber">            
    <xsl:call-template name="calculate-week-number">
        <xsl:with-param name="day" select="day-from-date($Start_Date)"/>
        <xsl:with-param name="month" select="month-from-date($Start_Date)"/>
        <xsl:with-param name="year" select="year-from-date($Start_Date)"/>
    </xsl:call-template>
</xsl:variable>

No comments:

Post a Comment