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 :

Liste des différentes valeurs d'un sous élement dans une liste [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Liste des différentes valeurs d'un sous élement dans une liste
    Bonjour

    Depuis quelques jours je bute sur une transformation XML qui pourtant me semble classique car elle me fait penser à une rotation lignes-colonnes. Pourtant je ne trouve pas de documentation qui m'aiderait à résoudre mon problème que j'expose ci-dessous. Mais je ne recherche peut-être pas avec les bons mots-clefs.

    J'aurais besoin, à partir d'un XML dont les éléments "date" contiennent des éléments prévision de températures sur différentes villes, de fabriquer un tableau HTML avec les dates en colonnes et une ligne pour chaque ligne.

    C'est à dire j'ai un XML de cette forme

    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
     
    <racine>
       <dates>
          <date jour="jour1">
              <prevision>
                  <ville>ville1</ville>
                  <temperature>15<temperature>
                  <vent>S-O</vent>
              </prevision>
              <prevision>
                  <ville>ville2</ville>
                  <temperature>13<temperature>
                  <vent>N-O</vent>
              </prevision>
              <prevision>
                   ...
              </prevision>     
          </date>
     
          <date jour="jour2">
              <prevision>
                  <ville>ville1</ville>
                  <temperature>18<temperature>
                  <vent>S-E</vent>
              </prevision>
              <prevision>
                  <ville>ville2</ville>
                  <temperature>15<temperature>
                  <vent>N</vent>
              </prevision>
              <prevision>
                   ...
              </prevision>     
          </date>
          <date>
                ...
          </date>
       </dates>
    </racine>
    Que je voudrais transformer en un tableau HTML de ce genre

    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
     
    <table>   
       <tbody>
           <tr>
                <th> </th>  
                <th colspan="2"> Jour 1 </th>
                <th colspan="2"> jour 2 </th> 
                ... 
           </tr>
           <tr>
                <th> </th>
                <th></th>
                <th>Vent</th> 
                <th></th>
                <th>Vent</th> 
                ... 
           </tr>
           <tr>
                <th> Ville 1 </th>
                <td> 15 </td>
                <td> S-O </td> 
                <td> 13 </td>
                <td> N-O </t> 
                ... 
           </tr>
           <tr>
                <th> Ville 2 </th>
                <td> 18 </td>
                <td> S-E </td> 
                <td> 15 </td>
                <td> N </t> 
                ... 
           </tr>
           ....
     
       </tbody>
    </table>
    Pour afficher un tableau comme ci-dessous
    -------------------------------
    ! jour 1 ! jour 2 ! ...
    -------------------------------
    ! t°C ! vent ! t°C ! vent ! ...
    -----------------------------------------
    ! ville 1 ! 15 ! S-O ! 13 ! N-O ! ...
    -----------------------------------------
    ! ville 2 ! 18 ! S-E ! 15 ! N ! ...
    -----------------------------------------
    ! ... ! ! ! ! ! ...
    -----------------------------------------

    A priori, je ne connais pas le nombre de jours ni le nombre de villes.

    Je n'ai pas de problème pour créer les colonnes grâce à xsl-for-each sue l'élément "date".

    En revanche je n'arrive pas à créer les lignes correspondant aux villes.
    Je suppose qu'il faudrait que je crée une liste contenant une seule fois chaque ville.

    Je me suis orienté vers xsl:key, mais sans succès jusqu'à présent.

    Quelqu'un saurait-il m'aiguiller dans la bonne direction ou vers un page traitant un sujet semblable ?

    Merci

    _Rainbow

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Ne suffit-il pas simplement de prendre la liste des villes du premier jour ? Tous les jours ont la même liste de villes de toute façon, non ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Il se peut que ce genre de problème soit "classique", mais je trouve chaque fois devant ce genre de problème on se trouve presque une expérience nouvelle quoique le fil conducteur raisonnant soit constant. Au lieu de chercher parmi de millier de pages plus ou moins pertinent, je trouve plus productif d'écrire chaque fois à nouveau. Au premier temps, je peux faire ça. Après, vous pouvez l'optimisez un peu...
    Code xml : 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
    <xsl:output method="html" omit-xml-declaration="yes" encoding="utf-8" indent="yes" />
    <xsl:key name="jour" match="date/@jour" use="." />
    <xsl:key name="ville" match="ville" use="." />
    <xsl:template match="/">
        <html>
        <head></head>
        <body>
            <xsl:apply-templates select="racine/dates[date]" mode="table" />
        </body>
        </html>
    </xsl:template>
    <xsl:template match="dates" mode="table">
        <table border="1">
        <tbody>
        <tr>
        <th>&#xa0;</th>
        <xsl:for-each select="date/@jour[generate-id()=generate-id(key('jour', .)[1])]">
            <xsl:sort select="." data-type="text" order="ascending" />
            <th colspan="2"><xsl:value-of select="." /></th>
        </xsl:for-each>
        </tr>
        <tr>
        <th>&#xa0;</th>
        <th></th>
        <th>Vent</th> 
        <th></th>
        <th>Vent</th> 
        </tr>
        <xsl:for-each select="date/prevision[generate-id(ville)=generate-id(key('ville',ville)[1])]">
            <xsl:sort select="." data-type="text" order="ascending" />
            <xsl:variable name="cv" select="ville" />
            <tr>
            <th><xsl:value-of select="$cv" /></th>
            <xsl:for-each select="$cv/ancestor::dates/date[generate-id(@jour)=generate-id(key('jour', @jour)[1])]">
                <xsl:sort select="." data-type="text" order="ascending" />
                <xsl:variable name="cj" select="@jour" />
     
                <xsl:choose>
                    <xsl:when test="$cv/ancestor::dates/date[@jour=$cj]/prevision[ville=$cv]">
                        <td><xsl:value-of select="$cv/ancestor::dates/date[@jour=$cj]/prevision[ville=$cv]/temperature" /></td>
                        <td><xsl:value-of select="$cv/ancestor::dates/date[@jour=$cj]/prevision[ville=$cv]/vent" /></td>
                    </xsl:when>
                    <xsl:otherwise>
                        <td>&#xa0;</td>
                        <td>&#xa0;</td>
                    </xsl:otherwise>
                </xsl:choose>
     
            </xsl:for-each>
            </tr>
        </xsl:for-each>
        </tbody>
        </table>
    </xsl:template>

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bonjour Tsuji

    La solution proposée est excellente.
    J'ai peu d'occasions d'avoir à faire du XSL et, certes, à chaque fois j'ai tendance à ramer mais cette proposition m'enseigne des notions que je ne connaissais pas et qu'il me faudra approfondir.
    Je suis d'accord sur votre remarque concernant la réécriture ; d'ailleurs, c'est ce que je vais avoir à faire car mon XML est plus complexe que ce que j'ai présenté pour mieux expliciter mon problème.

    Je vous remercie de votre aide.
    Cordialement
    _Rainbow

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/11/2014, 22h36
  2. [XL-2003] Ctrl C / Ctrl V Spécial (Valeurs) d'un sous total d'une liste vers une autre feuille
    Par graphikris dans le forum Macros et VBA Excel
    Réponses: 43
    Dernier message: 18/05/2013, 15h39
  3. [XL-2003] Sous Totaux dans une liste grace à des "Inputbox".
    Par graphikris dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/05/2013, 17h37
  4. Proposer une liste des différentes monnaies
    Par DotNET74 dans le forum Windows Phone
    Réponses: 5
    Dernier message: 14/07/2011, 10h11
  5. comment ajouter des élements dans une liste ?
    Par ryoussef19 dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 15/06/2007, 16h02

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