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] gérer l'absence de noeud


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut [XSLT] gérer l'absence de noeud
    Bonjour,

    J'ai une petite question concernant l'écritue d'un HTML via un XSL à partir de XML.

    1. Le but:
    créer un tableau html à partir de plusieurs XML pour ensuite importer le tableau dans Excel
    2. Les données
    Elles peuvent être sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Root>
    <blabla1></blabla1>
    <blabla2></blabla2>
    </Root>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <Root>
    <blabla1></blabla1>
    <blabla2></blabla2>
    <blabla3></blabla3>
    <blabla4></blabla4>
    </Root>
    Donc dans certains XML, il y a des données que l'on ne retrouve pas dans d'autres.

    3. Ce que j'ai fait

    je construit le header, la première ligne du tableau et ensuite j'appelle
    le template.
    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
    <xsl:template match="Root">
        <html>
          <head>
            <title>Review</title>
          </head>
          <body bgColor="#FFFFFF">
    	<table border="1">
    	  <tr bgColor='#DDDDFF'>
    	    <td>Id</td>
               <xsl:for-each select="$TemplateFile/Titre">
    		<td><xsl:value-of select="@Name"/></td>
    	    </xsl:for-each>
    	  </tr>
    	  <xsl:apply-templates/>
    	</table>
          </body>
        </html>
      </xsl:template>
    et mes templates sont de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="blabla1">
         <td><xsl:value-of select="."/></td>
      </xsl:template>
    idem avec blabla2, 3 et 4

    4. Le problème
    Ben si un XML ne contient pas blabla3 par exemple, dans ce cas, mon tableau est raccourci
    et j'ai:
    Id..........blabla1........blabla2........blabla3...........blabla4
    id1...........bla1...........bla2............bla4
    id2...........bla1...........bla2............bla3...............bla4
    au lieu de
    Id..........blabla1........blabla2........blabla3...........blabla4
    id1...........bla1...........bla2................................bla4
    id2...........bla1...........bla2............bla3...............bla4
    Quelqu'un aurait-il une idée à me proposer?

    Merci beaucoup d'avance pour votre aide.
    Amicalement.
    mon site sur la culture japonaise et le Uechi-ryû: http://www.shinryu.fr

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    il te faut tester chaque noeud, mais au lieu d'un foreach, il te faudrait plutôt un traitement étendu à chaque fois avec des if et si le noeud n'existe pas, alors tu rajoutes une case vide ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    ben justement c'est ce que je ne sais pas faire...
    tester chaque noeud.
    Bon il est évident que ma structure de fichier est plus complexe... mais en fait je pensais que le problème se résolvait dire que si un noeud n'est pas présent dans le fichier alors qu'il est dans le template je mets <td></td>

    or je ne sais pas faire ça à se moment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="blabla1">
         <td>(if noeud n'existe pas then "" else value) </td>
      </xsl:template>
    mon site sur la culture japonaise et le Uechi-ryû: http://www.shinryu.fr

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    ah d'accord :

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:choose>
       <xsl:when test="blablabla1">Le noeud existe</xsl:when>
       <xsl:otherwise>Le noeud n'existe pas</xsl:otherwise>
    </xsl:choose>
    mais il ne faut pas utiliser un template car les templates ne sont utilisés que si le noeud est rencontré (et donc existe)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    je suis pas sur de comprendre comment ça va marcher...
    je vais essayer...

    merci beaucoup.
    mon site sur la culture japonaise et le Uechi-ryû: http://www.shinryu.fr

  6. #6
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    je ne comprends pas:
    ça ne fonctionne pas
    j'ai le XML suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <root>
    <doc>
           <blabla1>un truc</blabla1>
           <blabla3>un autre truc</blabla3>
    </doc>
    <doc>
           <blabla1>machin</blabla1>
           <blabla2>machin2</blabla2>
           <blabla3>machin3</blabla3>
    </doc>
    </root>
    et je fais maintenant cela:
    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
    <xsl:template match="Root">
     
    <html>
          <head>
            <title>Tablokipu</title>
          </head>
          <body bgColor="#FFFFFF">
    	<table border="1">
    	  <tr bgColor='#DDDDFF'>
                <!-- Ici je liste les entêtes -->
              </tr>
              <tr>
                    <xsl:apply-templates/>
              </tr>
        </table>
        </body>
    </html>
     
    <xsl:template match="doc">
         <xsl:choose>
              <xsl:when test="blabla1>
              </xsl:when>
              <xsl:when test="blabla2>
              </xsl:when>
              <xsl:when test="blabla3>
              </xsl:when>
              <xsl:otherwise>
                    <td></td>
              </xsl:otherwise>
         </xsl:choose>
    </xsl:template>
    Est-ce bien cela?

    Masi je n'ai pas au final:

    blabla1...........blabla2..............blabla3
    un truc..................................un autre truc
    machin...........machin2.............machin3
    qu'est-ce que je fais de mal?
    mon site sur la culture japonaise et le Uechi-ryû: http://www.shinryu.fr

  7. #7
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    je pense qu'il te faudrait plutôt faire quelque chose de ce style :
    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
    <xsl:template match="root">
    <html>
          <head>
            <title>Tablokipu</title>
          </head>
          <body bgColor="#FFFFFF">
    	<table border="1">
    	  <tr bgColor='#DDDDFF'>
                <!-- Ici je liste les entêtes -->
              </tr>
              <xsl:for-each select="doc">
              <tr>
                    <td>
                        <xsl:choose>
                             <xsl:when test="blabla1"><xsl:value-of select="blabla1"/></xsl:when>
                             <xsl:otherwise><xsl:text disable-output-encoding="yes">&amp;nbsp;</xsl:text></xsl:otherwise>
                        </xsl:choose>
                   </td>
                    <td>
                        <xsl:choose>
                             <xsl:when test="blabla2"><xsl:value-of select="blabla2"/></xsl:when>
                             <xsl:otherwise><xsl:text disable-output-encoding="yes">&amp;nbsp;</xsl:text></xsl:otherwise>
                        </xsl:choose>
                   </td>
                    <td>
                        <xsl:choose>
                             <xsl:when test="blabla3"><xsl:value-of select="blabla3"/></xsl:when>
                             <xsl:otherwise><xsl:text disable-output-encoding="yes">&amp;nbsp;</xsl:text></xsl:otherwise>
                        </xsl:choose>
                   </td>
               </tr>
               </xsl:for-each>
        </table>
        </body>
    </html>
    </xsl:template>
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  8. #8
    Membre du Club Avatar de gojira
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Merci beaucoup c'était bien cela :ola:
    (je suis en retard dans mes remerciements et mes clotures de posts)
    mon site sur la culture japonaise et le Uechi-ryû: http://www.shinryu.fr

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

Discussions similaires

  1. [XSLT] Problème de passage de variable en noeud
    Par Lepirate62 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/03/2008, 15h40
  2. Réponses: 2
    Dernier message: 27/09/2007, 14h04
  3. [XSLT] comment recopier le contenu d'un noeud sans ses fils
    Par st0ne dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/09/2007, 11h05
  4. [XSLT 2.0]Calculer le nombre de noeuds max contenu par un fragment-node
    Par Louis-Guillaume Morand dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 18/03/2007, 01h10
  5. [XSLT] Problème sur une comparaison de deux noeuds
    Par NicaeaCivitas dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 09/01/2007, 11h51

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