Representation xml d'un tableau a double entree

Representation xml d'un tableau a double entree - XML/XSL - Programmation

Marsh Posté le 09-05-2005 à 19:22:30    

Bonjour tout le monde,
 
je suis face a un probleme, et j'aurais besoin de vos conseils et remarques.
 
Je vous passe la presentation de ce que je dois faire pour aller directement au probleme.
 
Je dois "decrire" en xml un tableau a double entree. En gros j'ai des "entetes de colonnes" et "entetes de lignes".
 
Dans ma base, j'ai une table qui decrit les entetes de colonnes (nom, ordre) et une table qui decrit les entetes des lignes (nom, ordre).
J'ai enfin une table qui fait le lien entre les deux. Cette table defini une "valeur" qui se trouve a l'intersection d'une ligne et d'une colonne.
 
Je dois generer un xml qui represente cela, pour ensuite le passer a travers un XSL qui va me produire un code html.
 
Je voulais faire un truc du genre :

Code :
  1. <tableau>
  2.   <entetes-colonnes>
  3.     <entete>Colonne 1</colonne>
  4.     <entete>Colonne 2</colonne>
  5.     ...
  6.   </entetes-colonnes>
  7.   <entetes-lignes>
  8.     <entete>Ligne 1</entete>
  9.     <entete>Ligne 2</entete>
  10.     ...
  11.   </entetes-lignes>
  12.   <donnees>
  13.     <donnee ligne="Ligne 1" colonne="Colonne 1">56</donnee>
  14.     <donnee ligne="Ligne 2" colonne="Colonne 1">test</donnee>
  15.   </donnees>
  16. </tableau>


Deja une petite remarque, je peux utiliser des "uids" a la place des "noms" pour la ligne et la colonne dans "donee", ce n'est pas un probleme.
 
Maintenant viens le probleme de la XSL. Mes competences dans cette derniere ne sont pas du rang d'elite, c'est pour cela que je vous demande conseil.
 
Dans ma premiere approche (naive ?), je voulais avoir une "template" pour "entetes-colonnes" qui ajouterais chaque entete dans une sorte de "tampon". Ensuite lors du parsing de la template "entetes-lignes" j'aurais pu "puiser" dans ce tampon pour aller chercher les infos necessaires.
Pourquoi ais-je besoin de ce tampon ? Parceque a chaque intersection il doit y avoir un input.  
L'input serait genere par la xsl, mais cet input doit etre lie aux 2 entetes.
 
Je pourrais creer les input a l'avance dans la xml et comme ca ne pas avoir besoin de ce "tampon". Mais, ce tableau a double entree serait assez consequent, 20 x 20, 400 inputs ca fait beaucoup...
 
 
Etant donne que je sais pas comment realiser cela en XSL, je me suis dit que je pouvais utiliser un JS pour creer mon tableau par la suite (je previens, je suis dans un intranet maitrise :P).
 
Mais cela me gene pour plusieurs raisons :
1) Ca ne respecte pas "l'esprit" "xml/xsl". Le xml decrit les donnees, et le xsl les "transforme". Moi j'aurais une transformation "inachevee".
2) Il se peut que je doive imprimer le tableau par la suite. Mais pas a 1 exemplaire, du genre 100. J'avais pense creer une XSL pour obtenir un PDF plus facile a imprimer. Mais PDF ne supporte pas le JS ... :D
 
 
 
Alors voila, en resume, les questions importantes :
1) Connaissez vous une facon simple de decrire un "tableau a double entree". Ce dernier doit etre ensuite affiche en html et imprime.
2) Existe-t-il un "tampon" en XSL ? Je sais qu'il existe des variables en XSL, mais l'ideal serait une variable de type tableau. Ou sinon, existe-t-il des fonctions XSL sur les strings assez puissantes pour pouvoir "hacker" (lire bricoler) quelque chose.
3) Dois-je arreter la moquette au profit de l'herbe ?
 
