🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fr.comp.text.xml
Article #9750

Re: Sommer un calcul

#9750
From: Tom.
Date: Wed, 14 Feb 2001 23:23
58 lines
3232 bytes
In <96dnk2$13g$1@capella.worldonline.fr>, Sydney wrote:
> Voici un extrait de mon fichier XML
>          <module nom="Introduction aux Syst&#232;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-mail
References: <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