• Aucun résultat trouvé

4.XML et PHP

4.1 Fichiers XML et feuilles de style XSL

Considérons le fichier XML suivant qui pourrait représenter le résultat de simulations : <?xml version="1.0" encoding="windows-1252"?>

<simulations>

<simulation marie="oui" enfants="2" salaire="200000" impot="22504"/> <simulation marie="non" enfants="2" salaire="200000" impot="33388"/> </simulations>

Si on le visualise avec IE 6, on obtient le résultat suivant :

IE6 reconnaît qu'il a affaire à un fichier XML (grâce au suffixe .xml du fichier) et le met en page d'une façon qui lui est propre. Avec Netscape on obtient une page vide. Cependant si on regarde le code source (View/Source) on a bien le fichier XML d'origine :

Pourquoi Netscape n'affiche-t-il rien ? Parce qu'il lui faut une feuille de style qui lui dise comment transformer le fichier XML en fichier HTML qu'il pourra alors afficher. Il se trouve que IE 6 a lui, une feuille de style par défaut lorsque le fichier XML n'en propose pas, ce qui était le cas ici.

Il existe un langage appelé XSL (eXtensible StyleSheet Language) permettant de décrire les transformations à effectuer pour passer un fichier XML en un fichier texte quelconque. XSL permet l'utilisation de nombreuses instructions et ressemble fort aux langages de programmation. Nous le détaillerons pas ici car il y faudrait plusieurs dizaines de pages. Nous allons simplement décrire deux exemples de feuilles de style XSL. La première est celle qui va transformer le fichier XML simulations.xml en code HTML. On modifie ce dernier afin qu'il désigne la feuille de style que pourront utiliser les navigateurs pour le transformer en document HTML qu'ils pourront afficher :

<?xml version="1.0" encoding="windows-1252"?>

<?xml-stylesheet type="text/xsl" href="simulations.xsl"?>

<simulations>

<simulation marie="oui" enfants="2" salaire="200000" impot="22504"/> <simulation marie="non" enfants="2" salaire="200000" impot="33388"/> </simulations>

<?xml-stylesheet type="text/xsl" href="simulations.xsl"?>

désigne le fichier simulations.xsl comme un feuille de style (xml-stylesheet) de type text/xsl c.a.d. un fichier texte contenant du code XSL. Cette feuille de style sera utilisée par les navigateurs pour transformer le texte XML en document HTML. Voici le résultat obtenu avec Netscape 7 lorsqu'on charge le fichier XML simulations.xml :

Lorsque nous regardons le code source du document (View/Source) nous retrouvons le document XML initial et non le document HTML affiché :

Netscape a utilisé la feuille de style simulations.xsl pour transformer le document XML ci-dessus en document HTML affichable. Il est maintenant temps de regarder le contenu de cette feuille de style :

<?xml version="1.0" encoding="windows-1252"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" indent="yes"/>

<xsl:template match="/"> <html>

<head>

<title>Simulations de calculs d'impôts</title> </head>

<body> <center>

<h3>Simulations de calculs d'impôts</h3> <hr/> <table border="1"> <th>marié</th><th>enfants</th><th>salaire</th><th>impôt</th> <xsl:apply-templates select="/simulations/simulation"/> </table> </center> </body> </html> </xsl:template> <xsl:template match="simulation"> <tr> <td><xsl:value-of select="@marie"/></td> <td><xsl:value-of select="@enfants"/></td> <td><xsl:value-of select="@salaire"/></td> <td><xsl:value-of select="@impot"/></td> </tr>

</xsl:template> </xsl:stylesheet>

 une feuille de style XSL est un fichier XML et en suit donc les règles. Il doit être en autres choses "bien formé" c'est à dire que toute balise ouverte doit être fermée.

 le fichier commence par deux commandes XML qu'on pourra garder dans toute feuille de style XSL sous Windows : <?xml version="1.0" encoding="windows-1252"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> L'attribut encoding="windows-1252" permet d'utiliser les caractères accentués dans la feuille de style.

 La balise <xsl:output method="html" indent="yes"/> indique à l'interpréteur XSL qu'on veut produire du HTML "indenté".

 La balise <xsl:template match="élément"> sert à définir l'élément du document XML sur lequel vont s'appliquer les instructions que l'on va trouver entre <xsl:template ...> et </xsl:template>.

<xsl:template match="/"> ...

</xsl:template>

Dans l'exemple ci-dessus l'élément "/" désigne la racine du document. Cela signifie que dès que le début du document XML va être rencontré, les commandes XSL situées entre les deux balises vont être exécutées.

 Tout ce qui n'est pas balise XSL est mis tel quel dans le flux de sortie. Les balises XSL elles sont exécutées. Certaines d'entre-elles produisent un résultat dans le flux de sortie. Etudions l'exemple suivant :

<xsl:template match="/"> <html>

<head>

<title>Simulations de calculs d'impôts</title> </head>

<body> <center>

<h3>Simulations de calculs d'impôts</h3> <hr/> <table border="1"> <th>marié</th><th>enfants</th><th>salaire</th><th>impôt</th> <xsl:apply-templates select="/simulations/simulation"/> </table> </center> </body> </html> </xsl:template>

Rappelons que le document XML analysé est le suivant : <?xml version="1.0" encoding="windows-1252"?> <simulations>

