Шаблоны для календаря

HTML и CSSXSLTJavaScriptИзображенияСофтEtc
Владимир Токмаков

19 мая 2003


Задача.

Получить порядковый номер дня недели и количество дней в месяце.

Подобная информация должна содержаться в XML. Но в ситуациях, когда нет возможности им управлять, используются эти шаблоны.

01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
<xsl:template name="get_week_day_by_date">
    <xsl:param name="iYear" />
    <xsl:param name="iMonth" />
    <xsl:param name="iDay" />

    <xsl:variable name="y">
        <xsl:choose>
            <xsl:when test="number($iMonth) &lt; 3">
                <xsl:value-of select="$iYear - 1" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$iYear" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="m">
        <xsl:choose>
            <xsl:when test="number($iMonth) &lt; 3">
                <xsl:value-of select="number($iMonth) + 12" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="number($iMonth)" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="d"><xsl:value-of select="number($iDay)" /></xsl:variable>
    <xsl:variable name="wd"
        select="(2 - floor($y div 100) + floor (floor ($y div 100) div 4) + floor(365.25 * $y)
        + floor(30.6001 * ($m+1)) + 1720996 + $d) mod 7"
    />
    <xsl:choose>
        <xsl:when test="$wd = 0">7</xsl:when>
        <xsl:otherwise><xsl:value-of select="$wd" /></xsl:otherwise>
    </xsl:choose>
</xsl:template>
01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
<xsl:template name="get_month_length_by_date">
    <xsl:param name="iMonth" />
    <xsl:param name="iYear" />

    <xsl:value-of
        select="30+number($iMonth - number(boolean(number($iMonth) > 7))) mod 2
        - number(boolean(number($iMonth) = 2)) * 2
        + number(boolean(number($iMonth) = 2)) * (number(not(boolean($iYear mod 4))) * 2)"
    />
</xsl:template>