[XSL] Générer un tableau dynamique

Générer un tableau dynamique [XSL] - XML/XSL - Programmation

Marsh Posté le 19-06-2007 à 18:23:30    

Me revoilà   :hello:  
 
J'aimerais donc générer un tableau HTML dynamiquement à partir de mon fichier XML qui est de la forme :
 

Code :
  1. <employee>
  2.   <note>2</note>
  3.   <tauxObj>60.00</tauxObj>
  4.   <midpointOld>0 EUR</midpointOld>
  5.   <comparatioOld>0.0000</comparatioOld>
  6.   <salref>70000.00</salref>
  7.   <salconv />
  8.   <midpoint>0 EUR</midpoint>
  9.   <comparatio>0.0000</comparatio>
  10.   </employee>


 
Je souhaite avoir systématiquement 4 colonnes en revanche le nombre de ligne est illimité. Une ligne du tableau doit ressembler à ceci :
 
Titre1 Data1 Titre2 Data2
...
 
Quand un élément XML est à vide je ne souhaite pas afficher la donnée (comme "salconv" dans mon exemple) et c'est bien là mon soucis : je peux avoir un nombre impaire de données à afficher.
 
Si j'ai 5 éléments j'aurais donc le tableau suivant :
 
Titre1 Data1 Titre2 Data2
Titre3 Data3 Titre4 Data4
Titre5 Data5
 
Merci pour votre aide  ;)

Reply

Marsh Posté le 19-06-2007 à 18:23:30   

Reply

Marsh Posté le 09-08-2007 à 01:45:20    

Je me permets d'upper ce post un peu vieux car j'ai moi aussi un problème similaire, en un peu plus simple.
A partir d'un XML du style:

Code :
  1. <links>
  2.   <link> (...) </link>
  3.   <link> (...) </link>
  4.   <link> (...) </link>
  5.   <link> (...) </link>
  6.   <link> (...) </link>
  7.   (...)
  8. </links>


j'aimerais générer un tableau à deux colonnes du style:

Code :
  1. <table>
  2. <tr><td>Contenu du Link1</td><td>Contenu du Link2</td></tr>
  3. <tr><td>Contenu du Link3</td><td>Contenu du Link4</td></tr>
  4. (...)
  5. <tr><td>Contenu du LinkN</td><td>&nbsp;</td></tr>
  6. </table>


en tenant compte du fait qu'il peut y avoir un nombre impair de liens, comme c'est le cas dans l'exemple.
Je pensais avoir la solution avec le code suivant, mais ça ne fonctionne pas car le parser interprète aussi les balises non-XSL.

Code :
  1. <xsl:template match="link">
  2. <xsl:if test="position() mod 2 = 1"><tr></xsl:if>
  3.   <td><b><xsl:value-of select="./title" /></b><br/>
  4.   <xsl:element name="a"><xsl:attribute name="href">http://<xsl:value-of select="./url" /></xsl:attribute><xsl:value-of select="./url" /></xsl:element>
  5.   </td>
  6. <xsl:if test="position() mod 2 = 0"></tr></xsl:if>
  7. <xsl:if test="(position() = last()) and (position() mod 2 = 1)"><td>&nbsp;</td></tr></xsl:if>
  8. </xsl:template>


Ligne 2, le parser ne trouve pas le </tr> qui devrait fermer le <tr> avant le </xsl:if> ...
 
Quelqu'un a-t-il une solution ?
 
Merci d'avance !

Reply

Marsh Posté le 09-08-2007 à 04:28:19    

Ben c'est pas très compliqué, faut juste comprendre ce qui foire et avoir des idées.
 
Là typiquement, ton doc XSL est pas valide parce qu'il est pas XML-compliant, j'en veux pour preuve ceci :

Code :
  1. <xsl:if test="position() mod 2 = 1"><tr></xsl:if>

l'élément <tr> n'est pas fermé et c'est pareil plus loin. Tu as déjà de la chance d'avoir un résultat (quoique ça n'aide pas à voir l'erreur)
 
Donc l'idée c'est que puisque tu vas être obligé de traiter 2 groupes <td> à la fois, il faut aller chercher le suivant, sous condition, avec XQuery/XPath. Au passage j'utilise un paramètre pour mémoriser la position actuelle.
 
Regardes mon exemple
test.xml

Code :
  1. <?xml version="1.0"?>
  2. <root>
  3. <el>yop1</el>
  4. <el>yop2</el>
  5. <el>yop3</el>
  6. <el>yop4</el>
  7. <el>yop5</el>
  8. <el>yop6</el>
  9. <el>yop7</el>
  10. </root>

test.xsl

Code :
  1. <?xml version="1.0" encoding="ISO-8859-15"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  3. <xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" media-type="te
  4. xt/html" indent="yes" />
  5. <xsl:template match="root">
  6.   <html>
  7.    <head>
  8.     <title>Test XSL</title>
  9.     <link rel="stylesheet" type="text/css" href="style.css" />
  10.    </head>
  11.    <body>
  12.     <table>
  13.      <xsl:apply-templates select="el" />
  14.     </table>
  15.    </body>
  16.   </html>
  17. </xsl:template>
  18. <xsl:template match="el">
  19.   <xsl:if test="position() mod 2 = 1">
  20.    <tr>
  21.     <td><xsl:value-of select="." /></td>
  22.     <xsl:if test="position() = last()"><td>&#160;</td></xsl:if>
  23.     <xsl:if test="position() != last()">
  24.      <xsl:param name="pos" select="position() + 1" />
  25.      <td>
  26.       <xsl:value-of select="../el[position() = $pos]" />
  27.      </td>
  28.     </xsl:if>
  29.    </tr>
  30.   </xsl:if>
  31. </xsl:template>
  32. </xsl:stylesheet>

au fait "&nbsp;" n'est pas une entité XSL-T valide, il faut utiliser "&#360;". C'est moche mais les entités XHTML ne sont pas connues par XSL-T, je crois qu'il y a un moyen de les importer mais je sais plus comment.


---------------
The Rom's, à votre service
Reply

Marsh Posté le 09-08-2007 à 09:20:33    

tiens, je connaissais pas &#360; pour &nbsp;. Moi, j'utilise &#160;
C'est quoi la différence?

Reply

Marsh Posté le 09-08-2007 à 16:15:58    

la différence c'est une erreur de frappe :sol:


---------------
The Rom's, à votre service
Reply

Marsh Posté le 09-08-2007 à 16:49:46    

ça m'a effleuré l'esprit, cette éventualité :D

Reply

Marsh Posté le 10-08-2007 à 01:31:58    

Merci beaucoup pour vos explications :)

Reply

Sujets relatifs:

Leave a Replay

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