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] aide pour faire un tableau HTML avec fusion de lignes


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut [XSLT] aide pour faire un tableau HTML avec fusion de lignes
    Bonjour,

    voilà mon problème, je dois généré un tableau en HTML dont la partie gauche a plusieurs lignes fusionnées avec un rowspan, et la partie droit est plus acadamique (table normal sans aucun artifice)
    J'obtiens le nombre pour le rowspan sans trop de problème avec un count(), ce qui doit être affiché est bon et à la bonne place cependant tout est sur une seul ligne car je ne peux pas fermer la balise </TR> dans le for-each comme je voulais le faire car la balise de début doit être la même que la balise de fin...
    J'ai bien essayé de fainter avec des bidouille du genre :
    <xsl:if test="position()=last()">
    <xsl:text> </TR> </xsl:text>
    </xsl:if>
    mais voilà comme je fais ça dans un <xsl:for-each> ça m'est réfusé.
    je débute le XSL depuis une semaine, je suis un peu à cours à d'idée, si quelqu'un pouvait me dire comment je dois procéder, ça serait grandement apprécié!
    Merci à tout ceux qui prendront le temps et lire ce post et/ou réfléchir à mon problème!!

    Merry christmas à tous

    Thierry.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Ta balise <tr> est bien ouverte quelque part?
    Alors ferme-là au bon endroit, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <tr>
    <xsl:for-each select="columnentry">
    <td>...</td>
    </xsl:for-each>
    </tr>
    Je ne vois pas où est la difficulté.

    Ceci dit, si tu as des rowspan et des colspan à mettre ça et là, ton XML doit posséder un minimum d'info que tu dois traiter à l'intérieur du for-each.

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    a priori cela s'apparente à un problème de regroupement. Donne un peu plus de détails sur tes données et la façon dont tu veux les afficher.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour vos réponses spontanée.

    voilà le code XSL, très peu professionel, je vous l'accorde!!

    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
     
    	<xsl:template match="/"> 
    		<TABLE BORDER='1'> 
    			<TR>
    				<xsl:variable name="cnt" select="count(soc_port)"/>
    				<xsl:for-each select="/port/soc_port[1]/child::*">
    					<xsl:choose>
    						<xsl:when test="name()='details'">
    						</xsl:when>
    						<xsl:otherwise>
    							<TD> 
    								<xsl:value-of select="name()"/>
    							</TD>	
    						</xsl:otherwise>
    					</xsl:choose>
    				</xsl:for-each> 
    				<xsl:for-each select="/port/soc_port[1]/details/port_table/child::*">
    						<TD> 
    							<xsl:value-of select="name()"/>
    						</TD>	
    				</xsl:for-each> 
    			</TR>
    			<TR>
    				<xsl:for-each select="/port/soc_port[1]/child::*">
    					<xsl:choose>
    						<xsl:when test="name()='details'">
    							<xsl:for-each select="//port_table">
    								<xsl:if test="position()=last()">
    									<xsl:text> </TR> </xsl:text> 
    								</xsl:if>
    									<TD>
    										<xsl:value-of select="."/>
    									</TD>
    							</xsl:for-each>
    						</xsl:when>
    						<xsl:otherwise>
    							<TD ROWSPAN="$cnt">
    								<xsl:value-of select="."/>
    							</TD>
    						</xsl:otherwise>
    					</xsl:choose>
    				</xsl:for-each>
    			</TR>
     
    		</TABLE>
     
    	</xsl:template>

    le fichier XML à traiter :

    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
     
    <port>
    	<soc_port>
    		<code_soc>123</code_soc> 
    		<adr_soc>47 avenue here</adr_soc> 
    		<tel_soc>16554</tel_soc> 
    		<fax_soc>4654</fax_soc> 
    		<contrat_soc>debian</contrat_soc> 
    		<codeport_soc>63</codeport_soc> 
    		<details>
    			<port_table>
    				<adr_port>dfisze</adr_port> 
    				<nom_port>bastia</nom_port> 
    				<code_port>63</code_port> 
    			</port_table>
    		</details>
    	</soc_port>
    	<soc_port>
    		<code_soc>123</code_soc> 
    		<adr_soc>47 avenue here</adr_soc> 
    		<tel_soc>16554</tel_soc> 
    		<fax_soc>4654</fax_soc> 
    		<contrat_soc>debian</contrat_soc> 
    		<codeport_soc>63</codeport_soc> 
    		<details>
    			<port_table>
    				<adr_port>ethzeomiht</adr_port> 
    				<nom_port>rouen</nom_port> 
    				<code_port>63</code_port> 
    			</port_table>
    		</details>
    	</soc_port>
    	<soc_port>
    		<code_soc>123</code_soc> 
    		<adr_soc>47 avenue here</adr_soc> 
    		<tel_soc>16554</tel_soc> 
    		<fax_soc>4654</fax_soc> 
    		<contrat_soc>debian</contrat_soc> 
    		<codeport_soc>63</codeport_soc> 
    		<details>
    			<port_table>
    				<adr_port>hezg</adr_port> 
    				<nom_port>ajaccio</nom_port> 
    				<code_port>63</code_port> 
    			</port_table>
    		</details>
    	</soc_port>
    </port>

    Mon problème viernt sans doute qu'avant j'avais du le faire avec simpleXML en PHP, ce qui correspond plus à ma façon de voir les choses.
    D'ailleurs voilà la table que j'ai générée, qui correspond au résultat qu'il faut que j'obtienne via la feuille de style 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
     
    <table border=1>
    <tr> 
    	<td>code_soc</td>
    	<td>adr_soc</td>
    	<td>tel_soc</td>
    	<td>fax_soc</td>
    	<td>contrat_soc</td>
    	<td>codeport_soc</td>
    	<td>adr_port</td>
    	<td>nom_port</td>
    	<td>code_port</td>
    </tr>
    <tr>
    	<td rowspan='3'>123</td>
    	<td rowspan='3'>47 avenue here</td>
    	<th rowspan='3'>16554</td>
    	<td rowspan='3'>4654</td>
    	<td rowspan='3'>debian</td>
    	<td rowspan='3'>63</td>
    	<td>dfisze</td>
    	<td>bastia</td>
    	<td>63</td>
    </tr>
    	<td>ethzeomiht</td>
    	<td>rouen</td>
    	<td>63</td>
    </tr>
    	<td>hezg</td>
    	<td>ajaccio</td>
    	<td>63</td>
    </tr>
    </table>

    donc oui un <tr> avant le for-each et un après je le fais bien, mais j'essaye de faire d'autre </tr> dedans pour fermer mes lignes, ce qui n'est pas autorisé pour le XSL. Après peut-être que ma façon de fonctionner est complétement mauvaise, je suis ouvert à tout proposition.
    si y'a des bouts de codes peu limpides dites le moi.
    Merci pour votre aider

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    vous vous rendez compte, c'est noel et je suis toujours en train d'essayer de finaliser ce xsl de rien du tout

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Ton résultat en HTML est un peu bizarre: tu fermes des balises </tr> sans les ouvrir...

    En supposant que tu voulais faire un </tr><tr> et non un </tr> seul dans ta boucle <xsl:for-each> (ce qui est interdit comme tu le soulignes), voici une solution:
    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:param name="cnt" select="count(port/soc_port)"/>
     
     
    <xsl:template match="port">
    <TABLE BORDER='1'>
    <xsl:apply-templates select="soc_port"/>
    </TABLE>
    </xsl:template>
     
     
    <xsl:template match="soc_port">
    <TR>
     <xsl:for-each select="details/port_table/*">
      <TD><xsl:value-of select="."/></TD>
     </xsl:for-each>
    </TR>
    </xsl:template>
     
     
    <xsl:template match="soc_port[1]">
    <TR>
     <xsl:for-each select="*[name()!='details']">
      <TD><xsl:value-of select="name()"/></TD>
     </xsl:for-each>
     <xsl:for-each select="details/port_table/*">
      <TD><xsl:value-of select="name()"/></TD>
     </xsl:for-each>
    </TR>
    <TR>
     <xsl:for-each select="*[name()!='details']">
      <TD ROWSPAN="{$cnt}"><xsl:value-of select="."/></TD>
     </xsl:for-each>
     <xsl:for-each select="details/port_table/*">
      <TD><xsl:value-of select="."/></TD>
     </xsl:for-each>
    </TR>
    </xsl:template>
    Bonne année 2006!

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    merci camboui, je vais m'empresser de tester de ça!!
    eh oui je l'ai bien remarqué que c'était interdit mais pas moyen de trouver comment faire, faut dire que c'est tellement plus simple de faire ça avex simpleXMT
    en tout cas merci d'avoir pris le temps d'y penser je te tiens au courrant du résultat

    bonne année 2006 aussi

Discussions similaires

  1. aide pour construir un tableau php avec du sql
    Par tamtam64 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/05/2012, 21h42
  2. Utiliser un repeater pour faire un tableau HTML
    Par arngrimur dans le forum ASP.NET
    Réponses: 2
    Dernier message: 24/01/2012, 15h03
  3. Réponses: 22
    Dernier message: 20/05/2008, 10h25
  4. Réponses: 1
    Dernier message: 13/12/2006, 09h04
  5. [XSLT] probleme pour faire des tableaux html
    Par Lockless dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 16/06/2006, 16h04

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