[Résolu] - [XSL] problème avec un xls:for-each

problème avec un xls:for-each [Résolu] - [XSL] - XML/XSL - Programmation

Marsh Posté le 05-10-2009 à 14:41:39    

Bonjour à tous :hello:
Voila j'ai un petit souci avec du xml et du xsl. Débutant en dév, j'ai toujours essayé d'en rester loin mais là j'ai pas eu le choix :o
 
J'ai besoin d'afficher un tableau de jalons (date + événement), j'ai donc mon tableau de 2 colonnes "Evénement" et "Date". Rien de bien difficile jusque là.
Ca se corse au niveau des lignes...
 
En fait mon fichier XML est généré via une fonction PHP. Les balises sont insérées en dur dans le code et le contenu est fourni par des variables.  
C'est peut-être pas super clair, mais à priori mon fichier .xml n'a aucun soucis (j'ai indenté moi-même après car ça ne fonctionnait pas si je le faisais dans la partie PHP où je créé mon fichier .xml) :  

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <?xml-stylesheet href="fiche.xsl" type="text/xsl"?>
  3. <fichehl>
  4.     <date>01-10-2009</date>
  5.     <titre><![CDATA[XSL3 - Design et jalons]]></titre>
  6.     <resp>Blabla</resp>
  7.     <desc><![CDATA[Mise en place du design.
  8. Test du nouveau code au niveau des jalons (génération auto des lignes).]]></desc>
  9.     <changes><![CDATA[* change1
  10. * change2
  11. * change3]]></changes>
  12.     <ww><![CDATA[* Qui
  13. * Quand]]></ww>
  14.     <jalons>
  15.         <jde>
  16.             <jdate>28-09-09</jdate>
  17.             <jevent><![CDATA[event 1]]></jevent>
  18.         </jde>
  19.         <jde>
  20.             <jdate>29-09-09</jdate>
  21.             <jevent><![CDATA[event 2]]></jevent>
  22.         </jde>
  23.         <jde>
  24.             <jdate>30-09-09</jdate>
  25.             <jevent><![CDATA[event 3]]></jevent>
  26.         </jde>
  27.     </jalons>
  28.     <fm><![CDATA[* FM1
  29. * FM2
  30. * FM3]]></fm>
  31.     <ep><![CDATA[* EP1
  32. * EP2
  33. * EP3]]></ep>
  34. </fichehl>


Passons au fichier .xsl :
J'ai créé un template approprié aux jalons (dans le doute) :

Code :
  1. <xsl:template name="jalons" match="//jalons">
  2.         <xsl:for-each select="//jde">
  3.             <tr>
  4.                 <td>
  5.                     <xsl:value-of select="//jevent"/>
  6.                 </td>
  7.                 <td>
  8.                     <xsl:value-of select="//jdate"/>
  9.                 </td>
  10.             </tr>
  11.         </xsl:for-each>
  12. </xsl:template>


Et voici la partie du fichier .xsl où ce template particulier est appelé et utilisé :

Code :
  1. <table id="jalons">
  2.     <tr>
  3.         <th>Evénement</th>
  4.         <th>Date</th>
  5.     </tr>
  6.     <xsl:call-template name="jalons"/>
  7. </table>


Le tout m'affichant ceci :  
http://img11.yfrog.com/img11/6610/resultatxml.jpg
 
Au lieux de m'afficher dans les lignes 2 et 3 : "event 2" et "event 3" ainsi que "29-09-09" et "30-09-09" pour la colonne "Date" :o
 
 
Vous avez une idée ?  
M'engueulez pas trop si c'est une faute bête, je débute en xml/xsl  [:ooterreuroo]  
 
Merci :jap:


Message édité par Seth_ le 05-10-2009 à 15:05:48
Reply

Marsh Posté le 05-10-2009 à 14:41:39   

Reply

Marsh Posté le 05-10-2009 à 14:59:09    

si tu enlèves les // devant jde, jevent et jdate ça marche pas mieux ?


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Marsh Posté le 05-10-2009 à 15:02:46    

Aiua a écrit :

si tu enlèves les // devant jde, jevent et jdate ça marche pas mieux ?


Arf, le méga boulet [:prozac]
C'était presque bien ça, il fallait enlever les // devant jevent et jdate en fait :jap:
 
Merci beaucoup Aiua :jap: ²²²

Reply

Marsh Posté le 05-10-2009 à 15:05:40    

il faut plutot utiliser current() pour faire référence à l'élément courant de ta boucle:

Code :
  1. <tr>
  2.    <td>
  3.        <xsl:value-of select="current()/jevent"/>
  4.    </td>
  5.    <td>
  6.        <xsl:value-of select="current()/jdate"/>
  7.    </td>
  8. </tr>

http://erwy.developpez.com/cours/l [...] le/#L1.1.2

Message cité 2 fois
Message édité par pataluc le 05-10-2009 à 15:06:54
Reply

Marsh Posté le 05-10-2009 à 15:07:24    

pataluc a écrit :

il faut plutot utiliser current() pour faire référence à l'élément courant de ta boucle:

Code :
  1. <tr>
  2.    <td>
  3.        <xsl:value-of select="current()/jevent"/>
  4.    </td>
  5.    <td>
  6.        <xsl:value-of select="current()/jdate"/>
  7.    </td>
  8. </tr>

http://erwy.developpez.com/cours/l [...] le/#L1.1.2


Je prends note :)
 
