Accueil

Les Trucs et Astuces XML

Emmanuel Lazinier

Création de la page : 1999-08-17.
Dernière mise à jour : 2001-05-11


Comment "cloner" en HTML vos pages XML

"XML ne deviendra vraiment intéressant que le jour où la quasi-totalité des internautes seront équipés de butineurs XML-capables". Tel est l'argument favori des XML-attentistes. Il ne tient pas la route. En effet, en attendant de pouvoir envoyer du XML à tous les butineurs clients, nous pouvons toujours : 
  • Si nous avons la maîtrise du serveur, produire sur celui-ci du HTML "à la volée" à partir de pages XML transformées par moteur XSLT (voir en particulier nos liens Exploiter XML/XSL "côté serveur")
  • Si nous n'avons pas la maîtrise du serveur (cas de l'internaute moyen publiant une page personnelle), "cloner" nos pages XML en HTML "en batch", toujours par transformation XSLT, et publier le résultat sur le serveur.
Dans les deux cas il nous faut disposer d'un moteur de transformation XSLT. Il n'est certes pas très difficile de s'en procurer  un (éventuellement gratuit) sur le marché (voir nos liens vers les Outils XML). Mais, pour beaucoup d'entre nous, cela n'est même plus nécessaire -- depuis que  G. Ken Holman nous a montré qu'il était possible d'utiliser directement celui de MSIE5 grâce à un script tout simple. 

Et si vous n'avez besoin de cloner vos pages XML en HTML qu'occasionnellement et ne voulez pas vous encombrer de fichers script et de fichiers batch ? Qu'à cela ne tienne : "XML Francophone", jamais à court de ressources, a encore en réserve une autre astuce pour vous satisfaire !

Cloner en batch grâce au script de G. Ken Holman

De quoi s'agit-il ?

D'un script tout simple que Ken a publié sur son site Crane Softwrights Ltd. (et qu'il a gentiment modifié à notre intention pour qu'il sache aussi traiter le XML francophone encodé ISO-8859-1) et qui va changer notre vie. Je vous propose de le découvir sur sa page :

