XML + XSL vers tableau HTML

XML + XSL vers tableau HTML - XML/XSL - Programmation

Marsh Posté le 19-06-2009 à 16:49:42    

Bonjour,
 
J'ai beau chercher, je n'ai pas trouvé d'exemple pour résoudre "simplement" mon problème. J'ai un fichier XML avec un nombre indéterminé de noeuds sur 3 niveaux :

Code :
  1. <one text="1">
  2.    <two text="2">
  3.       <three text="3"/>
  4.       <three text="3"/>
  5.    </two>
  6.    <two text="2">
  7.       <three text="3"/>
  8.       <three text="3"/>
  9.    </two>
  10. </one>

Je cherche à afficher un tableau de ce type (avec les rowspan qui vont bien):

Code :
  1. <table> 
  2.   <tr>
  3.      <td rowspan=4>1</td>
  4.      <td rowspan=2>2</td>
  5.      <td>3</td>
  6.   </tr>
  7.   <tr>
  8.       <td>3</td>
  9.   </tr>
  10.   <tr>
  11.      <td rowspan=2>2</td>
  12.      <td>3</td> 
  13.   </tr>
  14.   <tr>
  15.       <td>3</td>
  16.   </tr>
  17. </table>

J'ai essayé avec des for-each  mais j'ai l'impression qu'il n'est pas possible d'ouvrir sans fermer une balise (et inversement) au sein d'un boucle de ce type...
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 19-06-2009 à 16:49:42   

Reply

Marsh Posté le 20-06-2009 à 01:06:46    

Je me suis trouvé une alternative. Voici le XML qui correspond plus à ma cible :

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <?xml-stylesheet type="text/xsl" href="test.xsl"?>
  3. <catalog>
  4. <name>Mes trucs</name>
  5. <cds>
  6.  <cd>
  7.   <title>Empire</title>
  8.   <artist>Bob</artist>
  9.   <trucs>
  10.    <truc>truc 1</truc>
  11.    <truc>truc 2</truc>
  12.    <truc>truc 3</truc>
  13.   </trucs>
  14.  </cd>
  15.  <cd>
  16.   <title>Hide</title>
  17.   <trucs>
  18.    <truc>truc 5</truc>
  19.    <truc>truc 6</truc>
  20.   </trucs>
  21.  </cd>
  22.  <cd>
  23.   <title>Greatest</title>
  24.   <artist>Dolly</artist>
  25.   <trucs>
  26.    <truc>truc 8</truc>
  27.    <truc>truc 9</truc>
  28.    <truc>truc 10</truc>
  29.    <truc>truc 11</truc>
  30.   </trucs>
  31.  </cd>
  32. </cds>
  33. </catalog>

Je l'ai mis en forme avec le XSL suivant:

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:template match="/">
  4. <html>
  5. <body>
  6. <table frame="border" cellspacing="0" cellpading ="0" >
  7. <xsl:for-each select="catalog/cds/cd">
  8.  <tr>
  9.   <xsl:variable name="rows" select="count(trucs/truc)" />
  10.   <td rowspan ="{$rows}"><xsl:value-of select="title"/></td>
  11.   <td rowspan ="{$rows}"><xsl:value-of select="artist"/></td>
  12.   <xsl:for-each select="trucs/truc">
  13.    <xsl:if test="position()=1">
  14.     <td><xsl:value-of select="."/></td>
  15.    </xsl:if>
  16.    <xsl:if test="position()!=1">
  17.      <tr><td><xsl:value-of select="."/></td></tr>
  18.    </xsl:if>
  19.   </xsl:for-each>
  20.  </tr>
  21. </xsl:for-each>
  22. </table>
  23. </body>
  24. </html>
  25. </xsl:template>
  26. </xsl:stylesheet>

Et ça focntionne plutôt bien mais j'ai 2 petites choses qui me gênent :
 - La balise <tr> ligne 9 n'est pas fermée avant l'ouverture de la balise <tr> de la ligne 19, pourtant je ne vois pas comment la fermer proprement...
 - Je suis obligé de traiter le premier élément comme un cas spécial <xsl:if test="position()=1">, n'y a t'il pas une solution pour éviter ça ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed