EPITA
XML et les services Web

Jean-François Perrot 

Manipulations avec XSLT


  1. I. De HTML vers l'écran, en ligne de commande, avec xsltproc
    1. Illustration
    2. Réalisation
    3. Essai avec PrettyMIL

  2. II. Essais en Java
    1. Essai international
    2. Essai avec PrettyMIL


I. De HTML vers l'écran, en ligne de commande, avec xsltproc

(cf. cours)
Naturellement, l'affichage à l'écran ne peut rivaliser avec la fenêtre du navigateur pour la mise en forme du texte,
mais on peut émuler la disposition en paragraphes, lignes, colonnes etc.

  1. Illustration

    On part de l'exemple "international" et on veut obtenir le comportement suivant :

    jfp% xsltproc listtxt.xsl ../ExInter/ExInter.xml
    Voici une liste de pays avec leurs capitales
    France : Paris
    España : Madrid
    Česko : Praha
    Україна : Київ
    България : София
    Ελλάς : Αθήνα
    Россия : Москва
    საქართველო : თბილისი
    Հայաստան : Երեւան
    भारत : नई दिल्ली
    தமிழ்_நாடு : ென்னை
    ประเทศไทย : กรุงเทพฯ
    Việt_Nam : Hà Nội
    中華 : 北京
    日本国 : 東京
    jfp%


    Rappel sur l'usage de xsltproc : le nom du fichier "feuille de style" en 1er argument, en 2nd celui du fichier XML "données".

    Noter que l'appel à xsltproc avec un premier argument "feuille de style" a pour effet d'utiliser la feuille passée en argument et non pas celle qui est indiquée dans le fichier XML : <?xml-stylesheet type="text/xsl" href="list.xsl"?>

    Si on ne donne pas ce premier argument à la commande, c'est la feuille de style attachée au fichier XML qui est automatiquement invoquée :

    jfp% xsltproc ../ExInter/ExInter.xml
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Visualisation</title>
    </head>
    <body>
    <h2> Voici une liste de pays avec leurs capitales</h2>
    <ul>
    <li>France :
    Paris</li>
    <li>España :
    Madrid</li>
    <li>Česko :
    Praha</li>
    <li>Україна :
    Київ</li>
    <li>България :
    София</li>
    <li>Ελλάς :
    Αθήνα</li>
    <li>Россия :
    Москва</li>
    <li>საქართველო :
    თბილისი</li>
    <li>Հայաստան :
    Երեւան</li>

    <li>भारत :
    नई दिल्ली</li>
    <li>தமிழ்_நாடு :
    ென்னை</li>
    <li>ประเทศไทย :
    กรุงเทพฯ</li>
    <li>Việt_Nam :
    Hà Nội</li>
    <li>中華 :
    北京</li>
    <li>日本国 :
    東京</li>
    </ul>
    </body>
    </html>
    jfp%


  2. Réalisation

    En partant de la feuille list.xsl donnée dans le cours, trois étapes :

    1. Modification de xsl:output method de "html" à "text", et suppression des éléments HTML.
      On obtient un premier résultat qui n'est pas si mauvais...

    2. Élimination des blancs et sauts de ligne qui de facto commandent la mise en page
      alors que de jure ils ont pour rôle d'indiquer la structure logique de la feuille de style.
      On ajoute l'instruction <xsl:strip-space elements="*" />.
      Du coup on a tout perdu !

    3. Ajout de nouvelles indications de mise en page, tabulations (ASCII 09) et sauts de ligne (ASCII 10).
      On les spécifie par des entités explicites plutôt qu'en les logeant directement dans le texte,
      pour bien distinguer le contenu prescriptif dudit texte des artifices de sa présentation.
      Pour ce faire, une DTD interne est l'outil le mieux adapté :  
      <!DOCTYPE xsl:stylesheet [
      <!ENTITY tab "&#9;">
      <!ENTITY nl "&#10;">
      ]>
      On obtient ainsi le résultat illustré ci-dessus.

      fichier listtxt.xsl
      <?xml version='1.0'?>
      <!DOCTYPE xsl:stylesheet [
      <!ENTITY tab "&#9;">
      <!ENTITY nl "&#10;">
      ]>
      <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version='1.0'>
      <xsl:output method="text" encoding="utf-8" />
      <xsl:strip-space elements="*" />

      <xsl:template match="/">
      <xsl:text>Voici une liste de pays avec leurs capitales&#10;</xsl:text>

      <xsl:apply-templates/>

      </xsl:template>

      <xsl:template match="Capitales/*">

      <xsl:text>&tab;</xsl:text>
      <xsl:value-of select="name()"/><xsl:text> : </xsl:text><xsl:value-of select="."/>
      <xsl:text>&nl;</xsl:text>

      </xsl:template>

      </xsl:stylesheet>

  3. Essai avec PrettyMIL

    L'illustration donnée dans le cours est surprenante à deux titres :

    1. Le fichier qr.xml est lié à la feuille de style HtmlMIL.xsl qui produit du HTML,
      de sorte que la commande xsltproc qr.xml devrait engendrer

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <title>Programme MIL</title>
      </head>
      <body><pre>VAR a; b; q; r; LIRE a ;
      LIRE b ;
      q := 0 ;
      r := a ;
      TANTQUE t &gt;= b FAIRE
      q := q + 1 ;
      r := r - b
      FINTQ ;
      ECRIRE q ;
      ECRIRE r
      .</pre></body>
      </html>

      L'auteur aurait-t-il "triché" ?

    2. Entre l'illustration "en mode texte" et la version Web on observe une différence à la fin de la liste des déclarations de variables "VAR a; b; q; r..." :
      • en mode texte, cette liste se poursuit sans interruption avec la première instruction "LIRE a ;" ;
      • en mode Web elle se termine par un point, suivi d'un saut de ligne, avant la première instruction "LIRE a ;".
      La version Web paraît plus conforme à l'intention du programmeur, surtout si on la confronte avec le code XSLT
      qui demande un traitement spécial pour la dernière déclaration :

      (première partie de la feuille principale PrettyMIL.xsl)
      <xsl:template match="Variables/Var[position() != last()]">
      <xsl:value-of select="@nom"/>
      <xsl:text>; </xsl:text>
      </xsl:template>

      <xsl:template match="Variables/Var[position() = last()]">
      <xsl:value-of select="@nom"/>
      <xsl:text>.&#10;</xsl:text>
      </xsl:template>

      Que se passe-t-il ?

    Pour réaliser un affichage en mode texte, le cours dit explicitement qu'il suffit d'appliquer la feuille PrettyMIL au lieu de HtmlMIL qui se borne à produire un cadre HTML. Pour obtenir l'effet annoncé dans le cours, il suffit donc de commander
    (depuis le répertoire où nous faisons nos essais) "xsltproc ../MIL/PrettyMIL.xsl ../MIL/qr.xml" avec deux arguments.


    jfp% xsltproc ../MIL/PrettyMIL.xsl ../MIL/qr.xml
    VAR a; b; q; r; LIRE a ;
    LIRE b ;
    q := 0 ;
    r := a ;
    TANTQUE t &gt;= b FAIRE
    q := q + 1 ;
    r := r - b
    FINTQ ;
    ECRIRE q ;
    ECRIRE r
    .
    jfp%


    Même résultat ! Et d'ailleurs, le navigateur Safari confirme (ouvert sur qr.xml)  ...

    Safari

    Diable, voilà qui est bien inquiétant ! Mais que peut-on donc reprocher au code XSLT ci-dessus ?
    Avant de désespérer, tournons-nous vers un autre interprète.

