UXML
But du système
UXML est un "parser" permettant de contrôler la syntaxe de document XML. Il comprend également un "moteur" de transformation XSL.
Son but est principalement de générer des documents interactifs en format HTML dans une perspective de formation.
A cette fin des "templates" seront préparés qui reprendront les interactions proposées par UTOPIA et, ultérieurement celles de PROF'EXPERT. Dès 1999, il sert de base au projet Ermitage.
Le module de génération est également disponible sous la forme d'un programme CGI.
[ Manuel pour UXML ] [ DTD pour le projet pédagogique ]
Etat
Version alpha 1.0
Fonctionnement général: les rubriques des menus ne sont pas encore ni complètes, ni définitives.
DTD parser: les déclarations ENTITY et NOTATION n'ont pas encore été testées complètement.
XML parser : il est possible de contrôler soit la forme du document (well formed) soit la validité du document dans le cas où une DTD existe.
XLS: la DTD xls.dtd permet de voir les fonctions actuellement prises en compte:
<!ELEMENT XSL:STYLESHEET (XSL:OUTPUT*,XSL:TEMPLATE+)> <!ELEMENT XSL:TEMPLATE (#PCDATA|XSL:APPLY-TEMPLATES|XSL:OUTPUT|XSL:VALUE-OF)*> <!ELEMENT XSL:APPLY-TEMPLATES EMPTY> <!ELEMENT XSL:OUTPUT EMPTY> <!ELEMENT XSL:VALUE-OF EMPTY> <!ATTLIST XSL:STYLESHEET VERSION CDATA #IMPLIED> <!ATTLIST XSL:TEMPLATE MATCH CDATA #IMPLIED> <!ATTLIST XSL:OUTPUT METHOD CDATA #IMPLIED DOCTYPE-SYSTEM CDATA #IMPLIED DOCTYPE-PUBLIC CDATA #IMPLIED CDATA-SECTION-ELEMENTS CDATA #IMPLIED> <!ATTLIST XSL:VALUE-OF SELECT CDATA #REQUIRED>
VALUE-OF ne fonctionne qu'avec SELECT="."
Version alpha 1.01 à 1.05
Correction des premiers bugs, notamment de l'absence de signalisation de certaines erreurs dans la DTD et de problèmes dans la gestion des différents éditeurs.
Il a été ajouté au moteur XSL l'élément:
<!ELEMENT XSL:TEXT (#PCDATA)> <!ATTLIST XSL:TEXT DISABLE-OUTPUT-ESCAPING (yes|no) "no">
Qui permet d'afficher du texte contenant des caractères < > &, par exemple: l'élément
<XSL:TEXT DISABLE-OUTPUT-ESCAPING="yes"><BR></XSL:TEXT>
permettra d'afficher <BR> (qui n'est pas un élément valide en XML)
L'attribut SELECT de l'élément XSL:VALUE-OF admet de nouveaux XSLPattern: <nom d'un élément>, @<nom d'un attribut>, de même que text(), id('<idref>'), etc.
L'élément XSL:FOR-EACH a été ajouté
La règle traitant par défaut les noeuds "texte" a été activée.
<XSL:TEMPLATE MATCH="text()">
<XSL:VALUE-OF SELECT="."/>
</XSL:TEMPLATE>
Si on ne la souhaite pas il faut la redéfinir, par exemple de la manière suivante:
<XSL:TEMPLATE MATCH="text()"> </XSL:TEMPLATE>
Petits conseils pratiques:
- On créera la DTD en utilisant l'éditeur de texte. Elle pourra directement être validée à ce niveau.
- Pour les documents XML, on travaillera plutôt par projet. Actuellement un fichier XML est attaché à chaque projet. Ultérieurement il pourra y en avoir plusieurs (cf. UTOPIA). Il est toujours possible de vérifier qu'un document XML présent dans l'éditeur est bien formé. Il n'est possible de le valider que si le projet le contenant a été ouvert.
Version 1.06
L'élément XSL:CALL-TEMPLATE a été ajouté et donc l'attribut NAME à XSL:TEMPLATE de même que la possibilité d'insérer des attributs par évaluation : <ATOM N_ATOMIC={NUMBER}/>
En plus des templates nommés ont été ajoutés des variables (XSL:VARIABLE), l'attribut MODE qui permet de faire des classes de templates est actif et la fonction XSL:CHOOSE (qui comprend XSL:WHEN et XSL:OTHERWISE)
Un élément non standard XSL:INCLUDE-TEXT a été introduit qui place le contenu d'un fichier sans parsing.
Il est également possible de faire des règles s'appliquant à des éléments en dehors du flux courant (MATCH="//ATOM").
Il n'est pas toujours évident de juger si un attribut est un XSL pattern avec une erreur de syntaxe ou du CDATA un peu particulier. La solution adoptée actuellement est de traiter ce cas sous la forme d'un "warning" (optionnel).
Commentaires:
- Dans ce dernier cas, c'est le premier élément trouvé (recherche en profondeur d'abord) qui est transformé. La documentation ne semble pas très clair à ce sujet.
- La remarque précédente est générale, il semble y avoir encore pas mal d'incertitude et des interprétations selon les auteurs consultés
- Si la fabrication d'un moteur XSL n'est en soi pas déplaisante, il faut noter qu'il y a une certaine tension entre l'idée de garder l'ouverture XML (XSL:TEMPLATE est une balise comme une autres), ou d'en faire un langage (XSL:TEMPLATE devient un mot réservé). Dans ce cas il apparaît que des alternatives plus souples existeraient (LISP). Par ailleurs, il n'est pas évident de trouver des principes organisateurs pour les différents pattern XSL (sélection, matching, ...).
- La DTD xsl.dtd tient à jour l'état des différents éléments pris en compte dans ce projet. Elle est construite à partir des descriptions de XSL et ne constitue pas une référence officielle (pour cela voir http://www.w3.org/TR/xslt). Lors de l'analyse d'une feuille de style le système vérifie que l'ensemble du document est bien formé. Mais lors de la validation, les éléments qui ne possèdent pas le même espace de nom (NS), en l'occurence XSL, ne sont pas pris en compte.
- Le lien entre les "pattern" XSL de l'attribut SELECT et ceux de MATCH n'est pas évident. Le premier concerne le choix de la règle (TEMPLATE) et le contenu à transformer. Mais le deuxième concerne aussi le contenu. Tout est prévu pour pouvoir parcourir l'arbre du document à transformer. Les choix d'implémentations (tous ne sont pas faits) ne sont pas garantis.
Version 1.07
Quelques corrections de détail et ajout de la déclaration XSL:NUMBER
<!ELEMENT XSL:NUMBER EMPTY>
<!ATTLIST XSL:NUMBER VALUE CDATA #REQUIRED FORMAT #IMPLIED>
Exemple: <XSL:NUMBER VALUE="position()" FORMAT="1"/>
La fonction position retourne la position de l'élément et le format donne la valeur initiale (défaut: 0). Autres possibilités: FORMAT="a" ou "A".
Version alpha 1.08
Ajout de la déclaration XSL:IF.
Correction de petits bugs de présentation. Le moteur a été réorganisé afin de permettre une intégration plus facile des multiples écritures "de XPath".
Commentaire: Dans les recommendations "officielles" XSL:APPLY-TEMPLATES est déclaré pouvoir contenir XSL:SORT (entres autres) et utilisé comme telle mais aussi comme élément vide. XML permet-il cette "ubiquité" (la question a été posée au W3C).
Version beta 1.0 & 1.1
Réponse de Vincent Quint (W3C) au commentaire précédent:
Please, read section 3.1 of the XML Recommendation: http://www.w3.org/TR/REC-xml#sec-starttags Excerpt: "If an element is empty, it must be represented either by a start-tag immediately followed by an end-tag or by an empty-element tag... Empty-element tags may be used for any element which has no content, whether or not it is declared using the keyword EMPTY." This is followed by: "For interoperability, the empty-element tag must be used, and can only be used, for elements which are declared EMPTY." But this later statement is a non-binding recommendation (see the definition of interoperability) which is provided for compatibility with old SGML tools. In the case of XSLT, it's very unlikely that such a tool be used. Hence the frequent use of this Empty-element tag in XSLT. Vincent.
Cette version est basée, en ce qui concerne XSLT sur une version plus proche de celle proposée par W3C. En particulier en ce qui concerne la remarque précédente. Les balises seront notées en minuscules. Le type d'attribut XPATH a été introduit (cf idées en cours No 8). Un nouvelle organisation interne a été adoptée pour ces pattern (donc les fichiers xsl sont à recompiler).
Des options rendent également possibles de vérifier du HTML et de générer du HTML. Il est également possible de réaliser des "macros" (comparable au make de UNIX). Ces macros permettront de réaliser des opérations répétitives comme par exemple de transformer tous les fichiers d'un répertoire. C'est également à l'aide de macro que le lien avec UTOPIA sera fait.
L'élément xsl:copy-of a été introduit, de même que l'attribut mode (pour xsl:template et xsl:apply-templates). Des corrections ont été apportées à l'évaluation des variables (mais tous les cas de figure possibles ne sont pas encore disponibles). Seules les variables "vides" (dont la valeur est donnée par l'attribut "select") sont utilisables.
Version beta 1.1.1
Implémentation de l'attribut "disable-output-escaping" pour l'élément xsl:value-of. Cela permet, entre autres, de mettre des attributs produisant du HTML. Par exemple: <REF VALUE="nom<I>titre</I>"/>
Version beta 1.1.2
Poursuite de l'implémentation des macros
L'attribut strip-space (valeur yes ou no) a été ajouté à l'élément xsl:value-of. Cela permet de supprimer des sauts de ligne indésirables si une valeur doit devenir un argument de fonction !
Ajout des éléments xsl:attribut et xsl:element. Le premier permet d'ajouter des attributs à un élment, le deuxième à fabriquer un élément vide.
Version beta 1.2 (mars 2001)
Il semble y avoir plusieurs philosophies en ce qui concerne le mode de fonctionnement du moteur XSLT (qui pourraient se résumer par profondeur ou largeur d'abord). Cette version tente de coller au plus prêt de la recommandation du W3C avec une présélection des règles (sans toutefois gérer les conflits ni les priorités comme cela est prévu dans les spécification du W3C).
Quelques XSL-PATTERN supplémentaires sont pris en compte !
Le système n'acceptait pas les DTD déclarant des attributs ayant le nom de type (par exemple IDREF). Cette version corrige ce défaut pour IDREF (à titre de test).
Version beta 1.3 (janvier 2002)
Ajout de nouveaux PATH. Correction de bug liés au répertoire de travail. Les sections CDATA inclus dans la feuille XSL sont sorties comme du texte (ceci pour inclure des scripts et par le fait que les sections CDATA ne sont pas traitées dans les navigateurs).
Version 1.4 (février 2003)
Le sélecteur math admet des choses du type ELEM[@ATTR] ou ELEM[@ATTR=VAL]
Idées en cours
1) Mettre à tous les éléments un pointeur sur l'élément parent (pour l'utilisation de pattern .., par exemple). (fait de même que la numérotation (à partir de 0) des éléments fils du même type).
2) Actuellement les remplacements des entities se font après "parsage". Ce qui ajoute des niveaux d'analyse et de simplification. A voir si cela ne serait pas plus judicieux de la faire avant au niveau des chaînes de caractères. Dans ce cas attention au problème de parenthèsage (parenthèses avec les groupes, mais pas avec les attributs énumérés, ...). (fait)
3) A voir le problème des elements empty dans la sélection.
4) Actuellement tout les éléments et noms d'attributs sont "case sensitive". A voir si dans certains cas prédéfinis (XSL: ...) les autres cas pourraient être admis.
5) Le pattern MATCH=//<name of element> pose quelques problèmes (et semble contraire à l'esprit de la chose). A voir si tous les problèmes de remontées ne pourrait pas se régler au niveau du SELECT. (comme cela se fait déjà pour SELECT="../<element>").
6) Problème des attributs représentant des fonctions (par exemple: position()) : actuellement une option du menu permet de "parser" certains attributs (MATCH, SELECT, TEST). Il serait plus judicieux de commander cela à partir des types introduits dans la DTD (extension des types définis par XML, ce que fait le W3C dans sa recommendation de novembre 1999). (fait beta 1.1)
7) A noter que de nombreux projets importants existent. Un travail de diplôme mené à l'ESNIG a permis de montrer que les conventions adoptées par UXML étaient "presque" standard. A voir la possibilité d'utiliser les bibliothèques SAX.
Les exemples à disposition
(Voir le manuel)
Module wwwxml
Un module permettant la transformation XSL "à la volée" existe (pour serveurs IIS ou PWS ou Apache/Linux).
Mode d'emploi:
- Mettre le fichier xml compilé (<nom>.pml) dans un répertoire "exécutable" (par exemple: /scripts/xml) de même que la feuille de style (.xsl)
- Associer à l'aide de la base de registres l'extension .xml au programme
wwwxml.exe
- Sélectionner: HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/W3Svc/Parameters/ScriptMap
- faire le lien .xml ...\wwwxml.exe %s
- La requête à effectuer est http://.../scripts/xml/<nom>.xml
Note: l'utilisation du fichier pml (semi-cache) en lieu et place du fichier xml évite de trop charger le serveur inutilement. Une "moulinette" permettant de faire les mises à jour xml -> pml sera disponible.
Références
- Light, R. (1997). Presenting XML. SamsNet Pub.
- Harold, E.R. (1999). The XML Bible. (Chap 14: XSL transformations http://metalab.unc.edu/xml/books/bible/updates/14.htm)
- Bernadac, J.-C., Knab, F. (1999). Construire une application XML. Paris: Eyrolles.
- http://www.w3.org/XML/
- W3C: Extensible stylesheet language : Comprend notamment les documents de travail et recommendations: Extensible Stylesheet Language (XSL) ; Transformations (XSLT) Specification ; Path Language (XPath)
- La page de James Clark avec son fameux parser sp devenu xp pour XML.
- Xeena: parser XML en java d'IBM
- xml.com: partail maintenu par O'Reilly.
- Un site dédié au XML en français. Avec notamment de la documentation et un lien sur les traductions françaises du w3c.
Archive: uxml.zip (beta 1.1) wwwxml.zip
Merci de transmettre vos remarques, suggestions, questions. Vous pouvez également participer au projet, soit du point de vue technique (sources prolog disponibles) soit pour les applications pédagogiques.