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] cumuler le contenu de balises identiques


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut [XSLT] cumuler le contenu de balises identiques
    Bonjour,
    Je dispose d'un fichier XML ci-dessous:
    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
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet type="text/xsl" href="dismig.xsl"?>
    <DISCO>
    	<CENTRE>
    		<NOM>043</NOM>
    		<DATE>13/03/07</DATE>
    		<RRF>0461</RRF>
    		<VLAGRDE>0</VLAGRDE>
    		<VLAGRDG>1</VLAGRDG>
    		<MIGNRE>2</MIGNRE>
    	</CENTRE>
    	<CENTRE>
    		<NOM>011</NOM>
    		<DATE>13/03/07</DATE>
    		<RRF>0471</RRF>
    		<VLAGRDE>0</VLAGRDE>
    		<MIGNRE>2</MIGNRE>
    	</CENTRE>
    	<CENTRE>
    		<NOM>012</NOM>
    		<DATE>13/03/07</DATE>
    		<RRF>0471</RRF>
    		<VLAGRDE>0</VLAGRDE>
    		<VLAGRDG>1</VLAGRDG>
    		<MIGNRE>2</MIGNRE>
    	</CENTRE>
    	<CENTRE>
    		<NOM>011</NOM>
    		<VLAGRDG>1</VLAGRDG>
    	</CENTRE>
    </DISCO>
    Comme on peut le voir, on trouve deux fois le centre de nom "011". Je veux le transformer en un tableau où le centre "011" n'apparaît que sur une ligne, mais en ayant en colonne les différentes valeurs des autres balises. j'avais fait ce fichier xsl (dismig.xsl appelé dans le fichier 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
    		xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output 
    	method="html" 
    	encoding="ISO-8859-1" 
    	doctype-public="-//W3C//DTD HTML 4.01//EN"
    	doctype-system="http://www.w3.org/TR/html4/strict.dtd"
    	indent="yes"/>
    <xsl:template match="/">
    <html>
    <head>
    <title>Indicateurs</title>
    <style>
    td {font-size: 10  pt; font-family: verdana;  font-weight:  normal}
    </style>
    </head>
    <body>
    <h1>Indicateurs</h1>
     
    <table border="1" width="500">
    <tbody>
    <tr>
    <td><b> nom</b></td>
    <td><b> date</b></td>
    <td colspan="3" align="center"><b> VLAGRD</b></td>
    <td colspan="7" align="center"><b> resid(REG)</b></td>
    </tr>
    <tr>
    <td><b> </b></td>
    <td><b> </b></td>
    <td bgcolor="green"><b>  </b></td>
    <td><b> G</b></td>
    <td bgcolor="green"><b>  </b></td>
    <td bgcolor="green"><b>  </b></td>
    <td><b> MIG</b></td>
    <td><b> SD</b></td>
    <td><b> ME</b></td>
    <td><b> FA</b></td>
    <td><b> AC</b></td>
    <td bgcolor="green"><b>  </b></td>
    </tr>
     
    <xsl:for-each select="DISCO/CENTRE">
     <xsl:sort select="DATE" data-type="text" order="descending" />
     <xsl:sort select="NOM" data-type="text" order="ascending" />
    <!--<xsl:sort select="NOM"/>-->
    <tr>
    <td> <xsl:value-of select="NOM"/></td>
    <td> <xsl:value-of select="DATE"/></td>
    <td bgcolor="green"><b>  </b></td>
    <td> <xsl:value-of select="VLAGRDG"/></td>
    <td bgcolor="green"><b>  </b></td>
    <td bgcolor="green"><b>  </b></td>
    <td> <xsl:value-of select="MIGREG"/></td>
    <td> <xsl:value-of select="MIGSDREG"/></td>
    <td> <xsl:value-of select="MIGMEREG"/></td>
    <td> <xsl:value-of select="MIGFAREG"/></td>
    <td> <xsl:value-of select="MIGACREG"/></td>
    <td bgcolor="green"><b>  </b></td>
    </tr>
    </xsl:for-each>
    </tbody>
    </table>
     
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>
    Mais il me crée autant de lignes qu'il trouve de CENTRE (vous me direz, c'est normal pour un xsl:for-each select="DISCO/CENTRE"). Comment faire pour n'avoir qu'une ligne pour le centre de nom "011" avec sur cette ligne les valeurs des balises NOM; DATE; RRF; VLAGRDE; VLAGRDG; MIGNRE ?

    Merci de votre aide

  2. #2
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Le champ RRF qui dans le 1er cas vaut 0461 et dans le 2ème vaut 0471 est-il à ignorer ?
    Doit-on aller chercher les champs absents de la première balise dans les suivantes de même nom ?
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci de cette prompte réponse.

    Effectivement, il faut considérer (même si ce n'est pas vrai dans l'exemple que j'ai donné) qu'une balise n'apparaît qu'une fois pour un nom donné. Il n'est pas nécessaire de vérifier que toutes les balises sont présentes pour chaque nom (même si a priori cela sera le cas).

    Merci encore.

  4. #4
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Voici ce que je propose comme modification:
    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
    <xsl:for-each select="DISCO/CENTRE">
     <xsl:sort select="DATE" data-type="text" order="descending" />
     <xsl:sort select="NOM" data-type="text" order="ascending" />
    <xsl:if test="not(preceding-sibling::CENTRE[NOM = current()/NOM])">
    <tr>
    <td> <xsl:value-of select="NOM"/></td>
    <td> <xsl:value-of select="/DISCO/CENTRE[NOM = current()/NOM and DATE][1]/DATE"/></td>
    <td bgcolor="green"><b>  </b></td>
    <td> <xsl:value-of select="/DISCO/CENTRE[NOM = current()/NOM and VLAGRDG][1]/VLAGRDG"/></td>
    <td bgcolor="green"><b>  </b></td>
    <td bgcolor="green"><b>  </b></td>
    <td> <xsl:value-of select="/DISCO/CENTRE[NOM = current()/NOM and MIGREG][1]/MIGREG"/></td>
    <td> <xsl:value-of select="/DISCO/CENTRE[NOM = current()/NOM and MIGSDREG][1]/MIGSDREG"/></td>
    <td> <xsl:value-of select="/DISCO/CENTRE[NOM = current()/NOM and MIGMEREG][1]/MIGMEREG"/></td>
    <td> <xsl:value-of select="/DISCO/CENTRE[NOM = current()/NOM and MIGFAREG][1]/MIGFAREG"/></td>
    <td> <xsl:value-of select="/DISCO/CENTRE[NOM = current()/NOM and MIGACREG][1]/MIGACREG"/></td>
    <td bgcolor="green"><b>  </b></td>
    </tr>
    </xsl:if>
    </xsl:for-each>
    Il y a d'abord un dédoublonnage sur NOM puis on remonte à la racine pour trouver toutes les valeurs pour le NOM courant.
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci !!! Ca marche !!! Tiens, je mets un smiley

    Décidément la puissance de ces forums et la disponibilité et la compétence de ses contributeurs m'épatera toujours.

    Merci encore

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

Discussions similaires

  1. [XSLT] lire le contenu des balises en xml dans un ordre précis
    Par ajax12 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 08/04/2010, 18h47
  2. [XSLT] Afficher le contenu integral d'une balise
    Par MainMa dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/02/2008, 11h41
  3. [XSLT]renommage récursif balises identiques
    Par arold dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 21/09/2007, 11h21
  4. [XSLT]tester le contenu d'une balise
    Par koudjo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/07/2006, 12h22
  5. balises identiques
    Par Phmichel dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 28/10/2002, 09h18

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