II. Essais en Java

  1. Essai international


    jfp% java Trsf listtxt.xsl ../ExInter/ExInter.xml 
    Voici une liste de pays avec leurs capitales
    France : Paris
    España : Madrid
    Česko : Praha
    Україна : Київ
    България : София
    Ελλάς : Αθήνα
    Россия : Москва
    საქართველო : თბილისი
    Հայաստան : Երեւան
    भारत : नई दिल्ली
    தமிழ்_நாடு : ென்னை
    ประเทศไทย : กรุงเทพฯ
    Việt_Nam : Hà Nội
    中華 : 北京
    日本国 : 東京
    jfp%

    N.B.  Les 3 lignes de l'Inde, du Tamil-Nadu et de la Thaïlande ne sont pas alignées avec les autres par Safari,
    bien que dans le texte figure une tabulation comme pour les autres... Encore un problème avec l'affichage des écritures indiennes ?
  2. Essai avec PrettyMIL


    jfp% java Trsf ../MIL/PrettyMIL.xsl ../MIL/qr.xml 
    VAR a; b; q; r.
    LIRE a ;
    LIRE b ;
    q := 0 ;
    r := a ;
    TANTQUE t &gt;= b FAIRE
    q := q + 1 ;
    r := r - b
    FINTQ ;
    ECRIRE q ;
    ECRIRE r
    .jfp%

    Ouf !
    Au fait, l'image de page Web donnée dans le cours montrait... le navigateur Firefox ! Ce dernier confirme sa position.
    Qui croire ?
    Essayons avec MS Explorer...

    Explorer

    Noous sommes donc tenté de conclure à une anomalie chez Safari et chez xsltproc.
    Bizarre...