transformation xml par xslt

transformation xml par xslt - XML/XSL - Programmation

Marsh Posté le 03-06-2005 à 11:35:37    

Bonjour, je voudrai transformer un fichier xml comprenant des lignes du type:
<eleve>
  <profil>4</profil>  
  <ex1>
      <t1>1</t1>
      <m1>1</m1>
  </ex1>  
  <ex2>
      <t3>1</t3>
      <c2>1</c2>
  </ex2>  
</eleve>  
<eleve>
  <profil>3</profil>  
  <ex1>
      <t0></t0>
  </ex1>  
  <ex2>
      <t1>1</t1>
      <c2>1</c2>
  </ex2>  
</eleve>  
 
en un fichier .txt du type:
ex1     ex2      profil
t1m1    t3c2      4
t0      t1c2      3  
 
grâce à xslt. Mon problème est que j'ai du mal a récuper t1m1, t3c2,t0 et t1c2 sous cette forme.

Reply

Marsh Posté le 03-06-2005 à 11:35:37   

Reply

Marsh Posté le 03-06-2005 à 11:56:18    

Il y a une fonction name() dans xpath qui te permet de récupérer le nom des balises...

Reply

Marsh Posté le 03-06-2005 à 13:53:17    

Plus précisément?

Reply

Marsh Posté le 03-06-2005 à 13:59:17    

xsl:value-of select="name()"

Reply

Marsh Posté le 03-06-2005 à 14:59:45    

Je dirais même plus...

<xsl:value-of select="name()" />


 :whistle:


Message édité par avander le 03-06-2005 à 15:00:17
Reply

Marsh Posté le 03-06-2005 à 15:00:21    

j'ai essayé cela mais ça ne fonctionne pas:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="eleve">
<xsl:apply-templates/>
</xsl:template>
  <xsl:template match="e01a">
    <xsl:for-each select="*">
      <xsl:attribute name="{name()}">
      </xsl:attribute>
    </xsl:for-each>  
  </xsl:template>
</xsl:stylesheet>  

Reply

Marsh Posté le 03-06-2005 à 15:04:37    

Même résultat avec:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="eleve">
<xsl:apply-templates/>
</xsl:template>
  <xsl:template match="e01a">
      <xsl:value-of select="name()" />
      </xsl:template>
</xsl:stylesheet>  

Reply

Marsh Posté le 03-06-2005 à 18:26:08    

J'ai nessayé avec ça aussi mais je n'obtient plus rien:
<xsl:template match="/">
<xsl:for-each select="eleve/e01a">
<xsl:for-each select="*"/>
<xsl:value-of select="name()"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>

Reply

Marsh Posté le 04-06-2005 à 21:16:19    

toujours pas trouvé.

Reply

Marsh Posté le 05-06-2005 à 15:02:05    

Le stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
<xsl:output encoding="iso-8859-1" method="text" omit-xml-declaration="yes" indent="yes"/>  
 
<xsl:template match="/">
  <!-- generer une belle petite entete -->
  <xsl:text>eleve</xsl:text>
  <xsl:text>&#09;</xsl:text><!-- tabulation -->
  <xsl:text>ex1</xsl:text>
  <xsl:text>&#09;</xsl:text><!-- tabulation -->
  <xsl:text>ex2</xsl:text>
  <xsl:text>&#09;</xsl:text><!-- tabulation -->
  <xsl:text>profil</xsl:text>
  <!-- generer le retour a la ligne -->
  <xsl:text>
</xsl:text>
  <!-- traverser le xml en limitant la selection a tous les eleves -->
  <xsl:apply-templates select="//eleve" />
  <!-- generer une belle petite ligne finale -->
  <xsl:text>&#09;</xsl:text><!-- tabulation -->
  <xsl:text>-----</xsl:text>
</xsl:template>  
 
<xsl:template match="eleve">
  <!-- pour chaque eleve rencontre: -->
   
  <!-- generer le no d'orde de l'eleve -->
  <xsl:value-of select="position()" />  
  <xsl:text>&#09;</xsl:text><!-- tabulation -->
  <!-- l'ordre des balises xml n'est pas celui demande en sortie, il faut donc
       guider le traitement... -->
  <!-- limiter la traitement aux enfants de ex1 -->
  <xsl:apply-templates select="ex1/*"/>
  <xsl:text>&#09;</xsl:text><!-- tabulation -->
  <!-- limiter la traitement aux enfants de ex2 -->
  <xsl:apply-templates select="ex2/*"/>
  <xsl:text>&#09;</xsl:text><!-- tabulation -->
  <!-- repêcher la valeur du profil directement -->
  <xsl:value-of select="./profil" />  
  <!-- generer le retour a la ligne -->
  <xsl:text>
</xsl:text>
</xsl:template>  
 
<xsl:template match="*">
  <!-- afficher le nom des balises qui ne font pas l'objet d'un template specifique  
       ( sachant qu'xslt compare les balises aux templates du stylesheet du haut  
       vers le bas) -->
  <xsl:value-of select="name()" />
</xsl:template>
 
</xsl:stylesheet>  
<!-- eof -->


 
le résultat:

eleve ex1 ex2 profil
1 t1m1 t3c2 4
2 t0 t1c2 3
 -----


 
 j'ai gagné quoi? :whistle:


Message édité par avander le 05-06-2005 à 15:03:44
Reply

Marsh Posté le 05-06-2005 à 15:02:05   

Reply

Marsh Posté le 05-06-2005 à 15:41:57    

Merci avander, je fais un essai tout de suite.

Reply

Marsh Posté le 05-06-2005 à 16:19:05    

Ca fonctionne sur le xml donné je vais essayer de le généralisé à un autre fichier contenant plus de données.  
Merci beaucoup.  
Si ce n'est pas trop abusé, comment puis-je générer mon retour à la ligne?

Reply

Marsh Posté le 05-06-2005 à 22:05:40    

J'avais pourtant mis des commentaires ( voir entre les balises <!-- ... --> )...
 


  ...
  <!-- generer le retour a la ligne -->
  <xsl:text>
</xsl:text>
...


 
Le retour à la ligne est génére comme si dessus, il faut l'encoder texto, on ne le voit pas mais après la première balise xsl:text tu fais un [enter], puis directement refermer la balise.  
 
Si tu as un editeur de code, active le mode qui te permet de voir les retours à la ligne, les tabulations etc..., tu verras que xsl:text contient bien un retour à la ligne.


Message édité par avander le 05-06-2005 à 22:07:55
Reply

Marsh Posté le 06-06-2005 à 17:18:56    

J'ai beau mettre les deux balises avoir un enter comme indiqué, lorsque le fichier est lu sous IE, il n'y a pas de retour à la ligne.

Reply

Marsh Posté le 06-06-2005 à 17:23:12    

A quel programme fais-tu appel pour visualiser le résultat?

Reply

Marsh Posté le 06-06-2005 à 19:42:43    

J'utilise MSXSL.EXE un utilitaire en ligne de commande qui fait appel à MSXML 4.0.  
 
Le résultat est un fichier texte donc un éditeur de code, voir le bon vieux notepad...  
 

Reply

Marsh Posté le 06-06-2005 à 20:25:28    

En fait je visualise le résultat sous internet explorer mais mon but est de transformer un fichier xml en un fichier arff exploitatable par le logiciel weka; C'est pour cela que j'aimerais faire des retours à la ligne puis trouver un moyen pour automatiser XML--XSLT-->TXT---rename-->ARFF

Reply

Marsh Posté le 06-06-2005 à 20:38:43    

Avec firefox, le retour à la ligne fonctionne

Reply

Sujets relatifs:

Leave a Replay

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