Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1422 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

  Help: Comment faire la somme des Produits en XSLT

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Help: Comment faire la somme des Produits en XSLT

n°1283236
Jarod511
****
Posté le 13-01-2006 à 19:06:02  profilanswer
 

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>  
 
 

mood
Publicité
Posté le 13-01-2006 à 19:06:02  profilanswer
 

n°1284539
avander
Posté le 16-01-2006 à 14:31:32  profilanswer
 

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

n°1284564
Jarod511
****
Posté le 16-01-2006 à 14:43:18  profilanswer
 

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

n°1285019
avander
Posté le 16-01-2006 à 21:35:53  profilanswer
 

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...

n°1285341
Jarod511
****
Posté le 17-01-2006 à 11:48:19  profilanswer
 

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.

n°1285409
avander
Posté le 17-01-2006 à 12:52:03  profilanswer
 

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
n°1287008
Jarod511
****
Posté le 18-01-2006 à 19:48:23  profilanswer
 

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
n°1287338
avander
Posté le 19-01-2006 à 10:42:57  profilanswer
 

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...  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

  Help: Comment faire la somme des Produits en XSLT

 

Sujets relatifs
[Help] Boutons dans un clip !!XSLT FOP : image codée en base64
[Help] Programme nbr premier en c#[XSLT]Différents problèmes
Mémoire insuffisante Helpplease help me :(
HELP probleme pour un script d'export de zone DNS[Help]Comment ouvrir un jeux 2 fois
triangle et variable globales... Help!!![HELP!]probleme dans mon programme
Plus de sujets relatifs à : Help: Comment faire la somme des Produits en XSLT


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR