TP XML 3
Transformations XSLT côté client
![Note](../../../img/note.gif) |
Réponses
Les réponses sont affichées dans ce style là.
|
On dispose d'un document XML et de sa DTD qui utilise une entité.
Le document XML décrit les animaux d'un Zoo. L'objectif est de faire une feuille de style qui transforme le document source XML en une version publiée en (X)HTML. Tout se passe côté client (dans un prochain tépé, tout se passera côté serveur).
Pour commencer avec XSLT
- Créez une feuille de style minimaliste qui affiche le corps HTML avec un titre grâce à une règle qui réagit sur la racine du source XML.
Fichier zoo.xsl.
Modifiez le source XML pour lui assigner cette feuille de style. Il suffit d'ajouter dans le document XML source juste après la déclaration <?xml?> l'instruction de traitement suivante qui sera interprêtée par le navigateur :
<?xml-stylesheet type="text/xsl" href="zoo.xsl"?>
Chargez le document dans le navigateur. Youpi, ça marche.
- Ajoutez des règles à votre feuille de style pour qu'elle transforme le contenu en (X)HTML en utilisant ces ressources.
Fichier zoo.xsl.
Résultat.
![Note](../../../img/note.gif) |
Un navigateur peut afficher le résultat HTML d'une transformation XSLT. Le problème est que le code HTML produit n'est pas visible (il est gardé jalousement par le navigateur qui se contente de le consommer pour formatter l'affichage).
Une solution alternative :
est d'utiliser un processeur XSLT utilisable en ligne de commande, qui permet de sauver dans un fichier le résultat HTML produit. Par exemple, Xalan peut s'utiliser comme ceci :
java org.apache.xalan.xslt.Process -IN input.xml -XSL stylesheet.xsl -OUT output.html
est de compiler cette classe Java, qui s'utilise comme cela :
java TestXSLT stylesheet.xsl input.xml
et qui affiche le résultat sur la sortie standard.
|
Introduction d'espaces de noms
On veut séparer ce qui est documentaire (les éléments img, b, info, danger, commentaire, etc) de ce qui est structure de données (les autres éléments).
- Déclarez et utilisez dans le document XML source 2 espaces de nommage pour identifier ces 2 familles. Demandez à votre navigateur d'afficher le code source du nouveau document XML pour bien voir les déclarations d'espace de nommage. Accessoirement, voici la DTD adaptée aux namespaces. Vous n'utiliserez pas de préfixe pour les éléments de structures de données, vous en utiliserez un pour les éléments documentaires. Utilisez un URN et un URL pour les 2 URIs d'espace de nom. Que fait le parseur XML lorsqu'il rencontre votre URL d'espace de nom ?
- Rien. Les URIs font partie du nom des éléments et des attributs qui les utilisent.
- Rechargez le document dans le navigateur. Que constatez-vous ? L'affichage n'est plus celui souhaité. Pourquoi ?
En ajoutant des déclarations <zoo xmlns="...">, tous les éléments sont associés à cet espace de nommage; or la feuille de style ne traite que des éléments sans espace de nommage, donc peu de chose devraient être affichées : la règle qui correspond à la racine, puis les règles par défaut qui peuvent s'appliquer (affichage du texte brut).
Pour que la feuille de style XSLT réagisse sur les éléments qui appartiennent à un espace de nommage, il faut faire une déclaration en utilisant un préfixe (c'est une contrainte de XPath). Le fait qu'il y ait ou non un préfixe dans le document source n'a pas d'importance, seul importe le fait que les éléments sont dans un espace de noms, et que les règles XSLT correspondent à ces espaces de noms.
- Corrigez votre feuille de style pour qu'elle fonctionne à nouveau. Nouvelle feuille de style XSLT, et le rendu.
- Que remarquez-vous des patterns qui correspondent aux attributs ? Dans la feuille de style corrigée, les patterns qui correspondent aux attributs restent sans préfixe, car ils n'en n'ont pas dans le document XML source. Or, les éléments non préfixés appartiennent à l'espace de nommage par défaut (xmlns="..."), mais les attributs sans préfixes n'appartiennent jamais à un espace de nommmage; donc on peut (on doit) les adresser sans préfixe dans XSLT.
![Warning](../../../img/warning.gif) |
Support XSLT côté client
Il est possible que votre navigateur supporte mal les imports ou toute autre fonctionnalité XSLT. C'est un des inconvénients des transformations côté client.
Si vous arrivez dans les limites de ce que sait faire votre navigateur, utilisez-en un autre, ou utilisez Xalan comme indiqué ci-dessus.
|
Imports de règles
On veut que les mois des dates apparaissent en clair, c'est à dire sous la forme "15 mars 2004" au lieu de "2004-03-15". On utilise cette librairie qui fait ça très bien.
- Est-ce que cette feuille de style peut-être distribuée sur la planète sans risque ? On ne peut raisonnablement pas distribuer cette feuille de style sur internet. Pourquoi ? La feuille de style déclare l'espace de nommage suivant : xmlns:date="*** Processing dates ***". Bien que valide (le parseur ne vérifie pas la consistance de l'URI de l'espace de nom), on ne peut pas dire qu'il s'agisse d'un identificateur universel : quelqu'un pourrait avoir la même (mauvaise) idée ; il y a donc, potentiellement, un risque de collision de noms.
- Faites les adaptations nécessaires à votre feuille de style pour que les dates apparaissent en clair. Nouvelle feuille de style XSLT, et le rendu.
Génération de tables des matières, tris
- Créez une table des matières des animaux du zoo, dont chaque item pointe vers les fiches descriptives complètes. Vous utiliserez des règles avec un mode nommé.
- Triez votre table des matières par ordre alphabétique sur le nom des animaux.
- Faites une autre règle pour trier votre table des matières par date de naissance croissante.
- Déclarez un paramètre à votre feuille de style pour pouvoir choisir le type de tri.
- Nouvelle feuille de style XSLT, et le rendu.
- Comment peut-on passer un paramètre à la feuille de style côté client ? Il n'y a pas de moyen trivial de faire de passage de paramètres à la feuille de style côté client. Il faut faire appel à des technologies de script (comme Javascript) en instanciant le processeurs XSLT. Le problème est qu'on perd toute compatibilité : selon le navigateur, les objets ne s'invoquent pas de la même manière. Le salut réside dans les transformations opérées côté serveur, beaucoup plus souples et neutres vis à vis du client.