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] création de tableau


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut [XSLT] création de tableau
    Bonjour,

    Je sais que l'on ne peut pas incrémenter directement une variable dans XSLT mais la solution de l'import d'un template ne me convient pas non plus.

    En fait, j'aimerais générer un tableau de 4 colonnes et où le nombre de ligne est inconnu.

    Avant de commencer à me lancer dans la programmation, je me suis fait un brouillon de la boucle à faire mais je me suis bien vite rendu compte que ce n'était pas possible.

    Voici mon brouillon:
    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
     
     
    i=1
     
    while (tant qu'il y a des liens){
     
    	if(i=0){write <tr>}
    	write <td>lien</td>
    	if(i=4){write </tr>}
     
    	if (i=4){
    	  i=1
    	}else{
    	  i=i+1
    	}	
     
    }
     
    if (i=1) {
       write <td>vide</td>
       write <td>vide</td>
       write <td>vide</td>
       write </tr>  
    }
     
    if (i=2) {
       write <td>vide</td>
       write <td>vide</td>
       write </tr>  
    }
     
    if (i=3) {
       write <td>vide</td>
       write </tr>  
    }
    c'est très approximatif comme brouillon, mais ça aide.

    Si vous avez des idées, je suis prenneur.

    Merci

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par yoda_style

    En fait, j'aimerais générer un tableau de 4 colonnes et où le nombre de ligne est inconnu.
    Comme ça je ne vois pas le problème
    for-each ou apply-templates sont fait pour ça

    la liste de tes liens est bien dans ton xml, non ?

  3. #3
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 262
    Points : 172
    Points
    172
    Par défaut
    sinon tu peux aller voir ce sujet

    Il répondra surement à tes questions...

  4. #4
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    voici mon 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
     
    <LINK>
      <TARGET>page1.htm</TARGET> 
      <NAME>lib.1</NAME> 
    </LINK>
    <LINK> 
      <TARGET>page2.htm</TARGET> 
      <NAME>lib.2</NAME> 
    </LINK>
    ...
    <LINK>
      <TARGET>page6.htm</TARGET> 
      <NAME>lib.6</NAME> 
    </LINK>
    et j'aimerais avoir le résultat 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
     
    <table>
      <tr>
        <td>lib.1</td>
        <td>lib.2</td>
        <td>lib.3</td>
        <td>lib.4</td>
      </tr>
      <tr>
        <td>lib.5</td>
        <td>lib.6</td>
        <td> </td>
        <td> </td>
      </tr>
    </table>
    Little_flower: Je regarde ce post et je m'attarderai sur les table-row, table-cell.

    je ne connaissais pas ça ...
    ... premier projet

  5. #5
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    ok, je vois le principe pour créer un tableau mais il y a encore un truc que je ne comprends pas.

    si mon XML fait 6 éléments, il me faut 2x4 cellules pour les mettre.
    Comment je fais pour créer les 2 cellules vides ?

  6. #6
    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
    Tu fais : nbLignes x nbColonnes modulo (reste de la division euclidienne) le nombre d'élément présent ; ça te donne le nombre d'élements vide à ajouter.

  7. #7
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    ça ne va pas, je ne trouve pas la solution !!!

    je n'arrive pas à utiliser les table-row, table-cell pour avoir une sortie HTML et même si je savais, ce langage ne sait pas faire une foutue boucle.

    Je ne vois pas comment je peux faire pour me sortir de ça.

    Pour l'instant, j'en suis au point où je compte les lignes qu'il va falloir afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:variable name="compteur" select="count(ELEMENT/LINK)"/>	
    <xsl:variable name="var1" select="$compteur div 4"/>
    Je connais le nombre de ligne, mais à partir de là, comment puis-je faire pour afficher une ligne de 4 datas et au besoin créer des lignes supplémentaires.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    j'ai trouvé un code sur le net qui me donne +/- satisfaction. Le seul problème est qu'il affiche les données sur 2 colonnes. j'aimerais les avoir sur 4

    le voici
    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
     
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="html" version="1.0" encoding="ISO-8859-1"
    indent="yes"/>
     
     <xsl:template match="/">
      <html>
       <body>
        <table>
         <xsl:apply-templates select="ELEMENT/LINK" mode="premiers"/>
        </table>
       </body>
      </html>
     </xsl:template>
     
     <xsl:template match="LINK[(position() mod 2) = 1]" mode="premiers">
      <tr>
       <xsl:apply-templates select="."/>
        <xsl:choose>
         <xsl:when test="following-sibling::LINK[1]">
          <xsl:apply-templates select="following-sibling::LINK[1]"/>
         </xsl:when>
         <xsl:otherwise>
          <td> </td>
         </xsl:otherwise>
        </xsl:choose>
      </tr>
     </xsl:template>
     
     <xsl:template match="LINK" mode="premiers"/>
     
     <xsl:template match="LINK">
      <td>
       <xsl:value-of select="TARGET"/>
      </td>
     </xsl:template>
     
    </xsl:stylesheet>
    A quoi correspond le mode="premiers" ?

  9. #9
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    mode="premiers"
    permet de traiter "LINK" de plusieurs façon differentes en gros d'avoir plusieurs match="LINK" qui font des trucs differents sur la même balise (ici c'est LINK)

  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
    Une solution qui marche chez moi :
    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
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method = "xml"  version="1.0" encoding="UTF-8" omit-xml-declaration="no" standalone="no" indent="yes"  />
     
    	<xsl:template match="/">
    		<xsl:variable name="compteur" select="count(//LINK)"/>	
    		<xsl:variable name="nbEmptyCells" select="4 - number($compteur) mod 4"/>		
     
    		<table>
    		<xsl:for-each select="//LINK[((position()-1) mod 4) = 0]">
    			<xsl:variable name="curLine" select="position()-1"/>
    			<tr id="{$curLine}">
    			<xsl:for-each select="//LINK[$curLine*4+1]|//LINK[$curLine*4+2]|//LINK[$curLine*4+3]|//LINK[$curLine*4+4]">
    				<td>
    					<xsl:value-of select="NAME"/>
    				</td>
    			</xsl:for-each>
    			<xsl:if test="position()=last()">
    					<xsl:call-template name="for.loop">
    						<xsl:with-param name="i">1</xsl:with-param>
    						<xsl:with-param name="count"><xsl:value-of select="$nbEmptyCells"/></xsl:with-param>
    					</xsl:call-template>
    			</xsl:if>
    			</tr>
    		</xsl:for-each>
     
     
    		</table>
     
    	</xsl:template>
     
    	<!-- Rename "old name" elements to "new name" -->
    	<xsl:template name="for.loop">
    		<xsl:param name="i"/>
    		<xsl:param name="count"/>
    		<xsl:if test="$i &lt;= $count">
    			<td></td>
    		</xsl:if>
    		<xsl:if test="$i &lt;= $count">
    			<xsl:call-template name="for.loop">
     
    				<xsl:with-param name="i">
    					<!-- Increment index-->
    					<xsl:value-of select="$i + 1"/>
    				</xsl:with-param>
    				<xsl:with-param name="count">
    					<xsl:value-of select="$count"/>
    				</xsl:with-param>
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
     
     
    </xsl:stylesheet>

  11. #11
    Membre du Club
    Inscrit en
    Mars 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 68
    Points : 44
    Points
    44
    Par défaut
    ok, c'est bon, j'ai une solution (similaire à la tienne Morbo)
    Merci à tous pour votre coup de main

    Voici mon code, j'espère qu'il pourra servir
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    <xsl:output method="html"/>
       <xsl:variable name="M" select="count(ELEMENT/LINK) div 4"/>
       <xsl:variable name="C" select="4"/>
     
       <xsl:template match="/">
          <TABLE>
            <TBODY>
                 <xsl:for-each select="//LINK[position() mod ($M * $C) = 1]">
                    <TR>
                      <xsl:for-each select=".|following-sibling::LINK[position() mod $M = 0 and position() &lt; $M * $C]">
    						<td class="logos" vAlign="top" width="25%">
                           <xsl:for-each select=".|following-sibling::LINK[position() &lt; $M]">
    					   <DIV class="relatedLinks">
    					   	<a target="_top" href="{TARGET}" title="{NAME}">&gt; <xsl:value-of select="NAME" disable-output-escaping="yes"/></a>						</DIV>
                           </xsl:for-each>
                         </td>
                      </xsl:for-each>
                      <xsl:if test="position() = last()">
                         <xsl:call-template name="cellules_vides">
                           <xsl:with-param name="nb" select="$C - ceiling(count(.|following-sibling::RELATED_LINK) div $M)"/>
                         </xsl:call-template>
                      </xsl:if>
                </TR>
                 </xsl:for-each>
               </TBODY>
    	</TABLE>
       </xsl:template>
     
       <xsl:template name="cellules_vides">
          <xsl:param name="nb"/>
          <xsl:if test="$nb >= 1">
             <td/>
            <xsl:call-template name="cellules_vides">
              <xsl:with-param name="nb" select="$nb - 1"/>
            </xsl:call-template>
       </xsl:if>      
       </xsl:template>
    </xsl:stylesheet>
    ça reste tout de même un foutu langage très peu étoffé. J'espère que ces initiateurs l'enrichiront un peu à l'avenir

    Encore merci et A+

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

Discussions similaires

  1. [Débutant][XSLT] Création tableau
    Par Mr Vincent dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 28/12/2007, 21h14
  2. Création de tableau
    Par rod59 dans le forum C
    Réponses: 10
    Dernier message: 12/11/2005, 16h40
  3. [xslt] déclaration de tableau
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 29/09/2005, 15h13
  4. [XSLT] Créer un tableau à partir de sa description
    Par Skyou dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 20/03/2005, 20h01
  5. [CR] Création de tableau et case à cocher
    Par aysse dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/11/2003, 17h07

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