Resource Library - Debugging Stylesheets Using Microsoft IE5 XSL Processing. [voir une copie d'archive locale]

En quoi consiste l'outil ?

Il se compose : Simple, efficace, et utilisable également (sous réserves) avec  le nouveau parseur MSXML3 de Microsoft ! Un grand merci à Ken. Et pour ceux que ça intéresse, signalons qu'il publie et met à jour régulièrement :
 
G. Ken Holman, Practical Transformation Using XSLT and XPath (XSL Transformations and the XML Path Language) Fifth Edition - 1999-10-14 - ISBN 1-894049-02-0 Copyright (c) 1999 Crane Softwrights Ltd. http://www.CraneSoftwrights.com/links/info-xmlfr.htm 288 Pages / Subscription price includes free updates.
Note 1. Si l'on veut générer avec MSXML 3+ et par transformation XSLT 1.0 des documents encodés ISO-8859-1 une modification du script est recommandée.

Note 2. On peut aussi modifier le script  pour l'adapter à la nouvelle façon, disponible sous MSXML 3+, d'invoquer le moteur XSLT sous la forme d'un objet "XSL Template" -- ce qui permet entre autres choses de transmettre à la feuille de style d'éventuels paramètres. (Voir sur le site MSDN Using XSLT from MSXML.)

Note 3. Depuis octobre 2000, Microsoft propose son propre utilitaire en mode ligne de commande, msxsl.exe, capable d'invoquer le moteur de transformation de MSIE5. Cet utilitaire, qui ne fonctionne qu'avec le nouveau parseur MSXML3+, permet de transmettre au moteur XSLT d'éventuels paramètres, et même de forcer son fonctionnement suivant un "mode" particulier. Télécharger l'exécutable et/ou son code source. Voir aussi Command Line Transformations Using msxsl.exe, par Andrew Kimbali

Autre solution : sauvegarder à partir de MSIE5 le HTML généré

Je suppose que tout comme moi vous avez parfois ressenti la frustration de ne pas trouver dans le menu de MSIE5 une commande du type "Fichier/Sauvegarder en HTML" qui permettrait de récupérer le HTML généré par MSIE5 à partir d'un fichier XML et de la feuilles de style XSL associée. Eh bien, c'est désormais possible : il suffit pour cela de détourner quelque peu un outil (IEXMLTLS) fourni par Microsoft et que vous pouvez télécharger depuis l'adresse suivante :

Internet Explorer Tools for Validating XML and Viewing XSLT Output

Que fait IEXMLTLS ?

IEXMLTLS ajoute dans le menu contextuel de MSIE5 deux nouvelles commandes : "Validate XML" et "View XSL Output". La première de ces commandes permet de tester la validité (par rapport à la DTD au au XML-Schéma) d'un fichier XML préalablement chargé dans le butineur.

La deuxième de ces commandes permet de visualiser, dans une nouvelle fenêtre, le HTML généré par MSIE5. Hélas, elle ne permet pas de le sauvegarder !

Note. Vous avez néanmoins la possibilité de sélectionner le contenu de la fenêtre et de faire un copier-coller dans un éditeur texte, à partir duquel il vous sera possible de le sauvegarder.

Comment installer IEXMLTLS ?

Télécharger depuis l'adresse indiquée plus haut le fichier d'installation iexmltls.exe. Le doucle cliquer. Cet exécutable va copier dans un répertoire que vous lui indiquerez un certain nombre de fichiers dont ceux-ci :
msxmlval.htm
msxmlval.inf
msxmlvw.htm
msxmlvw.inf
Pour intégrer à MSIE5 les deux nouvelles fonctionnalités, vous devez ensuite cliquer à droite sur chacun des fichiers .inf et choisir l'option "installer"

Notre astuce

Avant d'installer remplacer le contenu du fichier msxmlvw.htm par celui-ci :
<HTML>
<TITLE>XSL Transformation Ouput</TITLE>
<BODY>
<SCRIPT language="javascript" defer=true>
var win = external.menuArguments;
var doc = win.document;
var xmldoc = doc.XMLDocument;
var xsldoc = doc.XSLDocument;
if (!xmldoc)
{
    win.alert("Not XML Document.");
}
else
{
   try {
      var srcwin = win.open("about:blank","","resizable=yes,scrollbars=yes,menubar=yes");

      srcwin.document.write(xmldoc.transformNode(xsldoc))
 
   } catch (e) {
      alert( "Error in 'View XSL Transform': "+e.description);
   }
}
</SCRIPT>
</BODY>
</HTML>

Installer (ou réinstaller) ensuite à l'aide de msxmlvw.inf. Désormais la commande "View XSL Output" va provoquer l'affichage, non plus du code HTML généré par MSIE5 mais la page HTML, visuellement identique, il est vrai, à la page XML déjà affichée par MSIE5. Alors quel intérêt, me direz-vous ? Eh bien, l'avantage est qu'en choisissant maintenant dans la barre de menus de cette nouvelle fenêtre la commande "Affichage/Source" vous allez voir le code s'afficher dans une troisième fenêtre. Pourquoi, me direz-vous avec quelque raison, avoir ajouté une étape supplémentaire pour visualiser en fin de compte le même résultat qu'avec la commande "View XSL Output" d'origine ? La seule différence est que cette fois le contenu de la fenêtre peut être sauvegardé :-)

Compliqué ? Peut-être bien un peu, oui. Alors, si vous trouvez plus simple n'hésitez pas à nous en faire profiter...

Et si vous voulez en savoir plus sur les mille et une façons de "customiser" MSIE5, n'hésitez pas à consulter :
Microsoft : Mind : Customizing Microsoft Internet Explorer 5.0, par Dino Esposito


Eviter les pièges du moteur XSLT "natif" de MSIE5

Le moteur XSLT livré avec MSIE5 est basé sur le chapitre 2 ("Tree Construction") du projet de spécification XSL du W3C du 16 décembre 1998 (à l'époque cette spécification n'était pas encore séparée en XSLT et XSL proprement dit). Si donc l'on considère que : on ne s'étonnera pas des différences notables que peut présenter ce moteur de transformation par rapport à des logiciels (XT, iXSLT, ou le nouveau parseur MSXML3 de Microsoft...) qui sont eux à peu près conformes dans leurs dernières versions aux spécification XSLT les plus récentes.

Nous allons nous efforcer ci-dessous de lister les principaux pièges à éviter : 

Les règles modèles (templates) non implicites

La spécification XSLT 1.0  préconise que dans les moteurs XSLT deux règles modèles (templates) soient implicites ou "internes" (build-in) :
 
<xsl:template match="/|*"><xsl:apply-templates/></xsl:template>
<xsl:template match="text()"><xsl:value-of select="."/></xsl:template>
Or Microsoft a choisi de ne pas rendre ces règles modèles implicites dans son moteur -- voir sur le site de Microsoft Simulating Built-in Templates.

Si vous voulez que votre feuille de style XSL fonctionne à la manière prévue par le W3C vous devez reproduire ces deux règles modèles en tête de votre feuille de style, avant tout autre règle modèle : c'est Microsoft lui-même qui vous le dit.

Si vous ne le faites pas, vous devez vous attendre à un fonctionnement un peu particulier de votre feuille de style XSL.

Faites l'essai : prenez un document XML quelconque et tranformez-le avec une feuille de style vide en utilisant successivement le moteur XSLT de MSIE5 et un autre logiciel XSLT, par exemple iXSLT. Que constatez-vous ?

Vous constatez que le moteur XSLT de MSIE5 a produit un document vide, alors que le second logiciel a reproduit, dans l'ordre, tous les noeuds textuels de votre document (= votre document sans les balises).

Si vous reproduisez en tête de votre feuille de style MSXSL les deux règles modèles non implicites reproduites plus haut (d'après la documentation de Microsoft) vous aurez d'abord la surprise de constater que la première de ces règles modèles provoque une erreur et doit donc être coupée en deux :

<xsl:template match="/"><xsl:apply-templates/></xsl:template>
<xsl:template match="*"><xsl:apply-templates/></xsl:template>
<xsl:template match="text()"><xsl:value-of select="."/></xsl:template>
(En pratique, la première de ces règles modèles sera presque toujours redéfinie par vous et sera donc inutile.)

Si vous reproduisez en tête de votre feuille de style MSXSL ces trois (ou ces deux) règles modèles non implicites, vous aurez enfin la satisfaction de voir que le moteur Microsoft produit enfin un résultat équivalent à celui de iXSLT.

Que font ces trois règles modèles exactement ? Tout simplement ceci :

Que se passera-t-il si vous n'avez pas ajouté ces règles modèles en tête de votre feuille de style. Eh bien vous devrez alors :
  1. forcer le moteur à parcourir votre arbre xml, ou du moins la partie de cet arbre qui vous intéresse. Pour ce faire il vous faudra :
  2. forcer le moteur à reproduire les noeuds textuels qui vous intéressent. Autrement dit la règle modèle ultime devra contenir <xsl:value-of /> et non pas <xsl:apply-templates /> qui ne produirait rien

Le traitement des espaces blancs (white space)

Autre problème potentiel avec le moteur XSLT de MSIE5 : la façon dont il gère les espaces blancs -- voir sur le site de MS la page Controlling White Space.

Un exemple ? Considérons le fichier XML suivant :
 

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml:stylesheet href="identique1.msxsl" type="text/xsl" ?>
<!DOCTYPE HTML [
    <!ENTITY eacute  "é" >
    <!ENTITY ccedil  "ç" >
  ]>
<HTML>
<BODY>
Satan&eacute;s accents fran&ccedil;ais !
</BODY>
</HTML>
Dans le corps du fichier les lettres accentuées française sont représentées par des entités, prédéfinies en HTML mais non pas en XML, où il faut donc qu'elle soient définies dans la DTD, ce qui est le cas ici (voir l'instruction DOCTYPE). Associons à ce fichier la feuille de style élémentaire (identique1.msxsl) suivante :
 
<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlns="http://www.w3.org/TR/REC-html40"
 result-ns=""
 default-space="strip"
 indent-result="yes">

<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>

<!-- Copie le document à l'identique -->
<xsl:template match="@* | * | text()">
<xsl:copy>
<xsl:apply-templates select="@* | * | text()" />
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

Cette feuille de style comporte une transformation à l'identique et devrait avoir pour seul résultat le remplacement des entités par leur valeur. Or le résultat de la transformation, vu à travers le butineur (tester) est celui-ci :
 
Satan é s accents fran ç ais !
Si, grâce au script de G. Ken Holman, l'on regarde le HTML produit, on s'aperçoit qu'il est le suivant :
 
<HTML>
<BODY>

Satan
é
s accents fran
ç
ais !

</BODY>
</HTML>

Si l'on change la feuille de style (en identique2.msxsl) de la manière suivante :
...
<!-- Copie le document à l'identique -->
<xsl:template match="@* | * | text()">
<xsl:copy>
<xsl:apply-templates select="@* | * | text()" />
</xsl:copy></xsl:template>
...
Le résultat devient :
<HTML>
<BODY>

Satanés accents français !
</BODY></HTML>

Tester avec le butineur

Changeons encore la feuille de style (en  identique3.msxsl) :

...
<!-- Copie le document à l'identique -->
<xsl:template match="@* | * | text()">
<xsl:copy><xsl:apply-templates select="@* | * | text()" />
</xsl:copy></xsl:template>
...
Résultat :
 
<HTML><BODY>
Satanés accents français !
</BODY></HTML>
Tester avec le butineur

Piège : les trois feuilles de style identique1.msxslidentique2.msxsl et  identique3.msxsl paraissent semblables lorsqu'elles sont visualisées  sous MSIE5 (c-à-d avec la feuille de style par défaut de celui-ci). Il faut visualiser le code source pour constater leur différence)

Conclusion

Contrairement à ce qu'auraient fait d'autres moteurs XSLT, le moteur de MSIE5 a donc ignoré l'attribut default-space="strip" présent dans l'élément  <xsl:stylesheet...>. La seule façon d'éliminer les espaces en trop est donc ici de supprimer les retours à la ligne dans les règles modèles correspondantes.

En pratique, il s'avère donc indispensable d'utiliser le script de G. Ken Holman pour contrôler le HTML produit par  le moteur XSLT de MSIE5. Si vous ne le faites pas vous risquez de produire un HTML qui ne sera pas complètement fonctionnel. Exemple suit.

Mais oui, les liens fonctionnent en XML !

Beaucoup de gens croient que MSIE5 ne gère pas les liens vers des ancres en XML. Ils se trompent mais ils sont excusables. En effet, et en vertu de ce qui vient d'être exposé, si l'on ne prend pas suffisamment garde à la feuille de style MSXSL elle  risque de générer des ancres HTML  de la forme suivante :
 
<A NAME="C1
" />
Or une telle ancre ne fonctionne pas sous MSIE5 (ni sous Netscape 4)... Faites l'essai ; comparez avec une ancre "normale"

Ceci étant, si vous faite attention à générer par la feuille de style MSXSL des ancres "non coupées", elles fonctionnent aussi bien en version XML qu'en version HTML (= vous pouvez "brancher" sur n'importe quel point d'un document XML -- ou plutôt de sa représentation HTML virtuelle). Démonstration :

Pour tout savoir sur XSLT

Foire aux outils

Gilles Lenfant nous dit tout le bien qu'il pense de l'éditeur de texte (helvétique) NoteTab (gratuit dans sa version "light"). Cet éditeur présente la particularité de pouvoir recevoir des fonctionnalités supplémentaires sous forme de scripts. Une imposante bibliothèque de tels scripts est proposée au téléchargement, dont déjà quelques scripts spécifiques XML. Gilles a lui-même écrit 4 scripts qui apportent les fonctionnalités suivantes : vérifier le caractère "bien-formé" ; vérifier la validité ; afficher (sous MSIE5) l'arbre XML ; enfin, et surtout, transformer par XSLT.
Amis visiteurs, cette rubrique est la vôtre. Faites-nous part vous aussi, pour que nous en fassions bénéficier la communauté XML francophone, des trucs et astuces XML que vous avez découverts et qui vous facilitent la vie.

Retour à la page d'accueil.