XSLT somme par type de produit

XSLT somme par type de produit - XML/XSL - Programmation

Marsh Posté le 06-01-2011 à 15:26:30    

Bonjour,
 
Ça fait maintenant 2 jours que je me triture le cerveau pour faire la somme du nombre de produit regrouper par categorie. Etant débutant en XSLT j'ai vraiment besoin de votre aide.
 
Un exemple pour vous expliquer
 

Code :
  1. <magasin>
  2. <produit nom="produit1">
  3.  <reference>ABC</reference>
  4.  <categorie>categorie1</categorie>
  5.  <stockage emplacement="B1">
  6.   <quantite>1800</quantite>
  7.  </stockage>
  8. </produit>
  9. <produit nom="produit2">
  10.  <reference>DEF</reference>
  11.  <categorie>categorie2</categorie>
  12.  <stockage emplacement="B2">
  13.   <quantite>1800</quantite>
  14.  </stockage>
  15.  <stockage emplacement="B3">
  16.   <quantite>200</quantite>
  17.  </stockage>
  18. </produit>
  19. <produit nom="produit3">
  20.  <reference>RFG</reference>
  21.  <categorie>categorie2</categorie>
  22.  <stockage emplacement="B4">
  23.   <quantite>1600</quantite>
  24.  </stockage>
  25. </produit>
  26.  <produit nom="produit4">
  27.  <reference>GTH</reference>
  28.  <categorie>categorie1</categorie>
  29.  <stockage emplacement="B5">
  30.   <quantite>1600</quantite>
  31.  </stockage>
  32. </produit>
  33. </magasin>


 
Je souhaite donc ici afficher :
categorie1 : quantite
categorie2 : quantite
 
Mais je n'y arrive vraiment pas afficher la somme total des quantités par appel récursif pas de soucis mais la par catégorie je bloque. Donc si on pouvait m'aider ca serait génial.
 
Merci d'avance


Message édité par titi6913 le 06-01-2011 à 15:40:00
Reply

Marsh Posté le 06-01-2011 à 15:26:30   

Reply

Marsh Posté le 06-01-2011 à 16:49:14    

Je suis arrivé à faire un template qui fait presque ce que je veux à part pour le calcul quand plusieurs emplacement de stockage sont définits.
 
En gros marche très bien pour categorie1 mais pas pour 2
 

Code :
  1. <xsl:template name="CalculTotal">
  2.     <xsl:param name="Compteur" />
  3.     <xsl:param name="Total" />
  4. <xsl:param name="Type" select="categorie1"/>
  5.     <xsl:choose>
  6.        <xsl:when test = "count(.//quantite)>=$Compteur ">  
  7.  <xsl:choose>
  8.  <xsl:when test="contains(.//following::categorie[position()=$Compteur],'categorie1')">  
  9.     <xsl:call-template name="CalculTotal">
  10.            <xsl:with-param name="Compteur">
  11.               <xsl:value-of select="$Compteur + 1"/>
  12.            </xsl:with-param>
  13.            <xsl:with-param name="Total">
  14.                <xsl:value-of select="$Total + .//following::quantite[position()=$Compteur]"/>
  15.            </xsl:with-param>
  16.          </xsl:call-template>
  17.   </xsl:when>
  18.   <xsl:otherwise>
  19.   <xsl:call-template name="CalculTotal">
  20.            <xsl:with-param name="Compteur">
  21.               <xsl:value-of select="$Compteur + 1"/>
  22.            </xsl:with-param>
  23.            <xsl:with-param name="Total">
  24.                <xsl:value-of select="$Total"/>
  25.            </xsl:with-param>
  26.          </xsl:call-template>
  27.   </xsl:otherwise>
  28.   </xsl:choose>
  29.       </xsl:when>
  30.       <xsl:otherwise>
  31.         <table border="1" cellspacing="0" cellpadding="0" width="309" height="16">
  32.           <tr>
  33.             <td width="615" valign="top" class="Normal">
  34.               <p>Total categorie :
  35.    <xsl:value-of select="$Type"/>
  36.                 <xsl:value-of select="$Total"/></p>
  37.             </td>
  38.           </tr>
  39.         </table>
  40.       </xsl:otherwise>
  41.     </xsl:choose>
  42.   </xsl:template>
  43. </xsl:stylesheet>


 
Je bloque vraiment si quelqu'un peut m'aider


Message édité par titi6913 le 06-01-2011 à 17:26:30
Reply

Marsh Posté le 06-01-2011 à 23:43:16    

En gros pour me débloquer, je voudrais savoir s'il est possible de recupérer la categorie correspondante pour .//following::quantite[position()=$Compteur]
 
J'ai vraiment tout essayé et impossible. J'aurai vraiment besoin d'aide rapidement car j'en ai marre d'être bloqué

Reply

Marsh Posté le 07-01-2011 à 21:13:50    

Bon, si tu as un processeur XSLT qui supporte le standard 2.0 comme Saxon, pas de problème, tu peux utiliser l'élément xsl:for-each-group
Ceci répond à ton problème (pour un nombre quelconques de catégories):
On groupe les éléments quantité par la valeur de l'élément catégorie du produit, et pour chaque groupe, on somme les éléments du groupe avec la fonction standard sum().

 
Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.  <xsl:output method="text"/>
  4.  
  5.  <xsl:template match = "magasin" >
  6.    <xsl:for-each-group select="produit/stockage/quantite" group-by="../../categorie[text()]">
  7.      <xsl:value-of select="../../categorie[text()]"/>
  8.      <xsl:text>: </xsl:text>
  9.      <xsl:value-of select="sum(current-group())"/>
  10.      <xsl:text>&#xa;</xsl:text>
  11.    </xsl:for-each-group>
  12.  </xsl:template>
  13.  
  14. </xsl:stylesheet>


Le résultat après processing par saxon sur ton document initial est:

categorie1: 3400
categorie2: 3600

 

Bon par contre, si tu n'as pas de processeur XSLT qui supporte la version 2 du standard (comme hélas, une bonne partie des browser internet), c'est en général assez difficile, tu peux peut être t'inspirer de ce document: http://www.xml.com/lpt/a/951 (section Grouping Simplified) qui a une version xsl:for-each-group et une (complexe) sans, pour un même résultat.
A+,


Message édité par gilou le 07-01-2011 à 22:43:33

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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