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] Imbrication de for-each


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut [XSLT] Imbrication de for-each
    bonjour, voila la structure de mon 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
    <?xml version="1.0" encoding="utf-16"?>
    <?xml-stylesheet type="text/xsl" href="xsldoc.xsl"?>
    <document>
      <paragraphe titre="ici, le titre du paragraphe">
        <titre>mon titre 1 du paragraphe 1</titre>
        <corps>
    	du texte formate avec saut de ligne tabulation, ...
        </corps>
        <titre>un autre titre dans le paragraphe 1</titre>
        <corps>
    	un autre corps de texte formate
        </corps>
      </paragraphe>
      <paragraphe titre="Ceci est un autre paragraphe attribut titre">
        <titre>titre 1 du paragraphe 2 du document</titre>
        <corps>
          un autre texte formate appartenant au paragraphe 2 sous le titre 1
        </corps>
        <corps>
          un autre texte formate n° 2 appartenant au paragraphe 2
          mais celui la n'a pas de titre
        </corps>
        <titre>Installation secondaire</titre>
        <corps>
          Ceci est un autre corps de texte
        </corps>
      </paragraphe>
    </document>
    un document a priori pas tres complexe
    j'ai beau essayé d'afficher ce document xml via un xsl mais je dois mal imbriquer mes boucles for each car le resultat affiché n'est pas du tout celui escompté. en effet, tous les titres se positionnent ensembles, les corps aussi, enfin, je n'ai presque plus de cheveux a force de me les arracher
    Si vous pouviez m'orienter en me donnant la bonne direction pour un xsl.
    le xml c'est super au debut on a des cheveux ...
    Merci

  2. #2
    Membre actif Avatar de amadoulamine1
    Inscrit en
    Avril 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 260
    Points : 270
    Points
    270
    Par défaut
    peut tu mettre au moins ton fichier xsl et ce que tu attend de ce dernier ...
    Ne testez jamais une erreur que vous ne savez pas gérer.
    de ne pas oublier

  3. #3
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut
    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:output method="html" encoding="ISO-8859-1" indent="yes" />
      <xsl:template match="document">
        <html>
          <head>
            <style>
              table {font-family:Verdana; border:solid 1px Navy;font-size:x-small;cellpadding:0;}
              body {font-family:Verdana; font-size:x-small;}
              div {font-family:Verdana;}
              pre {font-family:Verdana; font-size:x-small;}
              tr {background-color:pink;}
              .titre1 {color:Navy;backGround-color:lightSkyBlue;}
              .titre2 {color:Navy;font-family:Verdana;font-size:x-small;}
              td {border:solid 1px navy;}
            </style>
          </head>
          <body>
            <xsl:for-each select="//paragraphe">
              <xsl:choose>
                <xsl:when test="titre">
                  <div class="titre2">
                    <xsl:value-of select="titre"/>
                  </div>
                </xsl:when>
                <xsl:when test="corps">
                  <div>
                    <pre>
                      <xsl:value-of select="corps"/>
                    </pre>
                  </div>
                </xsl:when>
                <xsl:otherwise>
                  <pre>j'ai trouvé que dalle </pre>
                  </xsl:otherwise>
              </xsl:choose>
              <br />
            </xsl:for-each>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    j'ai l'impression que je ne boucle pas sur "paragraphe"
    si je retire les instructions de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                <xsl:when test="titre">
                  <div class="titre2">
                    <xsl:value-of select="titre"/>
                  </div>
                </xsl:when>
    j'affiche le noeud corps
    pourquoi corps n'est pas affiché si je garde les instructions notées plus haut ?

    je ne passe jamais dans otherwise alors que des noeuds autres existent

  4. #4
    Membre actif Avatar de amadoulamine1
    Inscrit en
    Avril 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 260
    Points : 270
    Points
    270
    Par défaut
    essaie avec ca!
    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
    <?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" indent="yes" />
      <xsl:template match="document">
        <html>
          <head>
            <style>
              table {font-family:Verdana; border:solid 1px Navy;font-size:x-small;cellpadding:0;}
              body {font-family:Verdana; font-size:x-small;}
              div {font-family:Verdana;}
              pre {font-family:Verdana; font-size:x-small;}
              tr {background-color:pink;}
              .titre1 {color:Navy;backGround-color:lightSkyBlue;}
              .titre2 {color:Navy;font-family:Verdana;font-size:x-small;}
              td {border:solid 1px navy;}
            </style>
          </head>
          <body>
            <xsl:for-each select="*">
            <xsl:for-each select="*">
     
    	            <xsl:if test="//titre">
    	              <div class="titre2">
    	                <xsl:value-of select="titre"/>
    	              </div><br/>
    	            </xsl:if>
    	            <xsl:if test="//corps">
    	              <div>
    	                <pre>
    	                  <xsl:value-of select="text()"/>
    	                </pre>
    	              </div>
    	            </xsl:if>
             </xsl:for-each>
              <br />
            </xsl:for-each>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    pour afficher le contenu on utilise "text()"
    Ne testez jamais une erreur que vous ne savez pas gérer.
    de ne pas oublier

  5. #5
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut
    Merci de t'interesser à mon problème
    ca marche, juste un petit peu de mise en page et ca devrait aller

    peux-tu m'expliquer pourquoi tu boucles 2 fois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            <xsl:for-each select="*">
              <xsl:for-each select="*">
    et pour quoi ne pas utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//paragraphe">

  6. #6
    Membre actif Avatar de amadoulamine1
    Inscrit en
    Avril 2005
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 260
    Points : 270
    Points
    270
    Par défaut
    la premiere boucle dans document et la seconde dans paragraphe ...
    Pour la seconde question je suis désolé je ne sais pas trop en tout cas ca na jamais marché pour moi et jusque la je n'avai encore jamais cherché à savoir pourquoi.
    Si quelqu'un veut bien éclairer ma lanterne ...
    Ne testez jamais une erreur que vous ne savez pas gérer.
    de ne pas oublier

  7. #7
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut
    ok, merci
    J'ai un autre souci si ca ne t'ennuie pas (puisque qqun de competent daigne repondre j'en profite)
    j'ai aussi un noeud TABLEAU ca et la dans mon doc xml
    lorsque le code plus bas est lu, mon tableau s'affiche plusieurs fois je ne vois pas pourquoi
    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="utf-16"?>
    <?xml-stylesheet type="text/xsl" href="C:\Dev\RAPT\Divers\document4.xsl"?>
    <document>
      <PARAGRAPHE titre="Titre de mon premier paragraphe">
        <TITRE>mon titre niveau2</TITRE>
        <CORPS>
          Le projet d'installation de chantier qui sera soumis à l'approbation du maître d'oeuvre comprendra
        </CORPS>
        <TABLEAU rows="2" cols="2">
          <CELL row="1" col="1">Ligne 1 colonne 1</CELL>
          <CELL row="1" col="2">Ligne 1 colonne 2</CELL>
          <CELL row="2" col="1">Ligne 2 colonne 1</CELL>
          <CELL row="2" col="2">Ligne 2 colonne 2</CELL>
        </TABLEAU>
        <CORPS>
          un autre corps
        </CORPS>
        <TITRE>c'est un autre titre niveau 2</TITRE>
        <CORPS>
          Le projet d'installation de chantier
          qui sera soumis à l'approbation du
          maître d'oeuvre patati patata ...
        </CORPS>
        <TABLEAU rows="4" cols="3">
          <CELL row="1" col="1">row 1 col 1</CELL>
          <CELL row="1" col="2">row 1 col 2</CELL>
          <CELL row="1" col="3">row 1 col 3</CELL>
          <CELL row="1" col="3">row 1 col 4</CELL>
          <CELL row="2" col="1">row 2 col 1</CELL>
          <CELL row="2" col="2">row 2 col 2</CELL>
          <CELL row="2" col="3">row 2 col 3</CELL>
          <CELL row="2" col="4">row 2 col 4</CELL>
          <CELL row="3" col="1">row 3 col 1</CELL>
          <CELL row="3" col="2">row 3 col 2</CELL>
          <CELL row="3" col="3">row 3 col 3</CELL>
          <CELL row="3" col="4">row 3 col 4</CELL>
          <CELL row="4" col="1">row 4 col 1</CELL>
          <CELL row="4" col="2">row 4 col 2</CELL>
          <CELL row="4" col="3">row 4 col 3</CELL>
          <CELL row="4" col="4">row 4 col 4</CELL>
        </TABLEAU>
      </PARAGRAPHE>
      <PARAGRAPHE titre="Ceci est un autre titre">
        <TITRE>titre de niveau 2 pour paragraphe 2</TITRE>
        <CORPS>
          Ceci est un autre corps de texte
        </CORPS>
      </PARAGRAPHE>
    </document>
    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
    <?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" indent="yes"/>
      <xsl:key match="//cell" use="@row" name="cells"/>
      <xsl:template match="document">
        <html>
          <head>
            <style>
              table {font-family:Verdana; border:solid 1px Navy;font-size:x-small;cellpadding:0;}
              body {font-family:Verdana; font-size:x-small;}
              div {font-family:Verdana;}
              pre {font-family:Verdana; font-size:x-small;}
              tr {background-color:pink;}
              .titre1 {color:Navy;backGround-color:lightSkyBlue;}
              .titre2 {color:Navy;font-family:Verdana;font-size:x-small;}
              td {border:solid 1px navy;}
            </style>
          </head>
          <body>
            <xsl:for-each select="//paragraphe">
              <div class="titre1">
                <xsl:apply-templates select="@titre"/>
              </div>
     
                <div class="titre2">
                  <xsl:apply-templates select="titre"/>
                </div>
     
              <div>
                <pre>
                  <xsl:apply-templates select="corps"/>
                </pre>
              </div>
              <xsl:for-each select="tableau">
                <table>
                  <xsl:for-each select="//cell[generate-id()=generate-id(key('cells',@row))]">
                    <xsl:variable name="row" select="@row"/>
                    <tr>
                      <xsl:for-each select="//cell[@row=$row]">
                        <td>
                          <xsl:value-of select="text()"/>
                        </td>
                      </xsl:for-each>
                    </tr>
                  </xsl:for-each>
                </table>
              </xsl:for-each>
              <br />
            </xsl:for-each>
     
          </body>

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Salut,
    Vaut mieux passer à une approche de template dans ton cas.
    Imbriquer les "for-each" atteint très vite ses limites.
    Voila qqchose qui devrait marcher :
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
      <xsl:template match="/">
        <html>
          <head>
            <style><![CDATA[
              table {font-family:Verdana; border:solid 1px Navy;font-size:x-small;cellpadding:0;}
              body {font-family:Verdana; font-size:x-small;}
              div {font-family:Verdana;}
              pre {font-family:Verdana; font-size:x-small;}
              tr {background-color:pink;}
              .titre1 {color:Navy;backGround-color:lightSkyBlue;}
              .titre2 {color:Navy;font-family:Verdana;font-size:x-small;}
              td {border:solid 1px navy;}
              ]]></style>
          </head>
          <body>
            <xsl:apply-templates select="//PARAGRAPHE"/>
          </body>
        </html>
      </xsl:template>
     
      <xsl:template match="PARAGRAPHE">
        <div class="titre1">
          <xsl:apply-templates select="@titre"/>
        </div>
        <div class="titre2">
          <xsl:apply-templates select="TITRE/text()"/>
        </div>
        <xsl:apply-templates select="*"/>
      </xsl:template>
     
      <xsl:template match="CORPS">
        <div>
          <pre>
            <xsl:value-of select="text()"/>
            <xsl:apply-templates select="*"/>
          </pre>
        </div>
      </xsl:template>
     
      <xsl:template match="TABLEAU">
        <table>
          <xsl:call-template name="ligneCompteur">
            <xsl:with-param name="iteration" select="1"/>
            <xsl:with-param name="nbCols" select="@cols"/>
            <xsl:with-param name="nbRows" select="@rows"/>
          </xsl:call-template>
        </table>
      </xsl:template>
     
      <xsl:template name="ligneCompteur">
        <xsl:param name="iteration"/>
        <xsl:param name="nbCols"/>
        <xsl:param name="nbRows"/>
        <xsl:if test="$iteration &lt;= $nbRows">
          <tr>
            <xsl:call-template name="colonneCompteur">
              <xsl:with-param name="iteration" select="1"/>
              <xsl:with-param name="nbCols" select="$nbCols"/>
              <xsl:with-param name="curRow" select="$iteration"/>
            </xsl:call-template>
          </tr>
          <xsl:call-template name="ligneCompteur">
            <xsl:with-param name="iteration" select="$iteration + 1"/>
            <xsl:with-param name="nbCols" select="$nbCols"/>
            <xsl:with-param name="nbRows" select="$nbRows"/>
          </xsl:call-template>
        </xsl:if>
      </xsl:template>
     
      <xsl:template name="colonneCompteur">
        <xsl:param name="iteration"/>
        <xsl:param name="nbCols"/>
        <xsl:param name="curRow"/>
        <xsl:if test="$iteration &lt;= $nbCols">
          <td>
            <xsl:value-of select="CELL[@row=$curRow and @col=$iteration]/text()"/>
          </td>
          <xsl:call-template name="colonneCompteur">
            <xsl:with-param name="iteration" select="$iteration + 1"/>
            <xsl:with-param name="nbCols" select="$nbCols"/>
            <xsl:with-param name="curRow" select="$curRow"/>
          </xsl:call-template>
        </xsl:if>
      </xsl:template>
    </xsl:stylesheet>

  9. #9
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut Beaucoup mieux
    Merci beaucoup
    Pourquoi, mes titres se chevauchent
    afficher la source html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <div class="titre1">Ceci est un autre titre</div>
    <div class="titre2">titre de niveau 2 pour paragraphe 2</div>titre de niveau 2 pour paragraphe 2<div>
    alors que je devrais avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <div class="titre1">Ceci est un autre titre</div>
    <pre>corps de texte</pre>
    <div class="titre2">titre de niveau 2 pour paragraphe 2</div>titre de niveau 2 pour paragraphe 2<div>
    merci

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Il y a sans doute des coquilles.
    Pour celle-là, faut faire qqchose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:template match="PARAGRAPHE">
        <div class="titre1">
          <xsl:value-of select="@titre"/>
        </div>
        <xsl:apply-templates select="*"/>
      </xsl:template>
     
      <xsl:template match="TITRE">
    	 <div class="titre2">
          <xsl:value-of select="text()"/>
        </div>
      </xsl:template>
    Enfin je suis pas sûr que ça fasse exactement ce que tu veux :p.

  11. #11
    Membre averti Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Points : 304
    Points
    304
    Par défaut Tout à fait ca
    Merci encore

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

Discussions similaires

  1. [XSLT] Fusionner des for-each
    Par bslota dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 18/07/2007, 10h13
  2. [XSLT] problème avec for-each
    Par aziziti dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 01/06/2007, 10h23
  3. [XSLT] combiner xsl:for-each-group et tokenize() ?
    Par Goulu dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 19/12/2006, 15h54
  4. [XSLT]problème avec for-each incompréhensible
    Par trotters213 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 21/02/2006, 10h31
  5. [xslt] Limiter un for-each aux x premiers éléments
    Par camboui dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 18/11/2005, 16h09

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