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] XML vers HTML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut [XSLT] XML vers HTML
    Bonjour à tous,

    Soit le genre de XML suivant
    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"?>
    <?xml-stylesheet type="text/xsl" href="file-xsl.xsl"?>
    <root>
      <ligne>
        <nom>DUPOND</nom>
        <prenom>Jeanne</prenom>
        <date>01/01/2001</date>
        <adresse>
          <num>125</num>
          <lib>Rue de la république</lib>
          <ville>Paris</ville>
        </adresse>
        <enfants>
          <enfant>
            <nom>DUPOND</nom>
            <prenom>Bob</prenom>
          </enfant>
          <enfant>
            <nom>DUPOND</nom>
            <prenom>Rose</prenom>
          </enfant>
        </enfants>
      </ligne>
      <ligne>
        <nom>DURAND</nom>
        <prenom>Roberta</prenom>
        <date>01/01/2001</date>
        <adresse>
          <num></num>
          <lib></lib>
          <ville></ville>
        </adresse>
        <enfants>
          <enfant>
            <nom>DURAND</nom>
            <prenom>Jean</prenom>
          </enfant>
        </enfants>
      </ligne>
    </root>
    que j'aimerais transformer en tableau html sous la 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
     
    <table>
     <tr>
       <td>DUPOND</td>
       <td>Jeanne</td>
       <td>01/01/2001</td>
       <td>125</td>
       <td>Rue de la république</td>
       <td>Paris</td>
       <td>
         <table>
          <tr>
            <td>DUPOND</td>
            <td>Bob</td>
          </tr>
          <tr>
            <td>DUPOND</td>
            <td>Rose</td>
          </tr>
         </table>
       </td>
     </tr>
     <tr>
       <td>DURAND</td>
       <td>Roberta</td>
       <td>01/01/2001</td>
       <td></td>
       <td></td>
       <td></td>
       <td>
         <table>
          <tr>
            <td>DURAND</td>
            <td>Jean</td>
          </tr>
         </table>
       </td>
     </tr>
    <table>
    J'ai codé ce XSL suivant, mais mon soucis serait d'arriver à différencier les noeuds <adresse> et <enfants>. Je les code de la même manière, et donc mon résultat html est faussé puisque je créé une nouvelle ligne pour chaque noeud enfant du noeud adresse.

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" indent="yes"/>
     
      <!-- Template colonne -->
      <xsl:template name="colonne">
        <xsl:if test="count(*) &gt;= 1">
          <td>
          <table border="1">
          <xsl:for-each select="*">
            <tr>
              <xsl:call-template name="colonne"/>
            </tr>
          </xsl:for-each>
          </table>
          </td>     
        </xsl:if>
        <xsl:if test="count(*) = 0">
          <td><xsl:value-of select="."/></td>
        </xsl:if>
      </xsl:template>
      <!-- Fin Template colonne -->
     
      <xsl:template match="root">
      <table border="1">
     
        <!-- Pour Chaque ligne -->
        <xsl:for-each select="*">
          <tr>
          <!-- Colorer une ligne sur 2 -->
          <xsl:if test="(position() mod 2)=0">
            <xsl:attribute name="bgcolor">green</xsl:attribute>
          </xsl:if>
     
          <!-- Pour chaque colonne -->
          <xsl:for-each select="*">
            <xsl:call-template name="colonne"/>
          </xsl:for-each>
          </tr>
        </xsl:for-each>
     
      </table>
      </xsl:template>
     
    </xsl:stylesheet>
    C'est pas aisé pour un newbie comme moi , sachant que ma XSL doit être générique, puisque mon XML peut être structuré différemment.

    Merci de votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    et voila un exemple de code qui devrait fonctionner
    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
     
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output 
      		encoding="ISO-8859-15"
      		method="xml"
      		indent="yes" />
     
    	<xsl:template match="root">
    		<table>
    			<xsl:apply-templates select="*"/>
    		</table>
    	</xsl:template>
     
    	<xsl:template match="ligne">
    		<tr>
    			<xsl:apply-templates select="*"/>
    		</tr>
    	</xsl:template>
     
    	<xsl:template match="enfants">
    		<td><table>
    			<xsl:apply-templates select="*"/>
    		</table></td>
    	</xsl:template>
     
    	<xsl:template match="enfant">
    		<tr>
    			<xsl:apply-templates select="*"/>
    		</tr>
    	</xsl:template>
     
    	<xsl:template match="*">
    		<td>
    			<xsl:value-of select="."/>
    		</td>
    	</xsl:template>
    </xsl:stylesheet>
    à mon avis tu n'utilises pas assez la notion de template

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut
    Je ne connais pas les noms de mes noeuds, je ne peux pas faire de template sur "enfants".

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 857
    Points : 884
    Points
    884
    Par défaut
    La seule solution que j'ai trouvé actuellement, vu que j'ai "la main" sur la génération des fichiers xml, c'est de rajouter un attribut sur l'élément <enfants> afin de le différencier...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
        <enfants racine='O'>
          <enfant>
            <nom>DUPOND</nom>
            <prenom>Bob</prenom>
          </enfant>
          <enfant>
            <nom>DUPOND</nom>
            <prenom>Rose</prenom>
          </enfant>
        </enfants>
    ...
    Et donc facilement identifiable dans mon xsl

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" indent="yes"/>
     
      <!-- Template colonne -->
      <xsl:template name="colonne">
        <xsl:if test="count(*) &gt;= 1">
          <xsl:choose>
            <xsl:when test="not(@racine)">
              <xsl:for-each select="*">
                <xsl:call-template name="colonne"/>
              </xsl:for-each>
            </xsl:when>
            <xsl:otherwise>
              <td>
              <table border="0">
              <xsl:for-each select="*">
                <tr>
                  <xsl:call-template name="colonne"/>
                </tr>
              </xsl:for-each>
              </table>
              </td>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:if>
        <xsl:if test="count(*) = 0">
          <xsl:if test="name()!='ID'">
          <td><xsl:value-of select="."/></td>
          </xsl:if>
        </xsl:if>
      </xsl:template>
      <!-- Fin Template colonne -->
     
      <xsl:template match="root">
      <table border="0">
     
        <!-- Pour Chaque ligne -->
        <xsl:for-each select="*">
          <tr>
          <!-- Colorer une ligne sur 2 -->
          <xsl:if test="(position() mod 2)=0">
            <xsl:attribute name="bgcolor">green</xsl:attribute>
          </xsl:if>
     
          <!-- Pour chaque colonne -->
          <xsl:for-each select="*">
            <xsl:call-template name="colonne"/>
          </xsl:for-each>
          </tr>
        </xsl:for-each>
     
      </table>
      </xsl:template>
     
    </xsl:stylesheet>
    Mais bon cela me convient pas forcément, donc si quelqu'un a une idée qui m'éviterait de modifier mon XML, ce serait sympa.

    Merci d'avance.

Discussions similaires

  1. [XSLT] Passage d'une image d'XML vers HTML
    Par LuNeLu dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/11/2007, 10h01
  2. [XSLT]retour charriot xml vers html
    Par toma22 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/10/2007, 19h07
  3. xml vers html via xslt
    Par julien.63 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 23/10/2007, 10h16
  4. [XSLT] probleme de copie de balise de XML vers HTML via XSL
    Par Clercq dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/11/2006, 13h52
  5. [XSLT]XML vers tableau html
    Par lcdDEV dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/10/2006, 16h55

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