Bonjour,
je vous propose un fonction XSL qui vous permettra d'obtenir le jour de la
semaine à partir de n'importe quelle date depuis JC.
Elle sera appelée comme suit :
<xsl:call-template name="affJourExt">
<xsl:with-param name="jour">JJ</xsl:with-param>
<xsl:with-param name="mois">MM</xsl:with-param>
<xsl:with-param name="annee">AAAA</xsl:with-param>
</xsl:call-template>
avec JJ = 1..31 ou 01..31
MM = 1..12 ou 01..12
AAAA = 1..9999 ou 0001..9999
Les jours 29,30 et 31 n'ont pas besoin d'être concordants avec le mois
(mais le résultat sera forcément faux)
Une variable (globale chez moi) en cas d'erreur :
<xsl:variable name="inconnuJour">[Jour introuvable]</xsl:variable>
La définition de la fonction :
(l'algorithme provient de
http://www.univ-lemans.fr/~hainry/tableaux/tabl1.html)
si vous avez des remarques ou des améliorations à apporter au code,
merci de m'en faire part !
<xsl:template name="affJourExt">
<xsl:param name="jour"/>
<xsl:param name="mois"/>
<xsl:param name="annee"/>
<!-- Siècle : partie entière du quotient par 100 de l'année-->
<xsl:variable name="S">
<xsl:value-of select="floor($annee div 100)" />
</xsl:variable>
<!-- Année : dans le siècle -->
<xsl:variable name="A">
<xsl:value-of select="$annee mod 100" />
</xsl:variable>
<!-- Marque du siècle
* avant le 9 décembre 1582, on a C = h ( 6 S + 4 )
* la calendrier a sauté les jours 10 à 19 décembre 1582
* depuis le 20 décembre 1582 : C = h ( 5 S + S : 4 - 1 ) -->
<xsl:variable name="C">
<xsl:choose>
<xsl:when test="($jour < 9) and ($mois < 12) and ($annee < 1582)">
<xsl:value-of select="(6 * $S + 4) mod 7" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="(5 * $S + floor($S div 4) -1) mod 7" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!--Marque de l'année
* c'est le nombre Y = ( A + A : 4 ) mod 7 -->
<xsl:variable name="Y">
<xsl:value-of select="($A + floor($A div 4)) mod 7" />
</xsl:variable>
<!--Marque bissextile
* Les années multiples de 4 sont bissextiles
* Les années multiples de 100 ne sont pas bissextiles
* Les années multiples de 400 sont bissextiles -->
<xsl:variable name="B">
<xsl:choose>
<xsl:when test="($annee mod 400) = 0">1</xsl:when>
<xsl:when test="($annee mod 100) = 0">0</xsl:when>
<xsl:when test="($annee mod 4) = 0">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Marque du mois
* janvier : M = 0 sauf si l'année est bissextile auquel cas M = 6
* février : M = 3 sauf si l'année est bissextile auquel cas M = 2
* mars : M = 3
* avril : M = 6
* mai : M = 1
* juin : M = 4
* juillet : M = 6
* août : M = 2
* septembre : M = 5
* octobre : M = 0
* novembre : M = 3
* décembre : M = 5 -->
<xsl:variable name="M">
<xsl:choose>
<xsl:when test="($mois = 1) and ($B = 0)">0</xsl:when>
<xsl:when test="($mois = 1) and ($B = 1)">6</xsl:when>
<xsl:when test="($mois = 2) and ($B = 0)">3</xsl:when>
<xsl:when test="($mois = 2) and ($B = 1)">2</xsl:when>
<xsl:when test="$mois = 3">3</xsl:when>
<xsl:when test="$mois = 4">6</xsl:when>
<xsl:when test="$mois = 5">1</xsl:when>
<xsl:when test="$mois = 6">4</xsl:when>
<xsl:when test="$mois = 7">6</xsl:when>
<xsl:when test="$mois = 8">2</xsl:when>
<xsl:when test="$mois = 9">5</xsl:when>
<xsl:when test="$mois = 10">0</xsl:when>
<xsl:when test="$mois = 11">3</xsl:when>
<xsl:when test="$mois = 12">5</xsl:when>
<xsl:otherwise>ERREUR</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Marque du quantième (notée Q ) :
* c'est le quantième lui même ou (au choix) son modulo 7 -->
<xsl:variable name="Q">
<xsl:value-of select="$jour mod 7" />
</xsl:variable>
<!-- Marque du jour
# dimanche : J = 0
# lundi : J = 1 ;
# mardi : J = 2
# mercredi : J = 3
# jeudi : J = 4
# vendredi : J = 5
# samedi : J = 6 -->
<xsl:variable name="J">
<xsl:value-of select="($C +$Y +$Q +$M) mod 7" />
</xsl:variable>
<!-- Affichage du jour en toutes lettres -->
<xsl:choose>
<xsl:when test="$J = 0"><xsl:text>dimanche</xsl:text></xsl:when>
<xsl:when test="$J = 1"><xsl:text>lundi</xsl:text></xsl:when>
<xsl:when test="$J = 2"><xsl:text>mardi</xsl:text></xsl:when>
<xsl:when test="$J = 3"><xsl:text>mercredi</xsl:text></xsl:when>
<xsl:when test="$J = 4"><xsl:text>jeudi</xsl:text></xsl:when>
<xsl:when test="$J = 5"><xsl:text>vendredi</xsl:text></xsl:when>
<xsl:when test="$J = 6"><xsl:text>samedi</xsl:text></xsl:when>
<xsl:otherwise><xsl:value-of select="$inconnuJour"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Received on Tue Aug 23 09:48:36 2005