06/11/2008

BOM dans l'entête

Certains éditeurs de texte rajoutent des caractères en début de fichier, avant la première balise ouvrante, lors d'opérations sur des fichiers de type xml, xsl, html.. Le BOM rajouté en début de fichier peut alors provoquer des erreurs lors de l'utilisation du fichier.

Ainsi, un fichier xsl dont le contenu a été reformaté par certains éditeurs, peut mettre le processeur xslt en erreur lors de la génération de la page html. Ce qui résulte par le non affichage de la page html, et le retour d'une erreur. Dans le cas présent il s'agit d'un processeur SAX pour JAVA:

[Fatal Error] :1:1: Content is not allowed in prolog.
jstl:WEB-INF/stylesheet/xsl/tiger/html/; Ligne #1; Colonne #1; org.xml.sax.SAXParseException: Content is not allowed in prolog.

Parmis les éditeurs qui ne rajoutent pas de BOM, on peut citer:

  • SPY XML Editor
  • PsPad

Avec PsPad, il est possible de reformater le contenu d'un fichier xsl (ou html). Ce qui a pour effet de mettre au propre l'indentation, les sauts de ligne, pour que le fichier soit plus lisible.' HTML > Reformater le code HTML ' (puis enregistrer les modifications) permet de lancer cette opération.

pspadHtmlFormat.png

 

Parmis les éditeurs qui rajoutent un BOM:

  • XML Copy Editor

Pour reformater le contenu d'un fichier xml avec XML Copy Editor: ' XML > Formater la source ' puis enregistrer les modifications. Attention, cette opération rajoute en début de fichier un BOM.

Pour repérer les éditeurs qui rajoutent un BOM en début de fichier, il faut réouvrir le fichier avec un éditeur hexadécimal (pspad par exemple), et constater s'il y a des caractères qui sont apparus avant la première balise ouvrante du fichier.

 

Auteur: Euan MATEO

17/07/2008

Installer JAXP

JAXP est une API qui permet de créer, lire et interpréter les fichiers XML. En d'autres mots, JAXP permet de parser un fichier XML.

L'archive contenant JAXP 1.4 peut être téléchargée:

:: Télécharger JAXP 1.4 :: 

 L'archive est au format jar. Pour que le système puisse maintenant utiliser cette librairie, il faut placer l'archive dans le répertoire qui contient les autres librairies présentes dans le 'kit de développement JAVA' (JDK) de votre système. Ce qui donne quelque chose comme: '%JAVA_HOME%/jre/lib/ext'

Auteur: Euan MATEO

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