Merci à vous deux :jap:

Reply

Marsh Posté le 05-10-2009 à 17:09:05    

pataluc a écrit :

il faut plutot utiliser current() pour faire référence à l'élément courant de ta boucle:

Code :
  1. <tr>
  2.    <td>
  3.        <xsl:value-of select="current()/jevent"/>
  4.    </td>
  5.    <td>
  6.        <xsl:value-of select="current()/jdate"/>
  7.    </td>
  8. </tr>

http://erwy.developpez.com/cours/l [...] le/#L1.1.2


ça sert pas à grand chose, qd on nomme un noeud, c'est forcément un fils du noeud courant :o

 

et je suis quasi sur (j'ai pas testé) que tu peux aussi enlever les // devant jde :o
bon dans ton cas ça change pas grand chose parce que tu n'as qu'un noeud jalon, mais sinon ça ferait des trucs bizarre (ou si t'avais des noeuds jde ailleurs que comme fils de jalon :o)

Message cité 1 fois
Message édité par Aiua le 05-10-2009 à 17:10:21

---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Marsh Posté le 05-10-2009 à 17:13:59    

Aiua a écrit :


ça sert pas à grand chose, qd on nomme un noeud, c'est forcément un fils du noeud courant :o
 
et je suis quasi sur (j'ai pas testé) que tu peux aussi enlever les // devant jde :o
bon dans ton cas ça change pas grand chose parce que tu n'as qu'un noeud jalon, mais sinon ça ferait des trucs bizarre (ou si t'avais des noeuds jde ailleurs que comme fils de jalon :o)


Si j'enlève les // devant jde, plus rien ne s'affiche [:spamafote]

Reply

Marsh Posté le 05-10-2009 à 18:54:47    

ah oui, j'avais pas vu que tu appelles ton template par son nom, du coup ton match="//jalons" il sert à rien
 
mais ça serait plus propre de faire :
 

Code :
  1. <xsl:for-each select="/fichehl/jalons">  (ou "//jalons" si vraiment tu préfères :D)
  2.     <xsl:call-template name="jalons"/>
  3. </xsl:for-each>


 
et

Code :
  1. <xsl:template name="jalons">
  2.     <xsl:for-each select="jde">
  3.     ...
  4.     </xsl:for-each>
  5. </xsl:template>



---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.
Reply

Marsh Posté le 06-10-2009 à 09:48:33    

Aiua a écrit :

ah oui, j'avais pas vu que tu appelles ton template par son nom, du coup ton match="//jalons" il sert à rien

 

mais ça serait plus propre de faire :

Code :
  1. <xsl:for-each select="/fichehl/jalons">  (ou "//jalons" si vraiment tu préfères :D)
  2.     <xsl:call-template name="jalons"/>
  3. </xsl:for-each>


et

Code :
  1. <xsl:template name="jalons">
  2.     <xsl:for-each select="jde">
  3.     ...
  4.     </xsl:for-each>
  5. </xsl:template>



 

C'est fait, merci :jap:


Message édité par Seth_ le 06-10-2009 à 09:48:52
Reply

Sujets relatifs:

Leave a Replay

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