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] for-each imbriqué


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 151
    Points : 89
    Points
    89
    Par défaut [XSLT] for-each imbriqué
    Salut tout le monde!
    en effet, dans mon document xml j'ai plusieurs chapitres, chacun contenant un titre et plusieurs Sous_titres.
    Au niveau du XSL, j'utilise un for-each afin d'afficher les titres. Seulement, je n'arrive pas à afficher les sous_titres de chaque chapitre.
    Voici à peu près le document xml:

    [/quote]<Table_matieres>
    <Chapitre>
    <Intitule_chapitre>Généralités</Intitule_chapitre>
    <Sous_titre>Le groupe</Sous_titre>
    <Sous_titre>Le travail au sein d'un groupe</Sous_titre>
    <Sous_titre>Le travail coopératif</Sous_titre>
    </Chapitre>
    <Chapitre>
    <Intitule_chapitre>Systèmes coopératifs</Intitule_chapitre>
    <Sous_titre>Le contexte</Sous_titre>
    <Sous_titre>Les systèmes d'information coopératifs</Sous_titre>
    </Chapitre>

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    sans ton xsl, on ne va pas pouvoir te la corriger...

  3. #3
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 151
    Points : 89
    Points
    89
    Par défaut
    Voici le xsl:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">

    <html>
    <head><title></title></head>
    <body>
    <xsl:for-each select="Livre/Chapitre">
    <xsl:value-of select="Intitule_chapitre"/>.<br></br>
    <xsl:for-each select="livre/Chapitre">
    <xsl:value-of select="Sous_titre"/>.<br></br>
    </xsl:for-each>
    <br></br>
    </xsl:for-each>

    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>
    Les Intitules_chapitre j'arrive a les visulaiser, en revanche les sous titres je n'y arrive pas!

  4. #4
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Euh ton code est bizarre, tu fais 2 for-each avec le même select, ca n'a donc pas d'intérêt...

    A mon avis ce serait plutôt quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
     
    <xsl:for-each select="chapitre">
        <xsl:value-of select="intitule" />
        <xsl:for-each select="sous-titre">
            <xsl:value-of select="sous-titre" />
        </xsl:for-each>
    </xsl:for-each>
     
    ...
    Mais ce serait sans doute plus facile si tu nous donnais le xml exact (pcq je vois pas de livre et toussa :s

  5. #5
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 151
    Points : 89
    Points
    89
    Par défaut
    D'accord, voici le xml complet:
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="Livre.xsl"?>
    <Livre>
    <Theme>Le travail coopératif et ses technologies</Theme>
    <Resume>Resumé ici</Resume>
    <Table_matieres>
    <Chapitre>
    <Intitule_chapitre>Introduction</Intitule_chapitre>
    </Chapitre>
    <Chapitre>
    <Intitule_chapitre>Généralités</Intitule_chapitre>
    <Sous_titre>Le groupe</Sous_titre>
    <Sous_titre>Le travail au sein d'un groupe</Sous_titre>
    <Sous_titre>Le travail coopératif</Sous_titre>
    </Chapitre>
    <Chapitre>
    <Intitule_chapitre>Systèmes d'information coopératifs</Intitule_chapitre>
    <Sous_titre>Le contexte</Sous_titre>
    <Sous_titre>Les systèmes d'information coopératifs</Sous_titre>
    </Chapitre>
    <Chapitre>
    <Intitule_chapitre>Le groupware</Intitule_chapitre>
    <Sous_titre>Définition du groupware</Sous_titre>
    <Sous_titre>Outils du groupware
    </Chapitre>
    <Chapitre>
    <Intitule_chapitre>Conclusion</Intitule_chapitre>
    </Chapitre>
    </Table_matieres>
    </Livre>
    Et voici le XSL complet:


    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlnssl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">

    <html>
    <head><title></title></head>
    <body>

    <div align="center"> <h3><font face="Verdana" color="#333399">
    <xsl:value-of select="Livre/Theme"/></font></h3></div><br/><br/>

    <font face="Verdana" size="2"><p style="line-height:150%">
    <b>Résumé: </b>
    <xsl:value-of select="Livre/Resume"/><br/><br/>
    <b>Table des matieres:</b><br></br>
    <xsl:for-each select="Livre/Table_matieres/Chapitre">
    <strong><xsl:value-of select="Intitule_chapitre"/>.</strong><br></br>
    <xsl:for-each select="Livre/Table_matieres/Chapitre/Sous_titre">
    <xsl:value-of select="Sous_titre"/>.<br></br>
    </xsl:for-each>
    </xsl:for-each>
    </html>

    </xsl:template>
    </xsl:stylesheet>

  6. #6
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Apparament l'erreur viendrait du fait que tu as plusieurs sous-titres par chapitre, et donc tu ne peux en afficher qu'un seul à la fois.

    J'ai réussi à détourner le problème, mais je suis pas spécialiste en XSL (loin de là, j'en ai ptet fait une fois ).

    Donc ma solution conciste à rajouter une balise à l'extérieur de chaque sous-titre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Chapitre>
        <Intitule_chapitre>Le groupware</Intitule_chapitre>
        <a>
            <Sous_titre>Definition du groupware</Sous_titre>
        </a>
        <a>
            <Sous_titre>Outils du groupware</Sous_titre>
        </a>
    </Chapitre>
    et le code pour l'extraire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:for-each select="Livre/Table_matieres/Chapitre">
        <strong><xsl:value-of select="Intitule_chapitre"/>.</strong>
        <br/><br/>
        <xsl:for-each select="a">
            <xsl:value-of select="Sous_titre"/>.
            <br/><br/>
        </xsl:for-each>
    </xsl:for-each>
    Si cette solution ne te convient pas, je sais pas t'aider... attend alors l'avis d'un pro

  7. #7
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 151
    Points : 89
    Points
    89
    Par défaut
    Merci beaucoup, ça marche! Et c'est intelligent comme solution pour un débutant

  8. #8
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Le plaisir est pour moi 8)

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Imbriquer des for-each pour retourner des valeurs d'attributs
    Bonjour,
    je suis débutant en XML et XSL. On m'a confié un fichier XML qui reproduit la structure d'un système de fichiers. Je souhaiterais appliquer une feuille XSL pour retourner en html l'arborescence des dossiers et fichiers.
    pour rebondir sur cette discussion, je cherche aussi à imbriquer des for-each pour retourner les valeurs des attributs des éléments sous chaque élément parent.
    Voici un extrait du fichier xml.
    Je n'ai aucun problème pour me positionner sur un élément puis faire un for-each pour retourner les attributs, mais quand il s'agit d'imbriquer ces for-each pour boucler sur chaque groupe, et dans chaque groupe, sur chaque dossier puis sur chaque fichier, je me perds.
    Qui pourra m'aider ?
    Merci d'avance
    RV

    <root_folder>
    <office ID="Office1">
    <group id="Group1">
    <folder id="myFolder" name="myFolderName">
    <file created="Tue May 03 17:41:56 CEST 2005" id="bb22642a2df5a973649d0174f4a0fa7b" label="the label of this file" locked="0" lockedBy="" name="the name of this file" owner="the name of its owner" revised="Tue May 03 17:41:56 CEST 2005" size="125952" type="application/msword" />
    <file created="Tue May 03 17:41:57 CEST 2005" id="a99a0c555c037a72228dc1775f137fbb" label="the label of this file" locked="0" lockedBy="" name="the name of this file" owner="the name of its owner" revised="Tue May 03 17:41:57 CEST 2005" size="347070" type="application/pdf" />
    [...]
    </folder>
    </group>
    </office>
    </root_folder>

  10. #10
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par mouna201 Voir le message
    Merci beaucoup, ça marche! Et c'est intelligent comme solution pour un débutant
    Mouais, adapter la structure d'un xml parce qu'on arrive pas a faire une transformation convenable... bof bof.

    Le for-each c'est mal! Il est la plupart du temps utilisé quand on ne sait pas ce qu'il se passe lors d'une transformation.

    Le stylesheet suivant donne d'abord tous les intitulés puis tous les sous-titres:
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet 
      	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    	version="1.0">
     
    <xsl:output method="xml" omit-xml-declaration="no" encoding="ISO-8859-1"/>
     
      <xsl:template match="/">
        <xsl:text>Hello from root!
        </xsl:text>
        <xsl:apply-templates select="//Chapitre/Intitule_chapitre" />
        <xsl:apply-templates select="//Chapitre/Sous_titre" />
      </xsl:template>
     
      <xsl:template match="Intitule_chapitre">
          <xsl:text>Intitulé</xsl:text><xsl:value-of select="position()" /><xsl:text> : </xsl:text><xsl:value-of select="." /><xsl:text>
          </xsl:text>
      </xsl:template>
     
      <xsl:template match="Sous_titre">
          <xsl:text>Sous-titre</xsl:text><xsl:value-of select="position()" /><xsl:text> : </xsl:text><xsl:value-of select="." /><xsl:text>
          </xsl:text>
      </xsl:template>
     
    </xsl:stylesheet>
    et celui-ci les intitulés avec les sous-titres imbriqués:
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet 
      	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    	version="1.0">
     
    <xsl:output method="xml" omit-xml-declaration="no" encoding="ISO-8859-1"/>
     
      <xsl:template match="/">
        <xsl:text>Hello from root!
        </xsl:text>
        <xsl:apply-templates select="//Chapitre/Intitule_chapitre" />
      </xsl:template>
     
      <xsl:template match="Intitule_chapitre">
          <xsl:text>Intitulé</xsl:text><xsl:value-of select="position()" /><xsl:text> : </xsl:text><xsl:value-of select="." /><xsl:text>
          </xsl:text>
        <xsl:apply-templates select="../Sous_titre" />
      </xsl:template>
     
      <xsl:template match="Sous_titre">
          <xsl:text>Sous-titre</xsl:text><xsl:value-of select="position()" /><xsl:text> : </xsl:text><xsl:value-of select="." /><xsl:text>
          </xsl:text>
      </xsl:template>
     
    </xsl:stylesheet>
    Pas besoin de for-each ici, à réserver pour les grosses transfo bien poillues où il faut traverser l'arbre xml dans plusieurs dimensions à la fois.

  11. #11
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Sedor8275 Voir le message
    Bonjour,
    ...
    Je n'ai aucun problème pour me positionner sur un élément puis faire un for-each pour retourner les attributs, mais quand il s'agit d'imbriquer ces for-each pour boucler sur chaque groupe, et dans chaque groupe, sur chaque dossier puis sur chaque fichier, je me perds.
    ...
    Là encore pas besoin de for-each, c'est une hérésie! Il faut comprendre un minimum le processus de transformation, ce n'est pas un language procédural donc déroutant au début.

    Il n'y a plus qu'à remplir les templates de l'exemple 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet 
      	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    	version="1.0">
     
    <xsl:output method="xml" omit-xml-declaration="no" encoding="ISO-8859-1"/>
     
      <xsl:template match="/">
        <xsl:text>Hello from root!
        </xsl:text>
        <xsl:apply-templates />
      </xsl:template>
     
      <xsl:template match="root_folder">
        <xsl:text>Hello from root_folder...
        </xsl:text>
        <xsl:apply-templates />
      </xsl:template>
     
      <xsl:template match="office">
        <xsl:text>Hello from office...
        </xsl:text>
        <xsl:apply-templates />
      </xsl:template>
     
      <xsl:template match="group">
        <xsl:text>Hello from group...
        </xsl:text>
        <xsl:apply-templates />
      </xsl:template>
     
      <xsl:template match="folder">
        <xsl:text>Hello from folder...
        </xsl:text>
        <xsl:apply-templates />
      </xsl:template>
     
      <xsl:template match="file">
        <xsl:text>Hello from </xsl:text><xsl:value-of select="name()" /><xsl:text>...
        </xsl:text>
        <xsl:text>Label: </xsl:text><xsl:value-of select="@label" /><xsl:text>
        </xsl:text>
        <xsl:text>Created: </xsl:text><xsl:value-of select="@created" /><xsl:text>
        </xsl:text>
        <xsl:text>Type: </xsl:text><xsl:value-of select="@type" /><xsl:text>
        </xsl:text>
      </xsl:template>
     
    </xsl:stylesheet>
    Ce qui nous donne:
    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
    Hello from root!
        Hello from root_folder...
     
    Hello from office...
     
    Hello from group...
     
    Hello from folder...
     
    Hello from file...
        Label: the label of this file
        Created: Tue May 03 17:41:56 CEST 2005
        Type: application/msword
     
    Hello from file...
        Label: the label of this file
        Created: Tue May 03 17:41:57 CEST 2005
        Type: application/pdf

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous,

    Afin d'éviter de me prendre des tirs à boulets rouges, je précise que je suis totalement débutant dans le XSL.

    J'ai donc, en toute logique, un "problème de débutant". J'ai beau lire les différents messages du forum, je ne vois pas comment résoudre mon souci.

    J'ai un fichier XML dont voici la structure :

    <FieldsDoc>
    <Fields>
    <Field>
    <FieldName>Nom_Colonne1</FieldName>
    <FieldValue>Valeur_Colonne1</FieldValue>
    </Field>
    <Field>
    <FieldName>Nom_Colonne2</FieldName>
    <FieldValue>Valeur_Colonne2</FieldValue>
    </Field>
    <Field>
    <FieldName>Nom_Colonne...</FieldName>
    <FieldValue>Valeur_Colonne...</FieldValue>
    </Field>
    <Field>
    <FieldName>Nom_ColonneN</FieldName>
    <FieldValue>Valeur_ColonneN</FieldValue>
    </Field>
    </Fields>
    </FieldsDoc>

    Je souhaiterais afficher dans un tableau uniquement certaines valeurs (sous condition), et dans un ordre précis.

    Exemple :
    - Colonne 4 : valeur 4
    - Colonne 3 : valeur 3
    - Colonne 1 : valeur 1 (si colonne N n'existe pas)
    - Colonne 2 : valeur 2 (si colonne N n'existe pas)

    J'ai 2 soucis :
    - je ne comprends pas, avec ma structure XML, comment gérer des conditions sur une autre colonne...
    - à l'aide de condition, j'arrive à sélectionner uniquement certains champs qui m'intéressent, mais la méthode ne me semble vraiment pas très "propre" (au sens "pas dans les règles de l'art"), et puis les enregistrements sortent dans l'ordre de la structure du fichier XML, et non dans l'ordre qui m'intéresse.

    <xsl:for-each select="FieldsDoc/Fields/Field">

    <xsl:if test="FieldName[contains(., 'Nom_Colonne4')]">
    <tr>
    <td><xsl:value-of select="FieldName"/></td>
    <td><xsl:value-of select="FieldValue"/></td>
    </tr>
    </xsl:if>

    <xsl:if test="FieldName[contains(., 'Nom_Colonne3')]">
    <tr>
    <td><xsl:value-of select="FieldName"/></td>
    <td><xsl:value-of select="FieldValue"/></td>
    </tr>
    </xsl:if>

    <xsl:if test="FieldName[contains(., 'Nom_Colonne1')] IF ?!!">
    <tr>
    <td><xsl:value-of select="FieldName"/></td>
    <td><xsl:value-of select="FieldValue"/></td>
    </tr>
    </xsl:if>

    <xsl:if test="FieldName[contains(., 'Nom_Colonne2')] IF ?!!">
    <tr>
    <td><xsl:value-of select="FieldName"/></td>
    <td><xsl:value-of select="FieldValue"/></td>
    </tr>
    </xsl:if>

    </xsl:for-each>

    Pas de possibilité de faire des for-each imbriqués (ou alors je ne pige pas comment), et j'ai cru comprendre que comme le fonctionnement n'était pas procédural, la logique était différente, et je ne l'ai malheureusement toujours pas comprise.

    D'avance un grand merci pour l'aide que vous pourrez m'apporter!

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Commence par nous montrer le code que tu veux obtenir après transformation, utiliser la balise [CODE] et indenter de sorte à être lisible.
    Parce que franchement, l'histoire de présenter les colonnes de 4 à 2, avec 3 et 1 au milieu, c'est pas clair.

    Pas de possibilité de faire des for-each imbriqués (ou alors je ne pige pas comment), et j'ai cru comprendre que comme le fonctionnement n'était pas procédural, la logique était différente, et je ne l'ai malheureusement toujours pas comprise.
    ? Tu mets un <xsl:for-each> à l'intérieur de ton <xsl:for-each>. Pas très difficile d'y penser, non ?

    À l'intérieur d'un template, le traitement est bel et bien procédural.

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

Discussions similaires

  1. [XSLT] for-each imbriqué et plusieurs noeuds
    Par Trunks dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 31/10/2008, 15h08
  2. [XSLT]for-each imbriqués, et autres galères...
    Par Sarrus dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 16/03/2006, 17h57
  3. [XSLT] for-each
    Par totoen dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 13/03/2006, 07h50
  4. [xslt] For-each dans template avec format XML (row)
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2005, 11h14
  5. [XSLT]for-each imbiqués
    Par Capt. Flame dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 24/10/2005, 12h57

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