Article View: fr.comp.text.xml
Article #9750Re: Sommer un calcul
From: Tom.
Date: Wed, 14 Feb 2001 23:23
Date: Wed, 14 Feb 2001 23:23
58 lines
3232 bytes
3232 bytes
In <96dnk2$13g$1@capella.worldonline.fr>, Sydney wrote:
> Voici un extrait de mon fichier XML
> <module nom="Introduction aux Systèmes Informatiques"
> coeff="1">
> <note obtenu="14" coeff="2" type="DS" date="01/12/2000"/>
> <note obtenu="6" coeff="1" type="TP" date="16/11/2000"/>
> </module>
> Je veux creer un named-template qui calcule la moyenne de ce module.
> [...] Comment faire?
Penser �r�cursivit�.
XSLT est un langage fonctionnel, comme Lisp ou Scheme.
moy = somme(noteX*coeffX) / somme(coeffX)
avec X variant de 1 � N et somme() d�finie comme �tant la somme du premier
�l�ment de la "liste" avec la somme de la "liste" moins son premier �l�ment.
Ex: somme({1, 2, 3}) = 1 + somme({2, 3})
<xsl:template name="moyenne">
<!-- liste des �l�ments -->
<xsl:param name="liste"/>
<!-- valeur du num�rateur -->
<xsl:param name="numerateur" select="0"/>
<!-- valeur du d�nominateur -->
<xsl:param name="denominateur" select="0"/>
<xsl:choose>
<xsl:when test="$liste">
<!-- la liste n'est pas vide, continuer -->
<xsl:call-template name="moyenne">
<xsl:with-param name="liste" select="$liste[position() > 1]"/>
<xsl:with-param name="numerateur"
select="$numerateur + ($liste[1]/@obtenu * $liste[1]/@coeff)"/>
<xsl:with-param name="denominateur"
select="$denominateur + $liste[1]/@coeff"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- la liste est vide, "retourner" la moyenne -->
<xsl:value-of select="$numerateur / $denominateur"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Il y a bien d'autres fa�ons de proc�der. Celle-ci n'est de loin pas la plus
optimale (on recopie la liste d'�l�ments � chaque niveau de r�cursivit�)
mais elle est assez facile � comprendre.
Ici on affiche le r�sultat au dernier niveau de r�cursivit�, on pourrait
aussi utiliser des variables pour faire le calcul "en remontant"; on
affiche alors le r�sultat au premier niveau de r�cursivit�, quand on a la
liste compl�te d'�l�ments; et le d�nominateur est alors calculable avec la
fonction sum($liste/@coeff).
�a c'est la solution "100% XSLT", il y a aussi la possibilit� d'utiliser
une fonction d'extension.
Tom.
Technical Details
Message-ID:
<96f3uo$3h1$1@wanadoo.fr>Path:
arc1-ca.pugleaf.net!supernews.google.com!sn-xit-02!supernews.com!news.tele.dk!194.176.220.130!newsfeed.icl.net!isdnet!wanadoo.fr!not-for-mailReferences:
<96dnk2$13g$1@capella.worldonline.fr>Show Full Headers
Complete Article Headers
X-Google-Language: FRENCH,ASCII X-Google-Thread: 114f60,4a899d71806a4395 X-Google-Attributes: gid114f60,public X-Google-ArrivalTime: 2001-02-14 15:22:07 PST Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-02!supernews.com!news.tele.dk!194.176.220.130!newsfeed.icl.net!isdnet!wanadoo.fr!not-for-mail From: Tom. <ptittom+news@free.fr> Newsgroups: fr.comp.text.xml Subject: Re: Sommer un calcul Date: Thu, 15 Feb 2001 00:23:01 +0100 Organization: - Lines: 58 Message-ID: <96f3uo$3h1$1@wanadoo.fr> References: <96dnk2$13g$1@capella.worldonline.fr> NNTP-Posting-Host: adijon-101-1-2-30.abo.wanadoo.fr Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8Bit X-Trace: wanadoo.fr 982192920 3617 193.252.183.30 (14 Feb 2001 23:22:00 GMT) X-Complaints-To: abuse@wanadoo.fr NNTP-Posting-Date: 14 Feb 2001 23:22:00 GMT