|
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 :
-
d'un script écrit en Jscript (msxsl.js) et activable dans l'environnement
Windows (et qui ne nécessite pas, contrairement à
ce que semble dire Ken, que vous ayez sur votre machine le nouveau Windows
Scripting Host de Microsoft -- lequel ne deviendra nécessaire
que si vous réécrivez ce script sous forme de composant
.wsf -- Windows Script File). Ce script invoque le moteur de
transformation XSLT de MSIE5 et lui soumet un couple XML + XSL pour produire
en sortie un fichier HTML (ou XML si vous transformez du XML en XML)
-
d'un fichier "batch" (msxsl.bat) qui va vous permettre de lancer ce script
et de lui assigner ses paramètres d'entrée (fichier XML +
fichier XSL) et de sortie (fichier HTML ou XML). Un même fichier
batch peut naturellement invoquer le script plusieurs fois successivement
pour transformer autant de couples XML + XSL que vous voudrez. Ainsi en
quelques secondes tout un site XML pourra être "cloné" en
HTML !
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 :
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 :
-
Le moteur XSLT de MSIE5 s'écartait déjà passablement
de la spécification sur laquelle il est basé -- voir
sur le site de MS XSL
Working Draft Conformance Notes ;
-
et que celle-ci a depuis considérablement évolué
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 :
-
première règle modèle : se positionner sur la racine
-
seconde règle modèle : parcourir tout l'arbre XML
-
troisième règle modèle : reproduire tous les noeuds
textuels.
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 :
-
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 :
-
soit utiliser un mécanisme du type <xml:for-each...>
(ce qui ne convient que pour le XML régulier)
-
soit faire des règles modèles (vides éventuellement)
pour toutes les balises intermédiaires entre la racine et les balises
que vous souhaitez exploiter
-
soit faire depuis les règles modèles de niveau supérieur
des branchements explicites vers les balises de niveau inférieur
que vous souhaitez exploiter, du genre <xsl:apply-templates
select="balise_à_exploiter" />, et non pas
<xsl:apply-templates /> qui ne brancherait que sur les balises
de niveau immédiatement inférieur
-
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és accents franç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.msxsl,
identique2.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.