24/01/2008

Xpath

XPath permet de naviguer dans un document source XML, comme on peut le faire dans une arborescence de dossiers. Les instructions ont d'ailleurs une notation très similaire.

XPath voit le document XML comme une arborescence de noeuds, un peu comme un Document Object Model (DOM). Chaque élément du document source XML est représenté par un noeud XPath. Les noeuds peuvent contenir plusieurs types d'informations:

  • Le noeud racine contient tout le document
  • Un noeud texte contient du texte
  • Un noeud attribut contient un attribut du document source XML

Et, il existe d'autres types de noeuds. 

XPaht peut comporter des expressions 'relative' ou 'absolue'. Une expression XPath absolue commence par un slash '/', qui indique le noeud racine. Pour une expression absolue, on part toujours de la racine du document. Pour une expression relative, on part du noeud courant. Une expression relative ne commence pas par un slash '/'. Les expressions relatives sont très utiles pour indiquer les éléments à un processeur XSLT, depuis le noeud courant du processeur.

Le contexte permet de mémoriser l'état lorsque XPath parcourt le document. Parmis les informations contenues dans le contexte, il en est une qui a une grande importance: le noeud courant, soit le noeud où l'on se trouve lors du parcours du document XML.

On prend par exemple, l'arborescence suivante qui correspond à un 'répertoire téléphonique' imaginaire:

'.' : Représente le noeud courant

'/' : Représente la racine du document, soit le noeud 'répertoire'

'../' : Permet d'accéder au noeud parent 

'/personne' : Représente le noeud 'personne', enfant de 'répertoire' 

'/personne/nom' : Représente le noeud enfant 'nom'

La navigation a comme point de départ le noeud 'courant'. Si je me trouve sur le noeud personne, '.' désigne le noeud personne. '../' représente le noeud 'répertoire'.

Une autre instruction qui peut être utile, le double slash '//', qui signifie tous les noeuds. C'est cependant à utiliser avec quelques précautions. Si je note '//nom', j'obtiens tous les noeud 'nom' à partir de la racine,  soit les noeuds 'nom' enfants de 'répertoire' et les noeuds 'nom' enfants de 'personne'. Si rien n'est précisé avant le double slash, on part de la racine.

Un noeud attribut correspond à l'attribut d'une balise XML. Pour désigner un attribut avec XPath, on fait précéder le nom du noeud par arobase (@). ex: '/personne/@emploi' pour l'attribut de <personne emploi='développeur'>

 

Références:

  • XSLT 'Mastering XML transformations', écrit par Doug Tidwell, aux éditions O'Reilly
  • Développez en Ajax, écrit par Michel Plasse, aux éditions Eyrolles

Auteur: Euan MATEO

23/01/2008

XSLT et PHP5

Le XSLT est un langage qui permet principalement de transformer du XML en page HTML. En fait, il permet de créer des feuilles de style pour la mise en page d'informations contenues dans des fichiers XML. On peut parler de template, au même titre que Smarty par exemple.

Depuis PHP5, la transformation du XML / XSLT, est prise en charge par la librairie libxslt. Google n'est pas très locace sur le sujet d'ailleurs. J'ai tout de même trouvé un tuto bien fait sur le sujet, et en Français: ICI

 Le traitement repose sur la classe PHP XSLTProcessor.

Le déroulement d'une transformation est assez simple:

  1. Créer une nouvelle instance de la classe XSLTProcessor
    • $xslt = new XSLTProcessor();
  2. Créer une instance de document Dom, et charger le fichier XML
    • $xml = new DOMDocument();
    • $xml->load($fichier_XML);
  3. Créer une instance de document Dom, et charger la feuille de style XSL
    • $xsl = new DOMDocument();
    • $xsl->load($fichier_XSLT);
  4. Charger le document Dom du XSLT dans l'instance de XSLTProcessor
    • $xslt->ImportStyleSheet($xsl);
  5. Lancer la transformation et récupérer une chaine 
    • $chaine = $xslt->transformToXML($xml);

Le résultat de la transformation peut être récupéré sous 3 formats, avec les méthodes 'transformToDoc()' pour récupérer un DomDocument, 'transformtoURI' pour récupérer une ressource identifiée par un URI, ou encore 'transformToXML()' pour récupérer une chaine.

Auteur: Euan MATEO