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 :

Tableau html pris sur un XML avec le bon dimensionnement [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Points : 3 707
    Points
    3 707
    Par défaut Tableau html pris sur un XML avec le bon dimensionnement
    Bonjour,

    Ce post fait suite à un problème précédemment rencontré par ma part :

    http://www.developpez.net/forums/d1091790/autres-langages/xml-xsl-soap/xsl-xslt-xpath/selectionner-elements-sauf-seul/

    J'obtenais bien les données que je voulais mais malheureusement, en les plaçant dans mon tableau, je n'obtenais aucun alignement et il était impossible de retrouver tel <POSSIBLE_VALUES> appartenait à tel <KEY> par exemple.

    J'ai donc passé la journée à essayer de trouver une solution lors du parcours de mon XML avec la XSL pour aligner ça mais aucune solution n'a été concluante que ce soit avec utilisant les colspan ou les rowspan, je n'arrive toujours pas à aligner les celulles.

    L'objectif est d'avoir quelque chose comme l'image en PJ avec ce post.

    Code actuel :

    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="SECTION">
    			<table>
    				<caption><xsl:value-of select="@name"/></caption> 
     
    				<thead> 
    					 <tr> 
    					<th>Functional group</th>
    					<th>Name</th>
    					<th>Type</th>
    					<th>Default value</th>
    					<th>Min SCG version</th>
    					<th>Description</th>
    					<th>Possible values</th>
    					</tr>
    				</thead>
    				<tbody>
    						<xsl:variable name="linebreak">
    							<xsl:text>
    							</xsl:text>
    						</xsl:variable>
    						<!--column functional_group-->
    						<xsl:for-each select="KEY[generate-id() = generate-id(key('functional', concat(../@name, '|', @functional_group))[1])]">
    							<tr>
    								<td>
    									<strong><xsl:value-of select="@functional_group" /></strong>
    								</td>
    								<xsl:variable name="current-group" select="@functional_group"/>
    								<!--column name-->										
    								<td>
    									<table>
    												<xsl:for-each select="../KEY[@functional_group = $current-group]/@name">							
    													<tr>	
    														<xsl:choose>
    															<xsl:when test="current()=''"><td>Missing value</td></xsl:when>
    															<xsl:otherwise><td><xsl:value-of select="current()"/></td></xsl:otherwise>
    														</xsl:choose>
    													</tr>
    												</xsl:for-each>									
    									</table>
    								</td>
    							</tr>
    						</xsl:for-each>
     
     
    				</tbody>
    			</table>
    	</xsl:template>

    Enfin, je n'arrive pas à faire une requête XPATH à partir de la troisième colonne de mon tableau, le XPATH me renvoyant toujours nul alors que je demande simplement de me donner le bon attribut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:variable name="current-name" select="current()"/><xsl:for-each select="../KEY[@functional_group = $current-group and @name=$current-name]/@type">												
    				<!--ca ne renvoie rien ici-->										</xsl:for-each>

    Merci
    Images attachées Images attachées  

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Là il va falloir jouer du rowspan. Ça commence à être compliqué.
    Grosso-modo :

    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
    <table>
    <xsl:for-each select="KEY[generate-id() = generate-id(key('functional', concat(../@name, '|', @functional_group)))]">
      <xsl:variable name="group" select="@functional_group"/>
      <xsl:variable name="samegroup" select="../KEY[@functional_group = $group]"/>
      <xsl:for-each select="$samegroup">
        <xsl:variable name="key" select="."/>
        <xsl:for-each select="POSSIBLE_VALUES">
          <tr>
            <!-- si on est sur la première possible value de ce KEY, mettre les colonnes de début -->
            <xsl:if test="not(preceding-sibling::POSSIBLE_VALUES)">
              <!-- Si on est sur la première ligne de ce groupe, mettre la première colonne -->
              <xsl:if test="not($key/preceding-sibling::KEY)">
                <td rowspan="{count($samegroup/POSSIBLE_VALUES)}">
                  <xsl:value-of select="$group"/>
                </td>
              </xsl:if>
              <xsl:variable name="span" select="count($key/POSSIBLE_VALUES)"/>
              <td rowspan="{$span}">
                <xsl:value-of select="$key/@name"/>
              </td>
              ... et tout le reste
            </xsl:if>
            <!-- Mettre les colonnes de fin -->
            <td>
              <xsl:value-of select="@value"/>
            <td>
          </tr>
        </xsl:for-each>
      </xsl:for-each>
    </xsl:for-each>
    </table>

  3. #3
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Points : 3 707
    Points
    3 707
    Par défaut
    J'ai réussi à résoudre mon problème.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Si le résultat est assez différent de ce que j'ai montré, ça peut intéresser des gens.

  5. #5
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Points : 3 707
    Points
    3 707
    Par défaut
    Le début est le même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="KEY[generate-id() = generate-id(key('functional', concat(../@name, '|', @functional_group)))]">
     
    							<xsl:variable name="current-group" select="@functional_group"/>
    Je récupère le span grâce à count :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="span-group" select="count(../KEY[@functional_group = $current-group])"/>
    Sur un coup de chance, je remarque que les positions sont toujours égales à 1 pour la première colonne et donc je pose un rowspan que si position() = 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:for-each select="../KEY[@functional_group = $current-group]">
    								<tr>
    									<xsl:if test="position() =1">
    										<td rowspan="{$span-group}">
    											<strong><xsl:value-of select="@functional_group" /></strong>
    										</td>
    									</xsl:if>
    Le reste est facile, il suffit de poser les autres attributs :

    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
    <td>
    										<xsl:value-of select="current()/@name"/>
    									</td>
    									<td>
    										<xsl:value-of select="current()/@type"/>
    									</td>
    									<td>
    										<xsl:value-of select="current()/@default"/>
    									</td>
    									<td>
    										<xsl:value-of select="current()/@version_min"/>
    									</td>
    									<td>
    										<xsl:value-of select="current()/@description"/>
    									</td>
    									<td>
    										<table>
    											<tbody>
    												<xsl:for-each select="current()/POSSIBLE_VALUES">
    													<tr>
    														<td>
    															<xsl:value-of select="current()/@value"/>
    														</td>
    														<td>
    															<xsl:value-of select="current()/@description"/>
    														</td>
    													</tr>
    												</xsl:for-each>
    											</tbody>
    										</table>
    									</td>
    								</tr>
    							</xsl:for-each>
    					</xsl:for-each>						
    				</tbody>

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

Discussions similaires

  1. Extraction de données avec XSL sur des XML avec namespace
    Par snake264 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/02/2012, 11h16
  2. Création d'un HTML à partir d'un XML avec XSLT
    Par Ioan dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/03/2011, 19h51
  3. image de fond cellule tableau html, fixe sur scroll
    Par laurentSc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 08/09/2010, 19h25
  4. [c#][xml] requete xpath sur document xml avec espace de noms
    Par fab56 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/02/2009, 12h56
  5. [AJAX] Entités HTML extraites d'un XML avec JS pas interprétées
    Par RorolePro dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/06/2008, 15h43

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