Help: Comment faire la somme des Produits en XSLT

Help: Comment faire la somme des Produits en XSLT - XML/XSL - Programmation

Marsh Posté le 13-01-2006 à 19:06:02    

Bonjour,
Ca fait un moment que je sèche littéralement sur un problème que je n'arrive pas à résoudre en XSLT. J'aurais besoin que quelqu'un m'aide, en plus je suis débutant en XML. Ce que je voudrais faire c'est calculer la moyenne d'un étudiant sachant que chaque note à un coefficient. Le problème, c'est que lorsque je veux faire la somme des produits ça ne marche pas j'ai : The Value is not a node-set. Je ne sais vraiment plus comment m'y prendre pour ce calcul qui est pourtant simple. J'espère que quelqu'un pourra m'aider sur ce forum. Je mets mon code XML et mon code XSLT ci-dessous:
 
MON CODE XML:
 
<TEACHING>
<ETUDIANT ident="1" >
<NOM>toto</NOM>
</ETUDIANT>
<ETUDIANT ident="2" >
<NOM>bill</NOM>
</ETUDIANT>
...
<NOTE ident="1" etudiant="1">
<SCORE>15</SCORE>
</NOTE>
<NOTE ident="2" etudiant="1">
<SCORE>12</SCORE>
</NOTE>
...
<COEFFICIENT ident="1" note="1"><VALEUR>2</VALEUR></COEFFICIENT>
...
</TEACHING>
 
MON CODE XSLT:
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 
<xsl:for-each select="TEACHING/ETUDIANT">  
<xsl:variable name="student3" select="@ident"/>  
<xsl:variable name="course3" select="@note"/>  
<xsl:if test="$student3=1 >  
<xsl:variable name="sumnote" select="../NOTE[@etudiant=$student3]/SCORE"/>  
<xsl:variable name="sumcoef" select="../COEFFICIENT[@note]/VALEUR"/>  
<xsl:variable name="result" select="sum($sumnote*sumcoef) div  
sum($sumcoef)"/>  
<xsl:value-of select="$result" />  
</xsl:if>  
</xsl:for-each>  
</xsl:template>  
</xsl:stylesheet>  
 
 

Reply

Marsh Posté le 13-01-2006 à 19:06:02   

Reply

Marsh Posté le 16-01-2006 à 14:31:32    

Tu veux bien ajouter ce que tu veux en sortie stp?  

Reply

Marsh Posté le 16-01-2006 à 14:43:18    

Salut,
En fait, je voudrais afficher la valeur du résultat de la variable $result qui est la moyenne d'un etudiant.

Reply

Marsh Posté le 16-01-2006 à 21:35:53    

Jarod511 a écrit :

Salut,
En fait, je voudrais afficher la valeur du résultat de la variable $result qui est la moyenne d'un etudiant.


 
Donc pour l'étudiant 1, tu veux voir ( 15 + 12) / 2 = 13,5 et le lien entre ETUDIANT et NOTE se fait avec resp. @ident et @etudiant?
 
Si je demande un exemple de ce que tu veux en sortie c'est parce que je vais pas me taper ton code qui marche pas, je préfère partir sur des bases simples et claires...

Reply

Marsh Posté le 17-01-2006 à 11:48:19    

Salut,
oui c'est exactment ça. En fait, j'essai de le faire pour le moment que pour un seul étudiant pour après le généraliser pour tous les étudiants.
Je pense qu'il faut que je crée une fonction récursive.

Reply

Marsh Posté le 17-01-2006 à 12:52:03    

Le xml

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <root>
  3. <TEACHING>
  4.   <ETUDIANT ident="1" >
  5.     <NOM>toto</NOM>
  6.   </ETUDIANT>
  7.   <ETUDIANT ident="2" >
  8.     <NOM>bill</NOM>
  9.   </ETUDIANT>
  10.   <ETUDIANT ident="3" >
  11.     <NOM>Dummy</NOM>
  12.   </ETUDIANT>
  13. <!-- ... -->
  14.   <NOTE ident="1" etudiant="1">
  15.   <SCORE>15</SCORE>
  16.   </NOTE>
  17.   <NOTE ident="2" etudiant="1">
  18.   <SCORE>12</SCORE>
  19.   </NOTE>
  20.   <NOTE ident="3" etudiant="2">
  21.   <SCORE>17</SCORE>
  22.   </NOTE>
  23. <!-- ... -->
  24.   <COEFFICIENT ident="1" note="1"><VALEUR>2</VALEUR></COEFFICIENT>
  25. </TEACHING>
  26. </root>


 
