XLS de débutant

XLS de débutant - XML/XSL - Programmation

Marsh Posté le 08-10-2007 à 21:28:44    

Bonjour à tous,
 
J'ai trouvé votre forum en cherchant de l'aide pour l'élaboration de XLS.
J'ai une petite qui ne devrait pas être trop compliquée, mais qui me pose des problèmes.
Je voudrais transformer un xml de cette sorte :
 

Code :
  1. <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2007-10-03T16:34:07">
  2. <node>
  3. <Name>Boufin, Stan</Name>
  4. <Organization>University of Alberta</Organization>
  5. </node>
  6. <node>
  7. <Name>Cuming, Steve</Name>
  8. <Organization>Boreal Ecosystems Research Ltd</Organization>
  9. </node>
  10. ...
  11. </dataroot>


 
En ceci :
 

Code :
  1. <node id="1">
  2. <data key="name">Boufin, Stan</data>
  3. <data key="organization">University of Alberta</data>
  4. </node>
  5. <node id="2">
  6. <data key="name">Cuming, Steve</data>
  7. <data key="organization">Boreal Ecosystems Research Ltd</data>
  8. </node>
  9. ...


 
Voilà ce que j'ai fait et qui n'a pas l'air de fonctionner (pas d'incrémentation d'id, pour commencer)...
 

Code :
  1. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2.     <xsl:template match="/">
  3.         <xsl:for-each select="dataroot/node">
  4.             <data key="name">
  5.             <xsl:value-of select="Name"/>
  6.             </data>
  7.         </xsl:for-each>
  8.         <xsl:for-each select="dataroot/node">
  9.             <data key="organisation">
  10.                 <xsl:value-of select="Organisation"/>
  11.             </data>
  12.         </xsl:for-each>
  13.     </xsl:template>
  14. </xsl:stylesheet>


 
Est-ce que quelqu'un a une idée de la manière de gérer ça ? Si oui, je suis preneur (merci !!!) ;)

Reply

Marsh Posté le 08-10-2007 à 21:28:44   

Reply

Marsh Posté le 08-10-2007 à 22:07:23    

Salut, il faut que tu comprennes que tu peux voir ton XSL (pas XLS au passage) comme une sorte de template à quoi ressemblera le XML final. La différence avec d'autres templates tient du fait que les différentes parties du template sont découpées et stockées à la suite les unes des autres dans le fichier. Concrètement, ça veut dire que si pour chaque <node> du XML d'origine, tu veux traiter les deux éléments fils, il faudra le faire en même temps dans le for-each car ton XSL doit déjà être structuré comme la structure du XML final. Voilà ce qui devrait fonctionner (j'ai pas testé et j'ai ajouté une variable XSL pour gérer l'indexation) :

Code :
  1. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2.   <xsl:param name="id" select="1" />
  3.   <xsl:template match="/">
  4.     <xsl:for-each select="dataroot/node">
  5.       <node id="$id">
  6.         <data key="name"><xsl:value-of select="Name"/></data>
  7.         <data key="organisation"><xsl:value-of select="Organisation"/></data>
  8.       </node>
  9.       <xsl:param name="id" select="$id+1" /><!-- à vérifier -->
  10.     </xsl:for-each>
  11.   </xsl:template>
  12. </xsl:stylesheet>


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

Marsh Posté le 08-10-2007 à 22:26:52    

Merci TheRom !!!
Je comprends beaucoup mieux, mille merci !
Il semblerait que la ligne ajoutant 1 à la variable id ne fonctionne pas, voici ce que me dit le débuggeur :

 

"Description: xsl: param must be immediately within a template, function or stylesheet
Description: xsl: param must be the first element within a template"


Message édité par rodolpheg le 08-10-2007 à 22:27:43
Reply

Marsh Posté le 08-10-2007 à 23:36:27    

oui en fait on peut pas utiliser les params comme ça, c'est fait pour autre chose
ceci devrait marcher :

Code :
  1. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2.   <xsl:template match="/">
  3.     <xsl:for-each select="dataroot/node">
  4.       <node id="../postition()">
  5.         <data key="name"><xsl:value-of select="Name"/></data>
  6.         <data key="organisation"><xsl:value-of select="Organisation"/></data>
  7.       </node>
  8.     </xsl:for-each>
  9.   </xsl:template>
  10. </xsl:stylesheet>

Je suis pas tellement sûr de la syntaxe et si j'ai mal compris la notion d'axz de recherche, il se pourrait que ça compte à l'envers ... Bref essaie de te documenter sur XPath, c'est ce qui t'aidera à faire ce genre de choses dans beaucoup de cas


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

Marsh Posté le 09-10-2007 à 00:08:44    

Hmmm, ça fonctionne super bien quand je l'utilise dans <xsl:value-of select="position()"/> mais pas directement après id=...
 
Je vais essayer de voir ça demain.
 
Merci beaucoup !!! :)

Reply

Marsh Posté le 09-10-2007 à 10:43:06    

oui alors à la place de <node id=...>...</node>, essaie ceci :

Code :
  1. <xsl:element name="node">
  2.   <xsl:attribute name="id"><xsl:value-of select="../position()"/></xsl:attribute>
  3.   <data key="name"><xsl:value-of select="Name"/></data>
  4.   <data key="organisation"><xsl:value-of select="Organisation"/></data>
  5. </xsl:element>

en fait je crois aussi que <node id="{../position()}"> devrait fonctionner (avec les accolades)


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

Marsh Posté le 09-10-2007 à 15:25:19    

C'est parfait !!! Vraiment, merci beaucoup. J'ai plus appris avec ton aide qu'en lisant trois tutoriels :)

Reply

Sujets relatifs:

Leave a Replay

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