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

  FORUM HardWare.fr
  Programmation
  XML/XSL

  XSLT somme par type de produit

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

XSLT somme par type de produit

n°2046911
titi6913
étudiant
Posté le 06-01-2011 à 15:26:30  profilanswer
 

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
mood
Publicité
Posté le 06-01-2011 à 15:26:30  profilanswer
 

n°2046974
titi6913
étudiant
Posté le 06-01-2011 à 16:49:14  profilanswer
 

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
n°2047051
titi6913
étudiant
Posté le 06-01-2011 à 23:43:16  profilanswer
 

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é

n°2047476
gilou
Modérateur
Modzilla
Posté le 07-01-2011 à 21:13:50  profilanswer
 

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é!  --

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

  XSLT somme par type de produit

 

Sujets relatifs
SQL: une somme toute bêteLangage XSLT ? "Résolu"
[VBS] Probleme utilisation Type[Excel] somme conditionelle su deux colonnes ?
Type recordIncompatibilité de type Erreur 13 VBA
aide pour algo "somme des chiffres d'un nombre"Erreur 13 Incompatibilité de type
sondage : quel type d'outil préférez-vous pour faire des pages HTML ?No enclosing instance of the type A is accessible in scope
Plus de sujets relatifs à : XSLT somme par type de produit


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