PS : En redigeant ce post, je me suis rendu compte que je pourrais peut-etre reduire le tableau a double entree, a un bete tableau tout simple. Je vais regarder demain avec ma chefe, si cela est possible.
La question reste neanmoins ouverte (Vous allez pas vous en tirer comme ca :p).

Reply

Marsh Posté le 09-05-2005 à 19:22:30   

Reply

Marsh Posté le 10-05-2005 à 09:13:00    

Intéressant tout ça. Si je trouve 5 minutes, je ferais un essai :)

Reply

Marsh Posté le 10-05-2005 à 11:27:45    

Enfait apres avoir reflechi un peu j'ai reussi a faire ce que je voulais.
 
En gros, un tableau a double dimension, n'est en realite qu'un tableau a une dimension plus une premiere colonne "speciale".
 
Ensuite, il m'a simplement suffit de "faire mumuse" avec XPATH et ce fut regle.
Ben oui, avec XPATH, j'ai pas besoin de "tampon" ou quoi que se soit puisque je peux recuperer les nodes dont j'ai besoin a tout moment.
 
Voila un bout de mon xml, ainsi que les templates xsl :

Code :
  1. <tableau>
  2.      <entetes-colonnes>
  3.        <colonne uid="c1">Col. 1</colonne>
  4.        <colonne uid="c2">Col. 2</colonne>
  5.        <colonne uid="c3">Col. 3</colonne>
  6.        <colonne uid="c4">Col. 4</colonne>
  7.      </entetes-colonnes>
  8.      <entetes-lignes>
  9.        <ligne uid="l1">Lig. 1</ligne>
  10.        <ligne uid="l2">Lig. 2</ligne>
  11.        <ligne uid="l3">Lig. 3</ligne>
  12.        <ligne uid="l4">Lig. 4</ligne>
  13.      </entetes-lignes>
  14.      <valeurs>
  15.        <valeur colonne="c1" ligne="l1">12</valeur>
  16.        <valeur colonne="c2" ligne="l2">test</valeur>
  17.        <valeur colonne="c3" ligne="l1">foo</valeur>
  18.        <valeur colonne="c1" ligne="l4">bar</valeur>
  19.      </valeurs>
  20.     </tableau>


 
Et voila les templates associees :

Code :
  1. <xsl:template match="tableau">
  2.     <table>
  3.       <xsl:apply-templates/>
  4.     </table> 
  5.   </xsl:template>
  6.  
  7.   <xsl:template match="entetes-colonnes">
  8.     <thead>
  9.       <tr>
  10.         <th> </th>
  11.         <xsl:for-each select="colonne">
  12.           <th><xsl:apply-templates/></th>
  13.         </xsl:for-each>
  14.       </tr>
  15.     </thead>
  16.   </xsl:template>
  17.  
  18.   <xsl:template match="entetes-lignes">
  19.     <xsl:for-each select="ligne">
  20.     <xsl:variable name="lig" select="@uid"/>
  21.       <tr>
  22.         <td><xsl:apply-templates/></td>
  23.         <xsl:for-each select="../../entetes-colonnes/colonne">
  24.           <xsl:variable name="col" select="@uid" />
  25.           <xsl:variable name="val" select="../../valeurs/valeur[@colonne=$col and @ligne=$lig]" />
  26.           <td><input type="text" name="input_{$col}_{$lig}" value="{$val}" style="width:30px"/></td>
  27.         </xsl:for-each>
  28.       </tr>
  29.     </xsl:for-each>
  30.   </xsl:template>
  31.  
  32.   <xsl:template match="valeurs" />


 
Vi je sais, j'aurais pu utiliser des "call-template" au lieu du "apply-templates" (pas beau) et ainsi m'eviter la template vide pour "valeurs", mais quand j'ai essaye ca ne marchait pas, alors pour l'instant je laisse comme ca.
 
Si quelqu'un voit des erreurs, ou des ameliorations, faites moi signe :p

Reply

Marsh Posté le 12-05-2005 à 12:11:02    

Je pense que tu pourrais simplifier nettement à l'aide de la fonction Xpath id()...

Reply

Sujets relatifs:

Leave a Replay

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