Utiliser XML et XSLT

 

Et la libxml2!!!!

Xml est plutôt à la mode ces derniers temps et comme son interêt n'est pas évident, je me permet cette publication pour illustrer un usage de xslt. Xslt permet de transformer du xml en html, en xml, de filtrer les données, de les formater. Un fichier xslt est un fichier xml contenant des instructions de traitement,je ne les traiterai pas ici, je préfère vous renvoyer à une littérature abondante sur le sujet, de nombreux sites traitent du sujet par exemple: http://www.zvon.org/xxl/XMLTutorial/General_fre/contents.html#10 pour xml et http://www.zvon.org/xxl/XSLTutorial/Output_fre/index.html pour xslt.

L'exemple que je vous propose transforme simplement un fichier xml contenant des données en un fichier html un peu à la manière d'une feuille de style .css, mais ayez à l'esprit que vous pouvez réaliser des transformations beaucoup plus poussées, cependant xslt a un fonctionnement "arborescent" qui m'a désorienté (et je suis très loin de l'avoir assimilé).

le fichier XML a transformer est de cette forme:

 <?xml version="1.0"?>
 <LA13>
   <LIGNE>
    <Matricule>XXXXXXX  U</Matricule>
    <Destinataire></Destinataire>
    <Nature>I</Nature>
    <Rang></Rang>
    <CodeEtat>09</CodeEtat>
    <CodeMotif>N </CodeMotif>
    <JC>R   10 0</JC>
    <OP>3</OP>
    <MO>20    0</MO>
    <MVT>3</MVT>
    <Debit>C     C-</Debit>
    <Capital></Capital>
    <Interets>70,23</Interets>
   </LIGNE>
   <LIGNE>
    <Matricule>XXXXXXX  F</Matricule>
    <Destinataire></Destinataire>
    <Nature>F</Nature>
    <Rang></Rang>
    <CodeEtat>09</CodeEtat>
    <CodeMotif>N </CodeMotif>
    <JC>R   10 0</JC>
    <OP>3</OP>
    <MO>20    0</MO>
    <MVT>3</MVT>
    <Debit>C     C-</Debit>
    <Capital></Capital>
    <Interets>130,12</Interets>
   </LIGNE>
  </LA13>

il contient plusieurs enregistrements, délimités par le tag <LIGNE>, le but du jeu est ici d'afficher ces enregistrements dans un tableau HTML. Dans un but de lisibilité, je ne montre ici que deux enregistrements

La feuille de style XSLT contient le code suivant:

 <?xml version="1.0"?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
   <H2>Liste LA 13</H2>
   <TABLE BORDER="1" CELLPADDING="3">
	<THEAD>
	 <TH>Matricule</TH>
	 <TH>Destinataire</TH>
	 <TH>Nature</TH>
	 <TH>Rang</TH>
	 <TH>Code Etat</TH>
	 <TH>Code Motif</TH>
	 <TH>JC</TH>
	 <TH>OP</TH>
	 <TH>MO</TH>
	 <TH>MVT</TH>
	 <TH>Debit</TH>
	 <TH>Capital</TH>
	 <TH>Interets</TH>
	 </THEAD>
	 <xsl:for-each select="LA13/LIGNE">
	<TR>
	 <TD>
	 <xsl:value-of select="Matricule"/>
	 </TD>
         <TD>
	 <xsl:value-of select="Destinataire"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="Nature"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="Rang"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="CodeEtat"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="CodeMotif"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="JC"/>
	 </TD>
         <TD>
	 <xsl:value-of select="OP"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="MO"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="MVT"/>
	 </TD>
         <TD>
	 <xsl:value-of select="Debit"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="Capital"/>
	 </TD>
	 <TD>
	 <xsl:value-of select="Interets"/>
	 </TD>
       </TR>
     </xsl:for-each>
   </TABLE>
  </xsl:template>
 </xsl:stylesheet>

L'instruction <xsl:for-each select="LA13/LIGNE"> va itérer sur chaque enregistrement et chaque <xsl:value-of select="nom_du_tag"/> va insérer la valeur contenue dans le tag <nom_du_tag>

Et maintenant le code Tcl qui va générer le fichier HTML attendu:

 package require xml
 package require dom::libxml2
 package require xslt
 set repcourant [pwd]

 #lecture fichier xml
 set fid_doc [open $repcourant/JOELA13sansmatricules.xml r]
 set XML [read $fid_doc]
 close $fid_doc

 #lecture feuille de style
 set fid_feuille [open $repcourant/JOELA13.xsl r]
 set XSLstylesheet [read $fid_feuille]
 close $fid_feuille

 #validation des fichiers xml et xslt
 set source_doc [::dom::libxml2::parse $XML]
 set ssheet_doc [::dom::libxml2::parse $XSLstylesheet]

 #compilation de la feuille de style xsl
 set ssheet [::xslt::compile $ssheet_doc]

 #transformation xslt
 set result_doc [$ssheet transform $source_doc]
 set result_html [::dom::libxml2::serialize $result_doc \
     -method [$ssheet cget -method]]

 #écriture dans un fichier
 set fich_sortie [open $repcourant/sortie.html w+]
 puts $fich_sortie $result_html

 #fin
 exit