<simulation marie="oui" enfants="2" salaire="200000" impot="22504"/> <simulation marie="non" enfants="2" salaire="200000" impot="33388"/> </simulations>

Dès le début du document XML analysé (match="/"), l'interpréteur XSL va produire en sortie le texte <html>

<head>

<title>Simulations de calculs d'impôts</title> </head>

<body> <center>

<h3>Simulations de calculs d'impôts</h3> <hr>

<table border="1">

<th>marié</th><th>enfants</th><th>salaire</th><th>impôt</th>

On remarquera que dans le texte initial on avait <hr/> et non pas <hr>. Dans le texte initial on ne pouvait pas la balise <hr> qui, si elle est une balise HTML valide, est néanmoins une balise XML invalide. Or nous avons affaire ici à un texte XML qui doit être "bien formé", c.a.d que toute balise doit être fermée. On écrit donc <hr/> et parce qu'on a écrit <xsl:output text="html ...> l'interpréteur transformera le texte <hr/> en <hr>. Derrière ce texte, viendra ensuite le texte produit par la commande XSL :

<xsl:apply-templates select="/simulations/simulation"/>

</table> </center> </body> </html>

La commande <xsl:apply-templates select="/simulations/simulation"/> demande qu'on exécute le "template" (modèle) de l'élément /simulations/simulation. Elle sera exécutée à chaque fois que l'interpréteur XSL rencontrera dans le texte XML analysé une balise <simulation>..</simulations> ou <simulation/> à l'intérieur d'une balise <simulations>..</simulations>. A la rencontre d'une telle balise, l'interpréteur exécutera les instructions du modèle suivant :

<xsl:template match="simulation"> <tr> <td><xsl:value-of select="@marie"/></td> <td><xsl:value-of select="@enfants"/></td> <td><xsl:value-of select="@salaire"/></td> <td><xsl:value-of select="@impot"/></td> </tr> </xsl:template>

Prenons les lignes XML suivantes : <simulations>

<simulation marie="oui" enfants="2" salaire="200000" impot="22504"/>

La ligne <simulation ..> correspond au modèle de l'instruction XSL <xsl:apply-templates select="/simulations/simulation>". L'interpréteur XSL va donc chercher à lui appliquer les instructions qui correspondent à ce modèle. Il va trouver le modèle

<xsl:template match="simulation"> et va l'exécuter. Rappelons que ce qui n'est pas une commande XSL est repris tel quel par

l'interpréteur XSL et que les commandes XSL sont elles remplacées par le résultat de leur exécution. L'instruction XSL <xsl:value-of select="@champ"/> est ainsi remplacé par la valeur de l'attribut "champ" du noeud analysé (ici un noeud <simulation>). L'analyse de la ligne XML précédente va produire en sortie le résultat suivant :

XSL sortie

<tr><td> <tr><td> <xsl:value-of select="@marie"/> oui

</td><td> </td><td> <xsl:value-of select="@enfants"/> 2 </td><td> </td><td> <xsl:value-of select="@salaire"/> 200000 </td><td> </td><td> <xsl:value-of select="@impot"/> 22504 </td></tr> </td></tr> Au total, la ligne XML

<simulation marie="oui" enfants="2" salaire="200000" impot="22504"/> va être transformée en ligne HTML :

<tr><td>oui</td><td>2</td><td>200000</td><td>22504</td></tr>

Toutes ces explications sont un peu rudimentaires mais il devrait apparaître maintenant au lecteur que le texte XML suivant : <?xml version="1.0" encoding="windows-1252"?>

<?xml-stylesheet type="text/xsl" href="simulations.xsl"?> <simulations>

<simulation marie="oui" enfants="2" salaire="200000" impot="22504"/> <simulation marie="non" enfants="2" salaire="200000" impot="33388"/> </simulations>

accompagné de la feuille de style XSL simulations.xsl suivante : <?xml version="1.0" encoding="windows-1252"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/>

<xsl:template match="/"> <html>

<head>

</head> <body> <center>

<h3>Simulations de calculs d'impôts</h3> <hr/> <table border="1"> <th>marié</th><th>enfants</th><th>salaire</th><th>impôt</th> <xsl:apply-templates select="/simulations/simulation"/> </table> </center> </body> </html> </xsl:template> <xsl:template match="simulation"> <tr> <td><xsl:value-of select="@marie"/></td> <td><xsl:value-of select="@enfants"/></td> <td><xsl:value-of select="@salaire"/></td> <td><xsl:value-of select="@impot"/></td> </tr> </xsl:template> </xsl:stylesheet>

produit le texte HTML suivant : <html>

<head>

<title>Simulations de calculs d'impôts</title> </head>

<body> <center>

<h3>Simulations de calculs d'impots</h3> <hr> <table border="1"> <th>marié</th><th>enfants</th><th>salaire</th><th>impôt</th> <tr> <td>oui</td><td>2</td><td>200000</td><td>22504</td> </tr> <tr> <td>non</td><td>2</td><td>200000</td><td>33388</td> </tr> </table> </center> </body> </html>

Le fichier XML simulations.xml suivant <?xml version="1.0" encoding="windows-1252"?>

<?xml-stylesheet type="text/xsl" href="simulations.xsl"?> <simulations>

<simulation marie="oui" enfants="2" salaire="200000" impot="22504"/> <simulation marie="non" enfants="2" salaire="200000" impot="33388"/> </simulations>