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 :

sum avec des nombres avec virgule


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut sum avec des nombres avec virgule
    Bonjour,

    J'ai besoin d'utiliser la fonction sum de xsl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:value-of select="sum(Compte/@number)" />
    Ma source xml est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <Compte number=447,68"  />
    <Compte number="11904,66" />
    Comment faire pour que la fonction marche avec ces nombres à virgule ?

    NB
    1/ la fonction marche bien avec une source comportant des nombres avec un séparateur de decimal "." :
    <Compte number=447.68" />
    <Compte number="11904.66" />
    2/ J'ai essayé de mettre un xsl:decimal-format sans succes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:decimal-format decimal-separator="," grouping-separator=" "/>

  2. #2
    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,

    xsl:decimal-format ne peut que formater les nombres affichés en sortie ; il ne sert pas à indiquer le format général des nombres dans le XML d'entrée.

    Tu n'as qu'une seule alternative :
    1) Obtenir une fichier XML avec le point comme séparateur décimal
    2) Ecrire une petite fonction somme qui accepte les nombres avec virgule

    Si la première solution t'est inaccessible, on peux te filer un coup de main pour la seconde si tu nous envoie un échantillon de ton fichier XML.
    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

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut Merci
    Merci de ta réponse et de ton aide.
    La création d'une fonction à l'air compliqué !

    En surfant j'ai trouvé un solution du type
    sum(for $x in CompteRendu//Compte/@montant return xs:decimal(translate($x, ',', '.')))
    Ca me parrait une bonne solution. Qu'en dis-tu ?

    que je n'arrive pas à mettre en place

    Voici mon fichier xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="TestSum.xsl"?>
    <CompteRendu>
    <Compte idCpt="000000006"  montant="447,68" />
    <Compte idCpt="000000007"  montant="11904,66" />
    </CompteRendu>
    Et ma feuille de style

    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
    <?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="/" >
    	<table align='center' border="0">
    		<tr>
    			<td>
    				Total montant 
    			</td>
    			<td align="right" width="20" ><hr />
    			<xsl:value-of select="sum(CompteRendu/Compte/@montant)" />
    			</td>
    		</tr>
    	</table>
    </xsl:template>
    </xsl:stylesheet>
    La function sum renvoie NaN alors qu'avec des "." comme separateur de decimal cela marche.

    Quelqu'un a-t-il une solution à mon probleme sans recoder une fonction sum ?

  4. #4
    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
    Ca me parrait une bonne solution.
    Le problème est que c'est du XPath version 2.0, qui n'est pas encore implémenté dans tous les processeurs (Saxon l'implémente). Cette solution n'est donc pas forcément utilisable dans ton contexte.

    Par contre, écrire une petite fonction n'est pas si compliqué que celà ; par exemple:
    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
    <?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="/" > 
       <table align='center' border="0"> 
          <tr> 
             <td> 
                Total montant 
             </td> 
             <td align="right" width="20" ><hr /> 
             <!-- <xsl:value-of select="sum(CompteRendu/Compte/@montant)" />  -->
             <xsl:variable name="total_compte">
               <xsl:call-template name="somme">
                  <xsl:with-param name="noeuds" select="CompteRendu/Compte"/>
                  <xsl:with-param name="attribut" select="'montant'"/>
               </xsl:call-template>
             </xsl:variable>
             <xsl:value-of select="translate($total_compte, '.', ',')"/>
             </td> 
          </tr> 
       </table> 
    </xsl:template> 
     
    <xsl:template name="somme">
       <xsl:param name="total" select="0"/>
       <xsl:param name="noeuds"/>
       <xsl:param name="attribut"/>
       <xsl:choose>
          <xsl:when test="$noeuds">
            <xsl:call-template name="somme">
              <xsl:with-param name="total" select="$total + number(translate($noeuds[1]/@*[name()=$attribut], ',', '.'))"/>
              <xsl:with-param name="noeuds" select="$noeuds/following-sibling::*[1]"/>
              <xsl:with-param name="attribut" select="$attribut"/>          
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
             <xsl:value-of select="$total"/>
          </xsl:otherwise>
       </xsl:choose>
    </xsl:template>
     
    </xsl:stylesheet>
    Elle n'est pas universelle (elle s'attend à trouver les valeurs à additionner dans des attributs), mais elle marche.
    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

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut Super
    Merci GrandFather de ton précieux temps passé,

    Ca fonctionne à merveille (même si c'est maintenant un peu lent !)
    Peux-tu encore me donner un petit coup de main car mes montants peuvent ne pas exister (et même être blanc).

    J'ai essayé quelques trucs sans succès pour le test d'existence de l'attribut voici mon code qui est censé appeler le template somme uniquement s'il existe :

    <xsl:if test="$noeuds[1]/@*[name()=$attribut]!=''">
    <xsl:call-template name="somme">
    <xsl:with-param name="total" select="$total + number(translate($noeuds[1]/@*[name()=$attribut], ',', '.'))"/>
    <xsl:with-param name="noeuds" select="$noeuds/following-sibling::*[1]"/>
    <xsl:with-param name="attribut" select="$attribut"/>
    </xsl:call-template>
    </xsl:if>

    Ou est l'erreur ?

Discussions similaires

  1. Calculer des heures avec des nombres comme format 17:30
    Par leara500 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 04/01/2013, 10h23
  2. Parser un JSON avec des variables avec des "-" et des ":"
    Par Quentin33 dans le forum Windows Phone
    Réponses: 2
    Dernier message: 22/05/2011, 01h04
  3. Réponses: 24
    Dernier message: 01/06/2007, 21h37
  4. comment concatiner des strings avec des nombre
    Par Sara83 dans le forum MATLAB
    Réponses: 3
    Dernier message: 18/10/2006, 13h06
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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