Le stylesheet

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:template match="/">
  4.   <html>
  5.     <head>
  6.     </head>
  7.     <body>
  8.       <xsl:apply-templates />
  9.     </body>
  10.   </html>
  11. </xsl:template>
  12. <xsl:template match="TEACHING">
  13.   <table border="1">
  14.     <tr>
  15.       <td>Matricule</td>
  16.       <td>Nom</td>
  17.       <td>Total</td>
  18.       <td>Nombre</td>
  19.       <td>Moyenne</td>
  20.     </tr> 
  21.   <xsl:apply-templates select="ETUDIANT"/> 
  22.   </table>
  23. </xsl:template>
  24. <xsl:template match="ETUDIANT">
  25.   <xsl:variable name="vMatricule"><xsl:value-of select="@ident" /></xsl:variable>
  26.   <xsl:variable name="vTotal">
  27.     <xsl:value-of select="sum( //NOTE[@etudiant=$vMatricule]/SCORE)" />
  28.   </xsl:variable>
  29.   <xsl:variable name="vNombre">
  30.     <xsl:value-of select="count( //NOTE[@etudiant=$vMatricule])" />
  31.   </xsl:variable>
  32.   <tr>
  33.     <td><xsl:value-of select="$vMatricule" /></td>
  34.     <td><xsl:value-of select="NOM" /></td>
  35.     <td><xsl:value-of select="$vTotal" /></td>
  36.     <td><xsl:value-of select="$vNombre" /></td>
  37.     <td><xsl:value-of select="$vTotal div $vNombre" /></td>
  38.   </tr>
  39. </xsl:template>
  40. </xsl:stylesheet>


 
et le resultat ( en html)

Code :
  1. <html>
  2. <head>
  3. <META http-equiv="Content-Type" content="text/html; charset=UTF-16">
  4. </head>
  5. <body>
  6. <table border="1">
  7. <tr><td>Matricule</td><td>Nom</td><td>Total</td><td>Nombre</td><td>Moyenne</td>
  8. </tr>
  9. <tr><td>1</td><td>toto</td><td>27</td><td>2</td><td>13.5</td>
  10. </tr>
  11. <tr><td>2</td><td>bill</td><td>17</td><td>1</td><td>17</td>
  12. </tr>
  13. <tr><td>3</td><td>Dummy</td><td>0</td><td>0</td><td>NaN</td>
  14. </tr>
  15. </table>
  16. </body>
  17. </html>


 


Message édité par avander le 17-01-2006 à 12:54:19
Reply

Marsh Posté le 18-01-2006 à 19:48:23    

Salut,
Merci beaucoup avander pour ton aide. J'etais plutôt parti sur une fonction récursive du style:

Code :
  1. <xsl:template name="prod-som">
  2.     <xsl:param name="sum">0</xsl:param>
  3.     <xsl:param name="nodes" />
  4.     <xsl:choose>
  5.       <xsl:when test="$nodes">
  6.         <xsl:call-template name="prod-som">
  7.          <xsl:with-param name="sum"
  8.          select="$sum + number($nodes[1]/SCORE) * number($nodes[1]/@ident]/VALEUR)
  9. div sum..."/>


Message édité par Jarod511 le 18-01-2006 à 19:52:16
Reply

Marsh Posté le 19-01-2006 à 10:42:57    

Pourquoi tant de haine :lol:
 
En XSLT la récursivité permet de résoudre certaines carences de la version 1.0 mais c'est une solution à utiliser avec parcimonie ( c'est valable dans tous les langages d'ailleurs).  
 
Par contre comme tu vois le vieil adage ' il faut diviser pour règner' s'y adapte à merveille... tu laisse faire le moteur XSLT et tu écris de petits templates pour les balises qui t'intéressent...  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed