IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSLT] calcul de somme


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut [XSLT] calcul de somme
    Bonjour,

    Soit le flux xml suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <categorie>
       <libelle>cat1</libelle>
       <categorie>
          <libelle>cat2</libelle>
          <categorie>
             <libelle>cat3</libelle>
             <montant>300</montant>
          </categorie>
          <categorie>
             <libelle>cat4</libelle>
             <montant>400</montant>
          </categorie>
       </categorie>
       <categorie>
          <libelle>cat5</libelle>
          <montant>500</montant>
       </categorie>
    </categorie>
    En gros, une categorie possède soit un montant, soit une liste de categories.
    Ce que j'aimerais, c'est faire la somme des montants pour chaque categorie : ici, cat1 = cat2 + cat5 avec cat2 = cat3 + cat4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    +-------------+------+
    | cat1        | 1200 |
    +-------------+------+
    |    cat2     |  700 |
    +-------------+------+
    |       cat3  |  300 |
    +-------------+------+
    |       cat4  |  400 |
    +-------------+------+
    |    cat5     |  500 |
    +-------------+------+
    Je me suis dis qu'un for-each ferait l'affaire pour incrémenter une variable somme, mais apparemment on ne peut modifier une variable déjà déclarée. Je m'en remets donc à vos lumières pour m'éclairer la route, nobles seigneurs...

    merci d'avance,
    N

  2. #2
    Membre averti

    Inscrit en
    Août 2005
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 220
    Points : 364
    Points
    364
    Par défaut somme
    Tu peux utiliser la fonction sum de Xpath: quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="sum(//montant)">

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    en combinant sum() et l'axe XPath descendant, ça devrait le faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <table>
      <xsl:for-each select="//categorie">
        <tr>
         <td><xsl:value-of select="libelle"/></td>
         <td><xsl:value-of select="sum(descendant::montant)"/></td>
        </tr>
      </xsl:for-each>
    </table>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par GrandFather
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="sum(descendant::montant)"/>
    Ca marche nickel !!!

    Merci beaucoup.

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Je ne sais pas si je dois ouvrir un autre sujet, en tout cas c'est toujours le meme problème.

    J'ai augmenté mon modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <categorie>
       <libelle>...</libelle>
       <montant>xxx</montant>
       <pourcentage>35</pourcentage>
    </categorie>
    Mon problème reste le mème, sauf que je dois l'appliquer sur le pourcentage du montant pour chaque categorie.
    Exemple désiré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    +-------------+------+------+
    | cat1        | 1200 |  46  |
    +-------------+------+------+
    |    cat2     |  700 |  71  |
    +-------------+------+------+
    |       cat3  |  300 | 100  |
    +-------------+------+------+
    |       cat4  |  400 |  50  |
    +-------------+------+------+
    |    cat5     |  500 |  10  |
    +-------------+------+------+

    Pour ce faire, on a dans le xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <categorie>
       <libelle>cat1</libelle>
       <categorie>
          <libelle>cat2</libelle>
          <categorie>
             <libelle>cat3</libelle>
             <montant>300</montant>
             <pourcentage>100</pourcentage>
          </categorie>
          <categorie>
             <libelle>cat4</libelle>
             <montant>400</montant>
             <pourcentage>50</pourcentage>
          </categorie>
       </categorie>
       <categorie>
          <libelle>cat5</libelle>
          <montant>500</montant>
          <pourcentage>10</pourcentage>
       </categorie>
    </categorie>
    Le calcul à la main est le suivant
    cat3 = 100% * 300 = 300
    cat4 = 50% * 400 = 200
    cat5 = 10% * 500 = 50
    cat2 = (300 + 200) * 100 / (300 + 400) = 71
    cat1 = (300 + 200 + 50) * 100 / (300 + 400 + 500) = 46

    Qu'en pensez vous ? Je n'arrive pas à combiner des calculs dans la fonction sum...
    J'essaie de passer par un template, mais je suis toujours bloquer par ces variables constantes (!)

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    La seule solution est de passer par une fonction récursive (template nommé qui s'appelle lui-même).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<xsl:template match="/">
    		<table border="1">
    			<xsl:for-each select="//categorie">
    				<xsl:variable name="total" select="sum(descendant::montant)"/>
    				<tr>
    					<td><xsl:value-of select="libelle"/></td>
    					<td><xsl:value-of select="$total"/></td>
    					<td>
    						<xsl:variable name="total-pondere">
    							<xsl:call-template name="cumul">
    								<xsl:with-param name="categories" select="descendant-or-self::categorie[montant]"/>
    							</xsl:call-template>
    						</xsl:variable>
    						<xsl:value-of select="round($total-pondere div $total * 100)"/>
    					</td>
    				</tr>
    			</xsl:for-each>
    		</table>
    	</xsl:template>
     
    	<xsl:template name="cumul">
    		<xsl:param name="categories"/>
    		<xsl:param name="index" select="1"/>
    		<xsl:param name="total" select="0"/>
    		<xsl:choose>
    			<xsl:when test="$index &lt;= count($categories)">
    				<xsl:call-template name="cumul">
    					<xsl:with-param name="categories" select="$categories"/>
    					<xsl:with-param name="index" select="$index + 1"/>
    					<xsl:with-param name="total" select="$total + ($categories[$index]/montant * $categories[$index]/pourcentage div 100)"/>
    				</xsl:call-template>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:value-of select="$total"/>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
     
    </xsl:stylesheet>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Merci, j'avais bien essayé avec un template, mais sans succes...

    Quand on passe descendant-or-self::categorie[montant] comme parametre, que contiendra ce parametre ?

    Les voies XPath sont encore un peu impénétrable pour moi

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Mr N.
    Quand on passe descendant-or-self::categorie[montant] comme parametre, que contiendra ce parametre ?
    Littéralement, le select signifie : "en partant du noeud courant, sélectionne parmi ses descendants tous ses éléments descendants (quel que soit leur niveau), et y compris le noeud courant lui-même (le or-self) UNIQUEMENT si ces noeuds ont au moins un éléments fils montant".
    Le paramètre "catégories" contiendra donc l'ensemble de ces noeuds (c'est une variable de type node-set), et on se servira de la variable numérique "index" pour désigner individuellement un élément "catégorie" dans ce node-set par sa position.
    Citation Envoyé par Mr N.
    Les voies XPath sont encore un peu impénétrable pour moi
    Ils sont pourtant la voie du succès si on veut maîtriser XSLT...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  9. #9
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Merci de la precision, c'est le UNIQUEMENT qui me manquait.

  10. #10
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Oups, une petite coquille dans mon explication ; il fallait lire en fait :
    Littéralement, le select signifie : "en partant du noeud courant, sélectionne parmi ses descendants tous ses éléments catégorie (quel que soit leur niveau), et y compris le noeud courant lui-même (le or-self) UNIQUEMENT si ces noeuds ont au moins un éléments fils montant".
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT] calcule de somme avec xsl
    Par emenemza dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 02/02/2009, 14h31
  2. [newbie]comment calculer la somme des nb pages sum()?
    Par megapacman dans le forum Débuter
    Réponses: 3
    Dernier message: 13/06/2006, 11h03
  3. [iReport] Calcul de somme de variables et fusion de données
    Par RR instinct dans le forum iReport
    Réponses: 7
    Dernier message: 03/04/2006, 16h04
  4. calculer la somme
    Par pierrot67 dans le forum Bases de données
    Réponses: 5
    Dernier message: 21/03/2006, 22h50
  5. [CR 8.5] Calculer la somme d'une somme
    Par Frederic Vincent dans le forum Formules
    Réponses: 4
    Dernier message: 12/02/2004, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo