Master Informatique 2 «RADI» Thème Applications Documentaires XML. Frédérik Bilhaut fbilhaut@info.unicaen.fr

Documents pareils
XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

Thierry BOULANGER. par la pratique. Bases indispensables Concepts et cas pratiques XML. 3 ième édition. Nouvelle édition

Faculté de Génie Chaire industrielle en infrastructures de communication. La technologie XML. Wajdi Elleuch

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

XML : documents et outils

XML, PMML, SOAP. Rapport. EPITA SCIA Promo janvier Julien Lemoine Alexandre Thibault Nicolas Wiest-Million

Gestion Électronique de Documents et XML. Master 2 TSM

XML et Bases de données. Les bases de données XML natives.

Autour du web. Une introduction technique Première partie : HTML. Georges-André SILBER Centre de recherche en informatique MINES ParisTech

Chapitre IX. L intégration de données. Les entrepôts de données (Data Warehouses) Motivation. Le problème

Gestion documentaire (Extraits du CCI version 1.2)

Evolution et architecture des systèmes d'information, de l'internet. Impact sur les IDS. IDS2014, Nailloux 26-28/05/2014

Qu'est-ce que XML? XML : Extensible Markup Language. Exemple de document SGML SGML

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

OASIS Date de publication

Programmation des Applications Réparties. Parsers XML DOM et SAX

Document Object Model (DOM)

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Programmation Internet Cours 4

Faculté Polytechnique de Mons. Le processus d Extraction, Transformation et Load (ETL) dans des entrepôts de données XML

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

Programmation Web. Madalina Croitoru IUT Montpellier

Systèmes d'informations historique et mutations

Livre Blanc WebSphere Transcoding Publisher

Les services usuels de l Internet

Introduction aux concepts d ez Publish

Gestion collaborative de documents

Les outils de création de sites web

Outils logiciels pour l'ingénierie documentaire

HMTL. Exemple de fichier HTML. Structure d un document HTML. Exemple de fichier HTML. Balises HTML. IFT1147 Programmation Serveur Web avec PHP

SII Stage d informatique pour l ingénieur

4. SERVICES WEB REST 46

Université de Bangui. Modélisons en UML

L'essentiel de XML. Cours XML. Olivier Carton

Cahier Technique. «Développer une application intranet pour la gestion des stages des étudiants» Antonin AILLET. Remi DEVES

Master d Informatique Corrigé du partiel novembre 2010

Auguria_PCM Product & Combination Manager

! Text Encoding Initiative

PROSOP : un système de gestion de bases de données prosopographiques

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Internet. DNS World Wide Web. Divers. Mécanismes de base Exécution d'applications sur le web. Proxy, fire-wall

Fichiers, dossiers, enregistrer et arborescence

Formation HTML / CSS. ar dionoea

XML et DOM. Matériel de cours. mars 1999 version 0.3 dernière modification: 24/3/99

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

STAGE IREM 0- Premiers pas en Python

Travaux pratiques avec RapidMiner

CRÉER, ROUTER ET GÉRER UNE NEWSLETTER, UN ING

Créer une base de données vidéo sans programmation (avec Drupal)

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

.. CSS. Damien Nouvel. Damien Nouvel (Inalco) CSS 1 / 15

L architecture des services Web

< Atelier 1 /> Démarrer une application web

Initiation à html et à la création d'un site web

THEME PROJET D ELABORATION D UNE BASE DE DONNEES SOUS LE SERVEUR MYSQL

Intelligence Artificielle et Systèmes Multi-Agents. Badr Benmammar

Petite définition : Présentation :

Créer une base de données

Notes pour l utilisation d Expression Web

7.0 Guide de la solution Portable sans fil

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

HTML, CSS, JS et CGI. Elanore Elessar Dimar

Introduction à MATLAB R

TP 1. Prise en main du langage Python

Devenez un véritable développeur web en 3 mois!

Formation Webmaster : Création de site Web Initiation + Approfondissement

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

FileMaker Server 11. Publication Web personnalisée avec XML et XSLT

Formation : WEbMaster

Climat Scolaire - Manuel utilisateur - Chapitre 2 : «Créer, Editer et suivi d un texte»

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

4D v11 SQL BREAKING THE LIMITS * Les nouveautés

Qlik Sense Cloud. Qlik Sense Copyright QlikTech International AB. Tous droits réservés.

Les bases de données Page 1 / 8

Projet 2. Gestion des services enseignants CENTRE D ENSEIGNEMENT ET DE RECHERCHE EN INFORMATIQUE. G r o u p e :

BASE. Vous avez alors accès à un ensemble de fonctionnalités explicitées ci-dessous :

BIRT (Business Intelligence and Reporting Tools)

Plateforme PAYZEN. Définition de Web-services

Présentation du langage et premières fonctions

Tutoriel QSOS. Version /02/2013

chapitre 4 Nombres de Catalan

Introduction à Microsoft InfoPath 2010

Learning Object Metadata

Note de cours. Introduction à Excel 2007

Pourquoi l apprentissage?

Configuration Interface for MEssage ROuting

ECLIPSE ET PDT (Php development tools)

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

NFE204 Bases de données avancées

Outils de traitements de logs Apache

Éléments de programmation et introduction à Java

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

BD et XML : Exercices

Magento. Magento. Réussir son site e-commerce. Réussir son site e-commerce BLANCHARD. Préface de Sébastien L e p e r s

Déployer les Fonts, Icones, et Images avec Forms Services 11G

Transcription:

Master Informatique 2 «RADI» Thème Applications Documentaires Frédérik Bilhaut fbilhaut@info.unicaen.fr XML Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 1

Plan du cours (4 2h) La sphère XML Le document structuré Le document XML Les spécifications associées Les documents composites Spécification de schémas XML Document Type Definition : DTD Manipulation de documents XML Navigation dans les arbres : XPath Transformation d'arbres : XSLT Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 2

La sphère XML Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 3

Le document structuré Un document structuré distingue deux aspects : Les données (textuelles ou autre) Le marquage de leur structure (champs, types, relations, etc.) La «s émantique» des données fait partie intégrante du document Exemple de document non structuré : Dupond;Jean;42 rue St Pierre;14000;Caen;Enseignant Durand;Pierre;27 rue des Lilas;14520;Maltot;Commerçant... Exemple de document structuré : [Personne] Nom=Dupond Prénom=Jean Adresse=42 rue St Pierre CP=14000 Ville=Caen Profession=Enseignant... Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 4

Document structuré vs. non structuré Avantages du document non structuré : Moins volumineux Parsing peu coûteux Aucune variabilité syntaxique Inconvénients : Manque de souplesse : Tous les champs doivent être spécifiés Toutes les entrées doivent avoir le même format Quasi impossible à interpréter sans spécification externe du format Les données et rien que les données Faible pérennité Pour le document structuré, c'est l'inverse! Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 5

Le document XML XML : extensible Markup Language «S uccesseur» de S GML (Standard Generalized Markup Language) Recommandation du World Wide Web Consortium (www.w3c.org) Standard ISO 8879 en 1986 Développé à partir de GML dans les années 70, dernière version en 2001 Exemples d'applications : HTML, DocBook Version 1.0 du 10 février 1998 (dernière édition le 6 octobre 2000) Version 1.1 du 4 février 2004 (changements mineurs) Définit une syntaxe pour les documents structurés Caractéristiques principales : Format textuel : tout document XML est aussi un fichier texte brut Modèle arborescent : tout document XML est aussi un arbre XML est un métalangage : c'est une syntaxe générique permettant de définir des langages spécifiques (des applications) tels que XHTML. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 6

Aperçu de la syntaxe XML (document XHTML) <?xml version="1.0" encoding="utf 8"?> <html> <head> <title>exemple de document XML</title> </head> <! Ceci est un commentaire > <body> <h1>ceci est un exemple de document XML</h1> <p> Ceci est un paragraphe. Nous montrons ici un exemple de fichier XHTML. Successeur de HTML, ce langage est une application de <a href="http://www.w3c.org">xml</a>. </p> <p align="right"> Ceci est un second paragraphe. Comme il est spécifié dans l'attribut <em>align</em>, il devra être aligné à droite. </p> </body> </html> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 7

Les avantage de XML (1) : Le méta langage XML n'est pas révolutionnaire, seulement indispensable! Une spécification simple Syntaxe rudimentaire et fortement contrainte Structure strictement arborescente Facilité d'implémentation, conformité facilement vérifiable ( SGML) C'est un langage auto descriptif Format ouvert et universel pour l'échange de données à grande échelle Des organismes spécialisés centralisent la spécification des formats La structure des données est spécifiée explicitement Le contenu est accessible aussi bien à l'humain qu'à l'ordinateur C'est un langage modulaire Un même document peut incorporer plusieurs jeux de balises Les espaces de noms permettent d'éviter les conflits Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 8

Les avantage de XML (2) : Les spécifications et outils associés Standardisation de nombreux formats interopérables Ex : XHTML + MathML + SVG Parseurs XML disponibles dans tous les environnements Plus besoin de définir une syntaxe ad hoc pour chaque application Gain de temps : développer une syntaxe et un parseur n'est pas trivial! Interopérabilité : simplifie l'échange de données avec d'autres agents La structure d'un langage peut être spécifiée formellement (ex: DTD), les parseurs peuvent les utiliser pour vérifier la conformité d'un document Langages déclaratifs de manipulation de documents (ex: XSLT) Implémentations disponibles sous toutes les plate formes Outils de visualisation et d'édition des documents (ex: CSS) Outils de stockage et d'interrogation Bases de données XML, langages de requêtes (ex: XQuery) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 9

Les différents aspects d'un document XML XML <document> <title> ABC </title> <section> <para> ABC </para>... </section> </document> Fichier «t exte» Ex : Unicode T Séq. Document «ren du» Ex : feuille de style CSS T T Structure arborescente Ex : DOM Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 10

Les différents aspects d'un document XML (2) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 11

La syntaxe XML Un document XML comporte différents types d'objets : Des éléments (ou balises) : <title>... </title> Des attributs (sur les éléments) : <a href="http://...">...</a> Des fragments de texte : Ceci est un fragment textuel Des commentaires : <! Ceci est un commentaire > Des instructions de traitement : <?xml stylesheet...?> Des entités : &copyright; Les «ex ceptions» syntaxiques : Caractères réservés : < > & " deviennent < > & " Éléments vides : <a name="toto"/> Sections littérales : <![CDATA[X&Y; Z>T]]> Référence à une DTD : <!DOCTYPE article SYSTEM "article.dtd"> Le prologue : <?xml version="1.0"...?> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 12

Correspondance arbre/document Chaque objet correspond à un noeud dans l'arbre Le document dans son ensemble a une structure strictement arborescente La racine de l'arbre doit être un élément. C'est le premier élément du document, et il ne peut avoir de frère Tout élément est un noeud ou une feuille de l'arbre Y compris le texte, les attributs, etc. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 13

Correspondance arbre/document (2) article #comment "Exemple" title #text "Le titre" #text "Du texte ici " section #attr id=42 nl para <?xml version="1.0"?> <article> <! Exemple > <title>le titre</title> <section id="42"> <para> Du texte ici <nl/> et là. <acro>xml</acro>&tm; </para> </section> </article> #text " et là." acro #entity tm #text "XML" Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 14

Orientation document vs. orientation données On peut distinguer deux types d'arbres XML : Orientés «documents» Orientés «données» On représente un document textuel dans sa linéarité La structure de l'arbre coïncide avec la structure logique du document. La structure de l'arbre coïncide avec le modèle de données utilisé On peut trouver des documents hybrides <?xml version="1.0"?> <document lang="fr"> <title>le titre</title> <section> <para class="intro"> Voici un arbre XML orienté document. </para> </section> </document> <?xml version="1.0"?> <! Voici un arbre orienté données représentant un graphe > <graph name="mon graphe"> <node id="1">noeud 1</node> <node id="2">noeud 2</node> <node id="3">noeud 3</node> <arc from="1" to="2"/> <arc from="1" to="3">label</arc> </graph> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 15

Gestion de l'encodage des caractères Un document XML peut (devrait) spécifier l'encodage utilisé En théorie, la fin d'un problème ancien mais persistant! Encodages courants : UTF 8 (Unicode), ISO 8859 15 (Latin 1) Il est possible de faire référence à des caractères «sp éciaux» Entités numériques spécifiant directement un numéro Unicode <?xml version="1.0" encoding="utf 8"?> <document> <paragraph> Pour spécifier des caractères spéciaux, on peut utiliser des entités "numériques" faisant référence à des caractères Unicode. </paragraph> <formula> x 0, f(x) < e </formula> </document> x 0, f x e Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 16

Gestion des sauts de lignes Différentes représentations des sauts de lignes (EOL) La spécification XML reconnaît toutes ces combinaisons Linux : h10 Windows : h13 + h10 Mac : h13... Un parseur doit les remplacer toutes par h10 L'application n'a pas à tenir compte du type de sauts de lignes utilisés XML 1.1 reconnaît de nouveaux types de fin de lignes IBM mainframes : h85 Fin de ligne Unicode : h2028 Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 17

Spécification de schémas XML étant un méta langage, son utilisation se traduit par la définition d'applications spécifiques (ex : XHTML, SVG,...) XML définit une syntaxe générique Chaque application définit un schéma (ou vocabulaire) spécifique Exemple de spécification informelle d'un schéma : Le présent document spécifie un schéma XML permettant de représenter des graphes orientés. Les différentes balises définies sont : graph (la racine), node et arc. Un élément graph décrit un graphe, et contient des éléments node (au moins un) et arc (de 0 à n). Il accepte l'attribut optionnel name spécifiant l'intitulé du graphe. Un élément node décrit un noeud du graphe, et contient éventuellement du texte définissant son label. Il demande l'attribut obligatoire id spécifiant un identifiant unique. Un élément arc décrit un arc du graphe, et contient éventuellement du texte définissant son label. Il demande les attributs obligatoires from et to, spécifiant respectivement les identifiants du noeud de départ et du noeud d'arrivée (ceux ci doivent obligatoirement être spécifiés au sein du même noeud graph). Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 18

Spécification de schémas (1bis) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 19

Spécification de schémas (2) Pour un document donné, la spécification du schéma peut être : Implicite : Elle est (en principe) spécifiée dans un document échangé entre les utilisateurs du format. Cette spécification est plus ou moins formellement, par exemple en langage naturel «contraint» Elle n'est pas accessible aux processus informatiques Le bon fonctionnement de l'échange d'information repose uniquement sur la confiance entre les intervenants. Explicite : Elle est spécifiée formellement dans un format bien défini Elle est accessible à la fois aux humains et aux processus informatiques Un document peut indiquer explicitement le schéma auquel il se conforme Les outils informatiques peuvent vérifier la conformité d'un document relativement à un schéma, et indiquer d'éventuelles erreurs Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 20

Spécification de schémas (3) Plusieurs langages formels permettent de spécifier un schéma : Document Type Definition (DTD) XSchema Format ancien (date de SGML) et peu expressif, mais encore couramment utilisé (fait partie de la spécification XML) Utilise une syntaxe spécifique Son utilisation reste obligatoire pour définir des entités Spécification du W3C, en relation avec d'autres spécifications Plus puissant que DTD (modularité, gestion des types, des espaces de noms...) Il est lui même un vocabulaire XML ( par ex: génération auto. de la doc.) Mais relativement complexe et ne lève pas toutes les limitations des DTD Relax NG «Concurrent» de XSchema, aux propriétés semblables Spécification indépendante visant la normalisation ISO Se veut plus souple et plus simple que XSchema Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 21

Document bien formé vs. document valide Deux niveaux de conformité d'un document XML : Le document bien formé Respecte scrupuleusement la syntaxe XML Respecte l'encodage de caractères annoncé Intéressant en soi car la sémantique d'un document XML bien formé est clairement définie (par opposition aux documents HTML dont l'interprétation faut appel à des heuristiques propres à chaque navigateur) Le document valide Un document est dit valide relativement à un schéma donné (DTD ou autre) Un document valide est aussi bien formé Un document valide n'est plus considéré comme tel si le document spécifiant son schéma n'est pas accessible L'utilisation d'un schéma n'est pas obligatoire, mais devient quasi indispensable pour toute application «r éelle» : le schéma est totalement formalisé et sert de référence tant pour les processus informatiques que pour les intervenants humains Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 22

«Rendu» d'un document XML Différentes méthodes permettent de produire des «vues» d'un document XML On peut avoir plusieurs vues d'un même document À chaque vue correspondra une feuille de style Le procédé dépend principalement du type de document S'il est orienté document : Le plus souvent, une feuille de style type CSS convient La FdS spécifie les modalités d'affichage de chaque type de noeud Le document est affiché selon sa propre structure S'il est orienté données : Le plus souvent, une transformation est nécessaire (par ex. XSLT) Par exemple en XHTML, XSL:FO, etc. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 23

Affichage d'un fichier XML orienté «document» avec une feuille de style <?xml version="1.0"?> <document lang="fr"> <title>le titre</title> <section> <para type="intro"> Voici un arbre XML. </para> <para> Du texte du texte. Du texte du texte. Du texte du texte. Du texte du texte. </para> <para> Encore du texte. Encore du texte. Encore du texte. </para> </section> </document> document { CSS display: block; } title { font size: 16pt; text align: center; } para { text indent: 5pt; } para[type=intro] { font style: italic; } Le titre Voici un arbre XML. Du texte du texte. Du texte du texte. Du texte du texte. Du texte du texte. Encore du texte. Encore du texte. Encore du texte. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 24

Affichage d'un fichier XML orienté «données» avec transformation Exemple des graphes Orienté «données» : on va le tran sformer dans une représentation adaptée à la représentation visuelle Au moins deux représentations possibles : Matrice d'adjacence Tableau HTML Graphique (noeuds & arcs) Dessin SVG <?xml version="1.0"?> <graph> <node id="1">n1</node> <node id="2">n2</node> <node id="3">n3</node> <arc from="1" to="2"/> <arc from="2" to="3"/> <arc from="3" to="1"/> </graph> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 25

Affichage d'un fichier XML orienté «données» avec transformation (1) transformation <?xml version="1.0"?> <graph> <node id="1">n1</node> <node id="2">n2</node> <node id="3">n3</node> <arc from="1" to="2"/> <arc from="2" to="3"/> <arc from="3" to="1"/> </graph> N1 N1 N3 X N2 N3 N2 X X <?xml version="1.0"?> <html> <table> XHTML <tr> <th/> <th>n1</th> <th>n2</th> <th>n3</th> </tr> [...] </table> </html> table { CSS width: 80%; } th { font weight: bold; } Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 26

Affichage d'un fichier XML orienté «données» avec transformation (2) transformation <?xml version="1.0"?> <graph> <node id="1">n1</node> <node id="2">n2</node> <node id="3">n3</node> <arc from="1" to="2"/> <arc from="2" to="3"/> <arc from="3" to="1"/> </graph> N1 N2 N3 <?xml version="1.0"?> <svg> <g> <circle x="5" y="20" radius="40"/> <text x="15" y="35"> N1 </text> [...] SVG </g> </svg> circle { border width: 2px; } text { CSS align: center; } Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 27

Affichage d'un fichier XML orienté «document» avec transformation transformation <?xml version="1.0"?> <document lang="fr"> <title>le titre</title> <section> <para type="intro"> Voici un arbre XML. </para> <para> Du texte du texte. Du texte du texte. Du texte du texte. Du texte du texte. </para> <para> Encore du texte. Encore du texte. Encore du texte. </para> </section> </document> <?xml version="1.0"?> <root> <page sequence> <flow> <block> Du texte [...] </block> [...] XSL:FO </flow> </page sequence> </root> Le titre Voici un arbre XML. PDF Du texte du texte. Du texte du texte. Du texte du texte. Du texte du texte. Encore du texte. Encore du texte. Encore du texte. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 28

Exemple de document XML visualisé avec CSS Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 29

Exemple de documents visualisés après transformations en HTML Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 30

Exemple d'éditeur XML basé sur CSS (WYSIWYM) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 31

Les espaces de noms Les espaces de noms (ou namespaces) permettent d'éviter les conflits entre des vocabulaires différents À chaque vocabulaire est associé un espace de noms Un espace de nom est identifié sans ambiguïté par une URI Fait partie de la spécification du vocabulaire XHTML : http://www.w3.org/1999/xhtml SVG : http://www.w3.org/2000/svg L'attribut xmlns permet de spécifier l'espace de nom utilisé : <?xml version="1.0" encoding="utf 8"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>exemple de document XML</title> </head> [...] </html> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 32

Les espaces de noms (2) Les namespaces peuvent être spécifiés en tout point de l'arbre La déclaration d'un namespace s'applique pour l'ensemble du sous arbre <?xml version="1.0" encoding="utf 8"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>exemple de document XML</title> </head> <body> <p>voir le graphique ci dessous :</p> <g xmlns="http://www.w3.org/2000/svg"> <circle... /> </g> </body> </html> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 33

Les espaces de noms (3) Pour faire faciliter la cohabitation des namespaces, on peut leur associer des préfixes Il seront utilisés pour spécifier le namespace de chaque élément Le choix des préfixes est local et arbitraire <?xml version="1.0" encoding="utf 8"?> <html:html xmlns:html="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <html:head> <html:title>exemple de document XML</html:title> </html:head> <html:body> <html:p>voir le graphique ci dessous :</html:p> <svg:g> <svg:circle... /> </svg:g> </html:body> </html:html> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 34

Les espaces de noms (4) Les préfixes peuvent cohabiter avec le namespace par défaut Celui ci s'applique quand aucun préfixe n'est spécifié <?xml version="1.0" encoding="utf 8"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> <head> <title>exemple de document XML</title> </head> <body> <p>voir le graphique ci dessous :</p> <svg:g> <svg:circle... /> </svg:g> </body> </html> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 35

Exemple de document composé XHTML MathML SVG Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 36

Les parseurs XML Bibliothèques permettant la manipulation de documents XML Acceptent tout documents bien formé Éventuellement, valident le document relativement à un schéma Parseurs à «m odèle objet» (Document Object Model / DOM) Construit un modèle objet de l'arbre XML Ce modèle est indépendant du langage de programmation (spéc. W3C) Disponible dans tous les langages de programmation / scripts Possibilité de naviguer facilement dans tout le document Simplifie la création de nouveaux documents (sans se soucier de la syntaxe), permet la migration de fragments d'un document à l'autre Occupation mémoire proportionnelle à la taille du document la taille des documents manipulables dépend de la mémoire disponible Procède systématiquement à l'analyse de l'intégralité du document Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 37

Les parseurs XML (2) Extrait du «Document Object Model» Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 38

Les parseurs XML (3) Parseurs de type «év énementiel» (Simple API for XML / SAX) Le document est vu comme une liste plate d'objets élémentaires Balises de début/fin, fragments textuels, commentaires, etc. ( objets DOM) Le document est parcouru linéairement un événement est émis pour chaque élément rencontré Début du document Balise début: "article" Commentaire: "Exemple" <?xml version="1.0"?> Balise début: "titre" <article> Texte: "Le titre" <! Exemple > Balise fin: "title" <title>le titre</title> Balise début: "section", {id="42"} <section id="42"> Balise début: "para" <para> Texte: "Du texte ici" Du texte ici <nl/> Balise début: "nl" et là. Balise fin: "nl" </para> Balise fin: "para" </section> Balise fin: "section" </article> Balise fin: "article" Fin du document Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 39

Les parseurs XML (4) Parseurs de type «év énementiel» (suite) Des parseurs SAX sont disponibles dans quasiment tous les langages Leur implique l'implémentation d'une interface quasiment standard A chaque méthode correspond un événement Le parseur les appelle en fonction des évènements détectés Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 40

Les parseurs XML (5) Parseurs de type «év énementiel» (suite) Occupation mémoire minime car le document n'y est jamais représenté dans son ensemble Possibilité de traiter des documents de taille quelconque Traitement rapide On ne s'occupe que les éléments nécessaires Pas de temps consacré à la construction des objets du DOM On n'a pas de vue globale sur le document C'est à l'utilisateur de mémoriser le nécessaire au cours du traitement État courant, données en attente de traitement, etc. En général automate à pile En «lecture» s eulement (pas de génération de XML) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 41

Vue d'ensemble de la sphère XML Modèles de documents XHTML SVG XForms Transformation & requêtes XSLT SOAP MathML DocBook Services Web SMIL XSL FO XQuery WSDL... Chemins, liens & pointeurs OpenOffice XML Web Sémantique RDF RDF Schema DOAP... FOAF OWL Spécification de schémas XSchema XPath XPointer XLink XInclude Spécifications associées DTD Relax NG Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 CSS HTTP URI Unicode ECMAScript 42

Exemples de documents XML DocBook : Documents LinguaStream XHTML + MathML + SVG composite.xhtml Fichier «A nt» Document annoté / annotations document.lsd, semantics.lss Chaîne de traitement stream.ls Document composite Documentation technique (entre autres) docbook.dbx Équivalent Java/XML du «M akefile» ant.svg Diagramme UML Fichier «D ia» diagramme.dia Document SVG diagramme.svg Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 43

La plate forme LinguaStream http://www.linguastream.org Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 44

Document Type Definitions Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 45

Document Type Definitions (DTD) Le format «D TD» permet de définir formellement un schéma (ou vocabulaire) XML. Format «d e base» (fait partie de la s pécification XML) Une alternative parmi d'autres (XSchema, RelaxNG,...) Une DTD définit en intension toutes les formes possibles d'un document conforme au schéma décrit Un schéma définit une classe de documents Chaque document est une instance particulière Un document XML peut indiquer la DTD à laquelle il se conforme Lien vers un document externe, intégrée au document, ou mixte Dans ce cas, un parseur XML pourra valider le document Si le document n'est pas conforme, le traitement est interrompu Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 46

Déclaration du type de document Par inclusion dans le document : <?xml version="1.0" standalone="yes"?> <!DOCTYPE document [ <! Définition du schéma > ]> <document>... </document> Dans un document séparé (préférable) : <?xml version="1.0" standalone="no"?> <?xml version="1.0"?> <!DOCTYPE document SYSTEM "schema.dtd"> <!ELEMENT document...> <document>... </document> <!ELEMENT section...> <!ELEMENT para...> document.xml schema.dtd Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 47

Aperçu de la syntaxe DTD <?xml version="1.0" encoding="utf 8"?> <!ELEMENT document (title, section+)> <!ATTLIST document lang NMTOKEN #IMPLIED> <!ELEMENT section (title, (para section)+> <!ATTLIST section id ID #IMPLIED lang NMTOKEN #IMPLIED> <!ELEMENT para (#PCDATA em sub exp)*> <!ELEMENT title (#PCDATA)> <!ELEMENT em (#PCDATA)> <!ELEMENT nl EMPTY> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 48

Définition des éléments <!ELEMENT document (title, section+)> mot clef Obligatoirement en majuscules Nom de l'élément : modèle de contenu Mot clef : nom de l'élément Graphie exacte de la balise dans le document Nom XML valide : pas d'espaces, respect de la casse, etc. Modèle de contenu Définit les éléments autorisés à l'intérieur de cette balise Définit leur multiplicité, éventuellement un ordre, etc. Syntaxe type «expres sions régulières» Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 49

Modèle de contenu des éléments Cas général : liste de sous éléments Séparés par des virgules : ordre défini Séparés par des barres verticales : ordre non défini <!ELEMENT section (para section)> Premier parenthèses obligatoires Un parenthésage supplémentaire permet de combiner les opérateurs : <!ELEMENT chapitre (titre, intro, section)> <!ELEMENT section (intro, (para section))> Opérateurs de multiplicité : Optionnel non répétable (0~1) : x? Optionnel répétable (0~*) : x* Obligatoire répétable (1~*) : x+ <!ELEMENT chapitre (titre?, intro*, section+)> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 50

Modèle de contenu des éléments (2) Rq : chaque élément «fils» doit à son tour définir son propre modèle de contenu <!ELEMENT toto (a b)*> <toto><a>...</a><b>...</b><b>...</b><a>...</a></toto> <toto><a>...</a><b>...<a>...</a>...</b></toto> Données textuelles Mot clef #PCDATA (Parsed Character Data) <!ELEMENT para (#PCDATA)> <para>en 3e année, on constate que...</para> Le contenu est fréquemment mixte : <!ELEMENT para (#PCDATA em sub exp)*> <para>en 3<exp>ème</exp> année, on constate...</para> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 51

Modèle de contenu des éléments (3) Contenu non spécifié <!ELEMENT toto ANY> La structure du contenu n'est pas contrainte, mais : Peu intéressant en DTD (surtout utile durant la mise au point du schéma) Le contenu doit rester bien formé Les balises contenues doivent avoir été déclarées dans la DTD En XSchema, le «an y» pourra être associé à un namespace Contenu vide On peut demander qu'un élément soit obligatoirement vide <!ELEMENT toto EMPTY> <toto x="y"/> ou <toto x="y"></toto> (sauf en SGML) Un modèle peut autoriser un contenu vide sans le rendre obligatoire <!ELEMENT toto (#PCDATA x y)*> On ne peut pas mêler «empty» à d' autres éléments <!ELEMENT toto (EMPTY titi)> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 52

Définition des attributs mot clef <!ATTLIST document attr1 type1 mode1 attr2 type2 mode2... > nom d'attribut Si la DTD est donnée, seuls les attributs déclarés pourront être spécifiés Un attribut donné ne peut être spécifié qu'une seule fois Nom de l'élément : déclaration de défaut Règles générales concernant les attributs type de donnée nom de l'élément Graphie exacte de la balise dont on définit les attributs Nom d'attribut Graphie exacte de l'attribut (règles XML habituelles) Les noms commençant par «xml» s ont interdits Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 53

Définition des attributs (2) Types de données disponibles : CDATA : chaîne de caractères littérale (Character Data) ID : identifiant unique au sein du document (un seul par élément) IDREF : référence à un identifiant du même document NMTOKEN(S) : un (ou plusieurs) symboles (Name Token) ENTITY et NOTATION : marginal et ± obsolète, cf. spécification XML Liste de choix possibles dans un ensemble de symboles prédéfinis Énumération des symboles séparés par des barres verticales : (a b c) Rq: XSchema est beaucoup plus expressif sur ce point (types «fins») Déclaration de défaut (ou mode) : Valeur par défaut : en vigueur lorsque l'attribut ne sera pas spécifié #REQUIRED : l'attribut devra obligatoirement être spécifié #IMPLIED : l'attribut est facultatif #FIXED : valeur figée et non re définissable Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 54

Définition des attributs (3) Exemples <!ELEMENT document...> <!ATTLIST document lang (fr en es de other unknown) #REQUIRED author CDATA #IMPLIED version CDATA #FIXED "1.2"> <!ELEMENT section...> <!ATTLIST section id ID #IMPLIED includeintoc (yes no) yes> <!ELEMENT para...> <!ATTLIST para class NMTOKEN #IMPLIED> <!ELEMENT xref...> <!ATTLIST xref target IDREF #REQUIRED> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 55

Définition d'entités générales <!ENTITY nom "valeur"> nom de l'entité Permet de définir ses propres entités Elles seront remplacées par leur valeur de substitution lors du parsing Nom de l'entité valeur de substitution Graphie exacte de l'entité telle qu'elle apparaîtra dans les documents Règles XML habituelles Valeur de remplacement Texte et/ou références à d'autres entités (prédéfinies ou non) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 56

Définition d'entités générales (2) Exemple <?xml version="1.0"?> <!DOCTYPE document [ <!ENTITY cp " "> <!ENTITY copyright "&cp; James Bond"> <!... > ]> <document> <para> Du texte et encore du texte. [...] </para> <para> &copyright; </para> </document> Du texte et encore du texte. Du texte et encore du texte. James Bond Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 57

Retour sur l'exemple des graphes Le présent document spécifie un schéma XML permettant de représenter des graphes orientés. Les différentes balises définies sont : graph (la racine), node et arc. Un élément graph décrit un graphe, et contient des éléments node (au moins un) et arc (de 0 à n). Il accepte l'attribut optionnel name spécifiant l'intitulé du graphe. L'attribut figé version détermine la version de cette spécification (1.2). Un élément node décrit un noeud du graphe, et contient éventuellement du texte définissant son label. Il demande l'attribut obligatoire id spécifiant un identifiant unique. Un élément arc décrit un arc du graphe, et contient éventuellement du texte définissant son label. Il demande les attributs obligatoires from et to, spécifiant respectivement les identifiants du noeud de départ et du noeud d'arrivée (ceux ci doivent être spécifiés au sein du même noeud graph). Spécification informelle du schéma N1 N2 N3 Exemple de graphe <?xml version="1.0"?> <graph version="1.2"> <node id="1">n1</node> <node id="2">n2</node> <node id="3">n3</node> <arc from="1" to="2"/> <arc from="2" to="3"/> <arc from="3" to="1"/> </graph> Exemple d'instance Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 58

Retour sur l'exemple des graphes (2) : la DTD <?xml version="1.0" encoding="iso 8859 1"?> <!ELEMENT graph (node+, arc*)> <!ATTLIST graph name CDATA #IMPLIED> version CDATA #FIXED "1.2"> <!ELEMENT node (#PCDATA)> <!ATTLIST node id ID #REQUIRED> <!ELEMENT arc EMPTY> <!ATTLIST arc to IDREF #REQUIRED from IDREF #REQUIRED> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 59

Exercice : proposer une DTD à partir d'un document «type» <?xml version="1.0" encoding="utf 8"?> <project basedir="." default="compile" name="mon projet"> <description> Ceci est un exemple valide de fichier "Ant". </description> <property name="options" value=" v"/> <path id="monclasspath"> <pathelement location="lib/xerces.jar"/> <pathelement location="lib/xalan.jar"/> </path> <target name="compile" depends="clean"> <javac srcdir="." encoding="iso 8859 1"> <classpath refid="monclasspath"/> </javac> <rmic base="." classname="fr.unicaen.test.serviceimpl"> <classpath refid="monclasspath"/> </rmic> </target> <target name="documentation"> <ant antfile="build.xml" target="pdf" dir="doc/manual"/> <ant antfile="build.xml" target="javahelp" dir="doc/manual"/> </target> <target name="clean"> <delete> <fileset dir="." includes="**/*.class"/> <fileset dir="." includes="**/*.java~" defaultexcludes="no"/> </delete> </target> </project> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 60

Les limites du formalisme DTD Manque de modularité Pas de gestion de types évolués De plus en plus de documents sont composites, i.e. utilisent simultanément plusieurs schémas On ne peut ni associer une DTD à un namespace, ni combiner proprement plusieurs DTD Formats numériques, dates, contraintes sur les chaînes de caractère, etc. Limites sur les modèles de contenu Ex 1 : dans un graphe, au moins un noeud et zéro ou plusieurs arcs, dans n'importe quel ordre <!ELEMENT graph (arc*,node,(node arc)*)> (!) Ex 2 : un élément peut contenir trois types de sous éléments (a, b et c), avec au moins un de chaque, dans un ordre quelconque??? Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 61

Les limites du formalisme DTD (2) Pas de notion d'extensibilité ou d'héritage Il est fréquent que plusieurs éléments partagent des propriétés communes Des solutions existent en DTD mais sont très primitives On ne dispose que des commentaires pour documenter le schéma La syntaxe DTD n'est pas un vocabulaire XML Substitution de «macr os» Pas de gestion des annotations Ex : balises chapter, section, appendix etc. possédant toutes un attribut id et un premier sous élément title Impossible de manipuler le contenu d'une DTD avec les outils XML! Etc. DTD est hérité de SGML et n'a pas suivi toutes les évolutions de XML Mais il reste encore très fréquemment utilisé Heureusement, la plupart de ses limites sont levées par XSchema Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 62

XPath & XSLT Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 63

Transformation d'un document XML Retour sur l'exemple des graphes <?xml version="1.0"?> <graph> <node id="1">n1</node> <node id="2">n2</node> <node id="3">n3</node> <arc from="1" to="2"/> <arc from="2" to="3"/> <arc from="3" to="1"/> </graph> N1 N1 N3 X N2 N3 N2 X X <?xml version="1.0"?> <html> <table> <tr> <th/> <th>n1</th> <th>n2</th> <th>n3</th> </tr> <tr> <th>n1</th> <td></td> <td>x</td> <td></td> </tr> [...] </table> </html> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 64

Transformation d'un document XML Un exemple plus complexe, réalisable en XSLT pur <?xml version="1.0"?> <Airport lat="49.173333" lon=" 0.450000" ident="lfrk"> <Runway length="1895.86"> <ILS frequency="110.95"> [...] </ILS> </Runway> [...] </Airport> Document XML décrivant un aérodrome (schéma spécifique) Carte au format SVG ( OACI) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 65

Transformation d'arbres La transformation d'arbres est une opération très courante : Pour exprimer les mêmes données sous un autre format ( équivalent) Pour exprimer les données sous un format directement affichable Ex : ne garder que les noeuds X ayant une propriété Y Ajouter des données «nouvelles» (même format ou par compos ition) Ex : DocBook HTML, GraphML SVG Pour sélectionner une partie de données Ex : OpenOffice WordML, GraphML GXL Ex : table des matières, index, etc. Deux façons de procéder : Impérative : programme utilisant un parseur et une API de génération Déclarative : utilisation d'un formalisme permettant de décrire les transformations à effectuer + moteur adéquat Ex : XSLT, XQuery, STX,... Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 66

exstensible Stylesheet Language (XSL) Spécification du W3C qui regroupe trois langages distincts XSLT : transformations d'arbres XML XPath : spécification de sous arbres XSL FO : Mise en forme (Formatting Objects, non traité ici) Trois spécifications maintenant indépendantes XSLT : version 1.0 en 1999, version 2.0 actuellement en doc. de travail XPath : version 1.0 en 1990, version 2.0 actuellement en doc. de travail XSL FO : version, 1.0 en 2001 XPath XSLT XQuery XPointer Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005... 67

XPath Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 68

Introduction à XPath La langage XPath est utilisé pour désigner un ou plusieurs noeuds d'un arbre XML Syntaxe compacte et non XML Inclusion simple dans les attributs XML, les URI, etc. La syntaxe XPath définit des expressions L'évaluation d'une expression s'opère dans un contexte bien défini Le contexte est généralement un noeud du document En évaluant une expression, on peut obtenir différents types de valeurs : Un ensemble de noeuds (liste non ordonnée et non redondante) Une chaîne de caractères Une valeur booléenne Une valeur numérique Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 69

Quelques exemples basiques Une expression est généralement un chemin dans l'arbre XML Principe similaire aux chemins d'accès dans un système de fichiers Le contexte est analogue au répertoire courant ( noeud courant) Mais : une expression XPath peut désigner plusieurs noeuds, et peut n'en désigner aucun Chemins simples : Noms d'éléments séparés par des «/» /document/section/paragraph tout paragraphe fils d'une section fille de la racine (document) Chemins relatifs (au contexte courant) : paragraph ou./paragraph tout paragraphe fils du noeud courant section/paragraph tout paragraphe fils d'une section fille du noeud courant Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 70

Quelques exemples basiques (2) Chemins simples (suite) : Utilisation du joker section/* section//* tout noeud descendant d'une section fille du noeud courant Accès aux noeuds parents../paragraph tout noeud fils direct d'une section fille du noeud courant tout noeud paragraphe fils direct du noeud parent Chemins à profondeur variable //paragraph.//paragraph n'importe quel paragraphe (dans l'ensemble du document) n'importe quel paragraphe descendant du noeud courant /document/section//paragraph un paragraphe descendant d'une section Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 71

Axes de déplacements dans l'arbre Pour chaque étape d'un chemin on peut spécifier un «axe» Celui ci spécifie la «direction» du déplacement Par défaut, l'axe suivi est celui des noeuds fils Pour alléger la notation ce dernier peut être omis (cf. ex. précédents) XPath définit les axes suivants : L'axe des noeuds fils (child) : contient tous les fils directs L'axe des noeuds descendants (descendant) : tous les fils, directs ou non L'axe parent (parent) : le noeud parent s'il existe L'axe des ancêtres (ancestor) : tous les noeuds parents, directs ou non L'axe des frères successeurs (following sibling) : tous les frères suivants (dans l'ordre du document) L'axe des frères prédécesseurs (preceding sibling) : idem pour les frères précédents Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 72

Axes de déplacements dans l'arbre (2) XPath définit les axes suivants (suite) : L'axe des successeurs (following) : tous les noeuds suivants dans l'ordre du document, à l'exclusion de la descendance, des attributs et des espaces de noms L'axe des prédécesseurs (preceding) : idem pour les noeuds précédents L'axe des attributs (attribute) : contient les attributs de l'élément courant s'il s'agit d'un élément (vide sinon) L'axe réflexif (self) : contient le noeud courant L'axe descendant ou réflexif (descendant or self) : contient le noeud courant et ses descendants L'axe ancêtre ou réflexif (ancestor or self) : idem pour les ancêtres L'axe des espaces de noms (namespace) : espaces de noms déclarés s'il s'agit d'un élément (vide sinon) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 73

Axes de déplacements dans l'arbre (3) Remarque 1 : partitionnement du document Les axes des ancêtres, des descendants, des prédécesseurs, des prédécesseurs et réflexif partitionnent le document (sauf attributs et espaces de noms) : ils ne se recouvrent pas les uns les autres et, à eux tous, contiennent tous les noeuds d'un document. Remarque 2 : à chaque axe est associé un type de noeud principal Axe des attributs : attribute Axe des espaces de noms : namespace Tous les autres axes : element Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 74

Syntaxe complète d'une étape de localisation Un chemin comporte une ou plusieurs étapes de localisation La syntaxe de chaque étape est : axe::test[prédicat ]...[prédicat ] L'élément axe spécifie le «sens» du déplacement 1 parent, ancestor, following,... L'élément test est une contrainte sur type ou le nom du noeud N Nom de balise ou d'attribut, ex : child::document, attribute::id, etc. Joker * : vrai pour tout noeud du type de noeud principal, ex : attribute::* Contrainte text() : noeud textuel Contrainte comment() : commentaire Contrainte processing instruction() : instruction de traitement Contrainte node() : vrai pour tout noeud Les prédicats permettent de procéder à des filtrages supplémentaires Ex : sur la position dans l'arbre, sur les attributs (pour un élément), etc. Les prédicats seront détaillés plus loin Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 75

Syntaxe abrégée des étapes de localisation Pour alléger la syntaxe des raccourcis syntaxiques sont définis : L'axe des fils est implicite : section/para child::section/child::para Accès aux attributs : @class attribute::class Descendants : //para /descendant or self::node()/child::para Noeud courant :./para self::node()/child::para Noeud parent :../para /parent::node()/child::para Exemples : chapter//para text() noeuds textuels fils du noeud courant @* descendants para des enfants chapter du noeud courant tous les attributs du noeud contextuel../@lang l'attribut lang du parent du noeud courant Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 76

Expressions simples La syntaxe XPath reconnaît également des expressions plus «cla ssiques» : XPath gère différents types de données Expressions booléennes : x or (y and z) Expressions arithmétiques : x * (y z) Appels fonctionnels : f(x,y,z) Appel à des variables : $v Valeurs littérales : 37.5, 'chaîne de caractères', "autre chaîne" Numérique (réels), booléen, chaîne, liste de noeuds, etc. Le typage est dynamique et implicite, avec possibilité de conversion explicites Appels fonctionnels : La spécification définit un ensemble de fonctions utilitaires XPath 2.0 élargit cet ensemble et permet d'écrire ses propre fonctions Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 77

Expressions simples (2) Expressions booléennes : Expressions arithmétiques : Opérateurs : and, or Fonctions de base : not(), true(), false() Comparateurs : =,!=, <, >, <=, >= Opérateurs : +,, *, div, mod (priorités habituelles) Exemples de fonctions disponibles (cf. spéc. pour liste complète) Sur des ensembles de noeuds : last() : retourne la dimension contextuelle (i.e. nombre de noeuds sélectionnés par l'étape précédente) position() : position dans le contexte (dans la liste des noeuds sélectionnés par le test ou le prédicat précédent) count($ns) : nombre de noeuds dans la liste de noeuds $ns name($ns) : retourne le nom du noeud en première position dans $ns (il existe aussi local name() et namespace uri() pour gérer les espaces de noms) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 78

Expressions simples (3) Exemples de fonctions disponibles (suite) : Sur les valeurs numériques : sum($nl) : retourne la somme de tous les objets présents dans $nl une fois convertis en numériques floor($v) : retourne le plus grand nombre entier inférieur à l'argument round($v) : retourne le nombre entier le plus proche de l'argument Sur les chaînes de caractères : concat($v1,...,$vn) : retourne le résultat de la concaténation des arguments starts with($s1,$s2) : retourne vrai si $s1 commence par la chaîne $s2 contains($s1,$s2) : retourne vrai si $s1 contient la chaîne $s2 Conversion de type (selon des règles bien définies, cf. spécification) : string($v) : retourne une chaîne représentant $v boolean($v) : retourne un booléen «éq uivalent» à $v (nombre 0, liste de noeuds non vide, chaîne de longueur non nulle, etc.) number($v) : retourne un équivalentn umérique de $v (si possible, NaN sinon) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 79

Les prédicats Un prédicat ajoute une contrainte sur les noeuds sélectionnés à l'étape de localisation à laquelle il appartient 1 N Les prédicats sont appliqués dans l'ordre de leur apparition Rappel de la syntaxe d'une étape : axe::test[prédicat ]...[prédicat ] Le premier s'applique aux noeuds sélectionnés par le couple axe/test Chacun d'entre eux s'applique à l'ensemble sélectionné par les précédents Un prédicat est une expression XPath quelconque Son contexte d'évaluation sera le noeud auquel le prédicat est appliqué Elle est évaluée pour chaque noeud préalablement sélectionné Si le résultat est un nombre : le noeud est sélectionné si ce nombre est égal à sa position contextuelle Sinon, le résultat sera converti en valeur booléenne selon les règles de la fonction boolean (le noeud est sélectionné si cette valeur est vraie) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 80

Les prédicats (2) Exemples : para[3] : désigne le troisième fils para du noeud courant para[last()] : le dernier fils para du noeud courant /doc/chapter[5]/section[2] : le 2 ème noeud section du 5ème chapter de doc para[@type='warning'] : les fils para du noeud courant qui ont un attribut type dont la valeur est "warning" ème para[@type='warning'][5] : le 5 fils para du noeud courant parmi ceux qui ont un attribut type dont la valeur est "warning" ème para[5][@type='warning'] : le 5 fils para du noeud courant à condition qu'il possède un attribut type dont la valeur est "warning" chapter[title='introduction'] : les fils chapter du noeud courant ayant au moins un fils title dont le contenu textuel est "Introduction" employee[@secretary and @assistant] : les fils employee du noeud courant qui possèdent simultanément les attributs secretary et assistant Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 81

Exercice : soit le document XML suivant... <?xml version="1.0" encoding="utf 8"?> <project basedir="." default="compile" name="mon projet"> <description> Ceci est un exemple valide de fichier "Ant". </description> <property name="options" value=" v"/> <path id="monclasspath"> <pathelement location="lib/xerces.jar"/> <pathelement location="lib/xalan.jar"/> </path> <target name="compile" depends="clean"> <javac srcdir="." encoding="iso 8859 1"> <classpath refid="monclasspath"/> </javac> <rmic base="." classname="fr.unicaen.test.serviceimpl"> <classpath refid="monclasspath"/> </rmic> </target> <target name="documentation"> <ant antfile="build.xml" target="pdf" dir="doc/manual"/> <ant antfile="build.xml" target="javahelp" dir="doc/manual"/> </target> <target name="clean"> <delete> <fileset dir="." includes="**/*.class"/> <fileset dir="." includes="**/*.java~" defaultexcludes="no"/> </delete> </target> </project> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 82

... Formuler les «requêtes» XPath suivantes : (1) L'ensemble des noeuds target qui dépendent du but dont le nom est "clean" (2) Le noeud target par défaut (son nom est égal à l'attribut default du noeud project) (3) La taille en caractères de la description du projet (4) La valeur de la propriété "options" (5) Le nombre de buts dépendant d'autres buts (6) Tous les descendants du projet ayant un attribut srcdir différent de son basedir (7) La dernière tâche du but "documentation" (8) Toutes les tâches à effectuer pour le but "compile" (9) Le deuxième pathelement de chaque path (10) Les tâches javac qui contiennent au moins un classpath (11) Les tâches javac qui contiennent au moins deux classpath (12) Les tâches javac suivies d'une tâche rmic dont le classname débute par "fr.unicaen" Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 83

Solutions de l'exercice (1) /project/target[contains(@depends, 'clean')] (2) /project/target[@name = /project/@default] (3) string length(/project/description) (4) /project/property[@name = 'options']/@value (5) count(/project/target[@depends]) (6) /project//*[@srcdir and @srcdir!= /project/@basedir] (7) /project/target[@name = 'documentation']/*[last()] (8) /project/target[@name = 'compile']/* (9) //path/pathelement[2] (10) //javac[classpath] (11) //javac[count(classpath) >= 2] (12) //javac[following::rmic[starts with(@classname, 'fr.unicaen')]] Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 84

XSLT Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 85

Introduction à XSLT Formalisme de représentation déclarative d'un procédé de transformation d'arbres XML C'est un vocabulaire XML Son espace de noms est : http://www.w3.org/1999/xsl/transform Recommandation du W3C : http://www.w3.org/tr/xslt La spécification XSLT définit une syntaxe et sa sémantique Comme il est d'usage, le préfixe utilisé dans le présent document sera xsl Il existe de multiples implémentations ( dans tous les langages) Ex. en Java : Xalan (http://xml.apache.org) Les grandes lignes d'une transformation XSLT : Analyse de la feuille XSLT Chargement du document source en mémoire (arbre DOM) Application des règles de transformation au document source Fabrication et sortie du document résultat Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 86

Introduction à XSLT (2) Une feuille XSLT est principalement composée d'en ensemble de modèles (ou templates) Chaque template est spécifie des règles de transformation applicables à un ou plusieurs types de noeuds Un template est composé de deux éléments principaux : Spécification des noeuds auxquels il s'applique (en général) Spécification du sous arbre XML à générer Expression XPath Éléments statiques (noeuds XML quelconques) Éléments dynamiques (noeuds XSLT) Application aux descendants des autres templates Création dynamique de noeuds XML à partir d'expressions XPath Le moteur se charge d'appliquer les templates autant que possible Les templates par défaut sont appliqués le cas échéant Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 87

Introduction à XSLT (3) Feuille XSLT.................. T T Moteur XSLT T T T T Document Source T Document Résultat Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 88

Premier aperçu du langage XSLT <?xml version="1.0" encoding="utf 8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/document"> <html> <head> <title> <xsl:value of select="title/text()"/> </title> </head> <body> <xsl:apply templates/> </body> </html> </xsl:template> <xsl:template match="title"> <h1><xsl:apply templates/></h1> </xsl:template> <xsl:template match="paragraph"> <p><xsl:apply templates/></p> </xsl:template> [...] </xsl:stylesheet> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 89

Exemple de transformation avec la feuille précédente <?xml version="1.0"?> <?xml version="1.0"?> <document> <title>le titre</title> <paragraph> Du texte du texte. Du texte du texte. Du texte du texte. Du texte du texte. </paragraph> <paragraph> Encore du texte. Encore du texte. Encore du texte. </paragraph> </document> <html> <head> <title>le titre</title> </head> <body> <h1>le titre</h1> <p> Du texte du texte. Du texte du texte. Du texte du texte. Du texte du texte. </p> <p> Encore du texte. Encore du texte. Encore du texte. </p> </body> </html> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 90

Templates Une feuille de style contient une liste ordonnée de templates Un template = une règle de transformation, généralement applicable à un sous ensemble déterminé des noeuds du document source Ex : tous les éléments paragraph Chaque template définit un modèle de sous arbre Lorsqu'un template est applicable, il est instancié pour générer un fragment du document résultat Différents types de templates : Templates filtrants : définissent un modèle de noeud (expr. XPath) Templates nommés : pas de modèle de noeud mais un identifiant Appliqués aux noeuds du document source identifiés par cette expression Appliqués lorsqu'ils sont appelés explicitement par un autre template Templates implicites : appliqués lorsqu'aucun template filtrant n'est applicable Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 91

Contenu et instanciation d'un template Un template peut combiner : Des éléments XSL quelconques (dits statiques ou littéraux) N'appartiennent pas à l'espace de nom XSLT Seront reproduits à l'identique dans le document résultat D'autres éléments XSLT (dit dynamiques) Appartiennent à l'espace de nom XSLT Instructions pour la génération d'un fragment XML Interprétées par le moteur, elles seront remplacées par les noeuds résultants Exemples de contenu dynamique : Application des templates à tous ou certains descendants Appel d'un template nommé Fabrication de noeuds à partir des propriétés du noeud courant Instructions conditionnelles ou itératives Évaluation d'expressions XPath, création de pseudo variables, etc. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 92

Processus de transformation Au départ, le moteur cherche un template s'appliquant à la racine du document et l'instancie Durant le parcours de l'arbre source, le moteur cherche un template à appliquer pour chaque noeud à traiter Ce noeud sera remplacé dans l'arbre résultant par le modèle spécifié une fois instancié Le noeud traité constitue le noeud courant au sein du template En général, celui ci demande le traitement de ses descendants Toute expression XPath contenue dans le template sera évaluée avec le noeud courant pour contexte Remarque : Les noeuds descendants ne seront traités que si le template le demande explicitement (instruction apply templates) Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 93

Instructions XSLT pour l'écriture de modèles : Application des templates aux descendants Contenu purement statique <xsl:template match="paragraph"> <p> Ce modèle est purement statique. </p> </xsl:template> Application des templates à tous les descendants : apply templates <xsl:template match="section"> <div class="section"> <xsl:apply templates/> </div> </xsl:template> Application des templates à certains descendants seulement <xsl:template match="section"> <div class="section"> <xsl:apply templates select="title paragraph"/> </div> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 94

Instructions XSLT pour l'écriture de modèles : Évaluation d'expressions XPath Génération de contenu par évaluation d'expressions XPath : value of <xsl:template match="title"> <h1> <xsl:value of select="../section/position()"/>. <xsl:value of select="text()"/> </h1> </xsl:template> <xsl:template match="document"> <html> <head> <title><xsl:value of select="title/text()"/></title> <meta name="author"><xsl:value of select="@author"/> </head> <body> <xsl:apply templates/> </body> </html> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 95

Instructions XSLT pour l'écriture de modèles : Évaluation d'expressions XPath (2) Évaluation d'expressions XPath dans des attributs : {expression} <xsl:template match="section"> <a name="sec{@id}"/> <h1 class="{@class}"> <xsl:value of select="title/text()"/> </h1> <xsl:apply templates/> </xsl:template> Une expression XPath entre accolades dans un attribut sera remplacée par le résultat de son évaluation relativement au noeud courant, converti en chaîne de caractères. Ne fonctionne que dans les éléments littéraux (statiques), et ne peut être utilisé dans les déclarations d'espaces de noms (xmlns). Remarque : Pour écrire des accolades littérales dans un attribut (i.e. ne devant pas être interprétées comme une expression XPath), il suffit de les doubler : <xyz abc="valeur littérale {{entre accolades}}"/> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 96

Instructions XSLT pour l'écriture de modèles : Expressions conditionnelles Instructions conditionnelles : if <xsl:template match="paragraph"> <xsl:if test="@type='warning'"> <em>attention : </em> </xsl:if> <xsl:apply templates/> </xsl:template> Le test est une expression XPath quelconque. Le résultat de son évaluation sera converti en booléen selon les règles habituelles. Le fragment sera écrit seulement si la valeur obtenue est vraie. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 97

Instructions XSLT pour l'écriture de modèles : Expressions conditionnelles (2) Instructions conditionnelles : choose/when/otherwise <xsl:template match="paragraph"> <p> <xsl:choose> <xsl:when test="@type='important'"> <font color="red"><xsl:apply templates/></font> </xsl:when> <xsl:when test="@type='note'"> <it><xsl:apply templates/></it> </xsl:when> <xsl:otherwise> <xsl:apply templates/> </xsl:otherwise> </xsl:choose> </p> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 98

Instructions XSLT pour l'écriture de modèles : Expressions conditionnelles (3) Remarque : on privilégiera autant que possible la multiplication des templates aux instructions conditionnelles. Pour l'exemple précédent : <xsl:template match="paragraph[@type='important']"> <p> <font color="red"><xsl:apply templates/></font> </p> </xsl:template> <xsl:template match="paragraph[@type='note']"> <p> <it><xsl:apply templates/></it> </p> </xsl:template> <xsl:template match="paragraph"> <p> <xsl:apply templates/> </p> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 99

Instructions XSLT pour l'écriture de modèles : Structures itératives XSLT est essentiellement déclaratif : le moteur se charge d'appliquer des règles «statiques». Il est toutefois possible de conduire l'itération explicitement : <xsl:template match="liste clients"> <table> <xsl:for each select="./client"> <tr> <td><xsl:value of select="@prénom"/></td> <td><xsl:value of select="@nom"/></td> </tr> </xsl:for each> </table> </xsl:template> Remarque : comme pour les expressions conditionnelles, on exploitera autant que possible l'approche déclarative, en n'utilisant les structures itératives qu'en dernier recours (rare). Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 100

Instructions XSLT pour l'écriture de modèles : Création dynamique d'éléments Il est possible de créer dynamiquement des éléments de l'arbre résultat. L'instruction element permet de créer un élément, et l'instruction attribute des attributs. <xsl:template match="..."> <xsl:element name="concat('toto', position())" namespace="..."> <xsl:attribute name="'attr1'"> <xsl:value of select="titi/@tutu"/> </xsl:attribute> <tata> <xsl:apply templates/> </tata> </xsl:template> Ces instructions sont utiles si le nom d'un élément et/ou d'un attribut doivent être calculés : tout expression XPath retournant un nom valide peut être utilisée dans l'attribut name. Pour la valeur des attributs, c'est aussi une alternative à l'utilisation des accolades. Remarque : les noeuds attributs doivent impérativement arriver avant tout noeud générant un fils de l'élément créé. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 101

Instructions XSLT pour l'écriture de modèles : Copie du noeud courant L'instruction copy permet de copier le noeud courant. Ni les noeuds fils (ni les attributs le cas échéant) ne sont copiés. <xsl:template match="paragraph"> <xsl:copy> <xsl:apply templates/> </xsl:copy> </xsl:template> Pour que tout élément soit systématiquement copié à l'identique quand aucun autre template ne s'applique, on peut définir le template suivant : <xsl:template match="@* node()"> <xsl:copy> <xsl:apply templates select="@* node()"/> </xsl:copy> </xsl:template> Ce template peut aussi être nommé (et son apply templates remplacé par un call template) pour n'être appelé qu'en cas de besoin. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 102

Instructions XSLT pour l'écriture de modèles : Tris Par défaut, les noeuds sont traités dans l'ordre du document. Il est possible d'utiliser l'instruction sort pour spécifier un ordre. <xsl:template match="liste clients"> <table> <xsl:apply templates select="client"> <xsl:sort select="@nom" order="ascending"/> <xsl:sort data type="text" select="@prénom"> </xsl:apply templates> </table> </xsl:template> Cette instruction peut aussi être utilisée dans un for each. Les critères de tri, spécifiés dans l'attribut select par une expression XPath dont le contexte est le noeud trié, sont appliqués dans l'ordre. L'attribut data type permet de spécifier le type de donnée et donc de tri (numérique ou alphanumérique). L'attribut order permet de spécifier le sens. L'attribut lang peut être utiliser pour spécifier la langue (ex: «f r», «en», et c.). Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 103

Instructions XSLT pour l'écriture de modèles : Nombres formatés L'instruction number facilite l'écriture de valeurs numériques, en particulier pour la numérotation. La valeur peut être spécifiée dans l'attribut value : <xsl:template match="title"> <h1> <xsl:number value="../section/position()" format="1. "/> <xsl:value of select="text()"/> </h1> </xsl:template> Elle est plus utile avec l'attribut count, qui permet de compter des noeuds pour générer une numérotation complexe. L'attribut level permet de spécifier si on compte uniquement les frères ou également les ancêtres. <xsl:template match="title"> <h1> <xsl:number level="multiple" format="1.1 " count="chapter section subsection"/> </h1> <xsl:apply templates/> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 104

Instructions XSLT pour l'écriture de modèles : Création de commentaires et d'instructions de traitement L'instruction comment permet de créer un commentaire, et l'instruction processing instruction des instructions de traitement. <xsl:template match="/"> <xsl:processing instruction name="xml stylsheet"> type="text/css" href="style.css" </xsl:processing instruction> <xsl:comment> Cet document a été généré par une feuille XSLT </xsl:comment> <root> <xsl:apply templates/> </root> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 105

Fonctions XPath supplémentaires La fonction current() permet d'accéder au noeud courant (i.e. en train d'être transformé) quel que soit le contexte XPath La fonction generate id() permet de générer automatiquement un identifiant unique pour un noeud donné Ex : /document//section[@id = current()/@idref] Ex : <toto id="{generate id(.)}"/> La fonction document() permet d'accéder à l'arbre contenu dans un autre document XML Prend en paramètre une URI absolue ou relative au document source Retourne la racine du document pointé Ex : document('resources/toto.xml')//tutu[@x=42] Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 106

Gestion des caractères «blancs» Texte littéral explicite Par défaut, les fragments textuels «b lancs» sont ignorés dans les modèles et dans le document source Pour le document source, paramétrage possible avec xsl:strip space et xsl:preserve space (cf. spécification) L'élément xsl:text permet de délimiter explicitement un fragment textuel en préservant les blancs <xsl:template match="..."> <toto> Texte </toto> </xsl:template> <xsl:template match="..."> <toto> <xsl:text> Texte </xsl:text> </toto> </xsl:template> <toto> Texte </toto> <toto> Texte </toto> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 107

Modes Au sein d'une même feuille, on peut vouloir traiter les mêmes éléments de plusieurs façons différentes Par exemple, pour des éléments section, deux cas possibles : Création du marquage typographique de la section, de son titre, etc. Création d'une entrée dans la table des matières XSLT intègre la notion de mode : La recherche des templates applicables s'effectue dans un mode donné Seuls les templates du mode courant seront sélectionnés Tout template filtrant peut spécifier un mode dans lequel il s'applique Si aucun mode n'est spécifié, le mode par défaut s'applique Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 108

Modes (2) Pour définir le mode d'un template : <xsl:template match="..." mode="m"> [...] </xsl:template> Pour définir le mode courant : <xsl:apply templates mode="m"/> <xsl:template match="document"> <body> <b>table des matières :</b> <ol><xsl:apply templates mode="toc"/></ol> <hr/> <xsl:apply templates/> </body> </xsl:template> <xsl:template match="section"> <h1><xsl:value of select="title/text()"/></h1> <xsl:apply templates/> </xsl:template> <xsl:template match="section" mode="toc"> <li><xsl:value of select="title/text()"/></li> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 109

Templates implicites Racine et éléments : descente récursive <xsl:template match="* /"> <xsl:apply templates/> </xsl:template> Quand un mode est spécifié, il est transmis récursivement <xsl:template match="* /" mode="m"> <xsl:apply templates mode="m"/> </xsl:template> Texte et attributs : copie du contenu textuel <xsl:template match="text() @*"> <xsl:value of select="."/> </xsl:template> Commentaires et instructions de traitement sont ignorés par défaut <xsl:template match="processing instruction() comment()"> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 110

Templates nommés Les templates nommés ne définissent pas de pattern Leur nom est spécifié par l'attribut name de l'élément template Ils ne sont jamais appelés par le moteur Ils doivent au contraire être appelés explicitement avec call template Ils réalisent généralement des tâches génériques pouvant s'appliquer à des éléments divers Leur contexte (ou noeud courant) est celui du template appelant <xsl:template name="toto"> <xyz><xsl:value of select="@type"/></xyz> </xsl:template> <xsl:template match="..."> <xsl:call template name="toto"/> <xsl:apply templates select="..."/> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 111

Paramétrage d'un template Un template peut déclarer un ou plusieurs paramètres La valeur par défaut peut se trouver dans le contenu (fragment XSLT) Ou dans l'attribut select (expression XPath) <xsl:param name="nom" select="valeur par défaut"/> Dans le template, les paramètres sont accessibles sous forme de variables XPath <xsl:param name="nom">valeur par défaut</xsl:param> <xsl:value of select="$p * 3"/> (par exemple) Les templates appelants pourront éventuellement attribuer des valeurs aux paramètres Fonctionne avec xsl:apply templates et xsl:call template La valeur est spécifiée comme pour xsl:param (ordre indifférent) : <xsl:with param name="nom">valeur xslt</with xsl:param> <xsl:with param name="nom" select="valeur xpath"/> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 112

Paramétrage d'un template (2) <xsl:template name="draw circle"> <xsl:param name="x">0</xsl:param> <xsl:param name="y">0</xsl:param> <xsl:param name="r">100</xsl:param> <xsl:param name="w">2</xsl:param> <svg:circle x="{$x}" y="{$y}" radius="{$r}" style="stroke width:{$w}"/> </xsl:template> <xsl:template match="gml:node"> <xsl:call template name="draw circle"> <xsl:with param name="x" select="@xpos"/> <xsl:with param name="y" select="@ypos"/> </xsl:call template> <xsl:if test="@final='yes'"> <xsl:call template name="draw circle"> <xsl:with param name="x" select="@xpos"/> <xsl:with param name="y" select="@ypos"/> <xsl:with param name="w" select="5"/> <xsl:with param name="r" select="110"/> </xsl:call template> </xsl:if> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 113

Paramétrage d'une feuille XSLT Comme un template, la feuille de style elle même peut prendre des paramètres Ils sont déclarés avec les mêmes balises, en tant que filles directes du noeud xsl:stylesheet Leur valeur peut être spécifiée au lancement du moteur XSLT En ligne de commande Via l'api du moteur de transformations <?xml version="1.0" encoding="utf 8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:param name="baseref">http://www.toto.org</xsl:param> <xsl:template match="image"> <img src="{$baseref}/{@href}"/> </xsl:template> </xsl:stylesheet> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 114

Variables XSLT donne la possibilité de définir des (in)variables Globales ou internes à un template (comme les paramètres) Utiles pour stocker le résultat d'un calcul qui sera utilisé plusieurs fois Ne correspondent pas aux variables des langages de programmation car leur valeur ne peut pas être modifiée Définies avec l'élément xsl:variable dont le fonctionnement est identique à celui de xsl:param Elles sont accessibles sous la forme de variables XPath <xsl:template match="xxx"> <xsl:variable name="count" select="count(//*)"/> <p> Nombre de noeuds : <xsl:value of select="$count"/> </p> <xsl:if test="$count > 1000"> <p> C'était une bonne idée d'utiliser une variable!</p> </xsl:if> </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 115

Combinaison de feuilles XSLT Il est possible d'exploiter les templates d'une autre feuille XSLT Deux mécanismes sont disponibles : xsl:include : inclusion en lieu et place d'une autre feuille xsl:import : import d'une autre feuille avec possibilité de surcharge Tous deux demandent un paramètre href qui spécifie l'uri de la feuille cible relativement à la feuille appelante Les noeuds include ou import doivent obligatoirement être fils directs du noeud stylesheet Mécanisme d'inclusion : Les templates de la feuille cible sont insérés en lieu et place de l'appel à l'instruction include Tout se passe comme si ses templates appartenaient à la feuille appelante Les instructions d'inclusion peuvent se trouver à n'importe position dans le noeud stylesheet Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 116

Combinaison de feuilles XSLT (2) Mécanisme d'import : Semblable à l'inclusion mais gère la surcharge de templates : Les templates de la feuille cible sont importés dans la feuille appelante mais peuvent être surchargés par les templates locaux Ils peuvent également être surchargés par les templates d'une autre feuille importée après elle Plus généralement, la priorité d'un template est d'autant plus faible que sa profondeur d'import est grande (i.e. sa profondeur dans l'arbre des imports) Exemple : si la feuille A importe B puis C, B importe D, C importe E, alors les priorités par ordre décroissant sont : A, C, E, B, D L'élément import doit nécessairement apparaître avant tout autre noeud fils du noeud stylesheet L'instruction xsl:apply imports permet d'appeler explicitement le template surchargé Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 117

Résolution des conflits Quand plusieurs templates sont applicables à un même noeud, un jeu de priorités s'applique La priorité d'un template est définie par une valeur numérique Elle peut être spécifiée explicitement par l'attribut priority Les règles de résolution des conflits sont : La priorité est donnée aux templates de plus faible profondeur d'import Si une ambiguïté persiste, les priorités s'appliquent. Si la priorité d'un template n'est pas spécifiée explicitement, sa priorité par défaut est : 0 si le pattern est de la forme (child attribute)::name (c.à.d name @name) 0,25 si le pattern est de la forme (child attribute)::namespace:* 0,5 si le pattern est un test sur le type de noeud : text(), comment(), etc. 0,5 dans tous les autres cas Si une ambiguïté persiste encore, c'est en principe une erreur Le moteur peut continuer en choisissant le dernier template trouvé Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 118

Spécification des paramètres de sortie L'élément output permet de spécifier divers paramètres sur la forme du document résultat Il doit être fils direct du noeud stylesheet Les principaux attributs autorisés sont : method : html, xml ou text. Par exemple, la méthode html empêche l'écriture de balises de fin pour les éléments vides doctype public : déclaration du DOCTYPE : d'identificateur public doctype system : déclaration du DOCTYPE : chemin vers la DTD encoding : encoding à utiliser dans le document résultat omit xml declaration : empêche l'écriture du prologue (yes ou no) indent : spécifie si la sortie doit être indentée (yes ou no) Rq : tous les attributs ne sont pas applicables à toutes les méthodes de sortie. Voir la spécification pour plus de détails. Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 119

Envoi de messages et déclenchement d'erreurs On peut demander au moteur XSLT l'écriture de messages En cas d'erreur irrécupérable on peut demander l'interruption du processus de transformation Sortie sur la console, boîte de dialogue, fichiers de log, etc. Ex : <xsl:message>information ou avertissement</xsl:message> Ex : <xsl:message terminate="yes">erreur fatale!</xsl:message> Exemple d'utilisation avec system property : <xsl:template match="xxx"> <xsl:if test="system property(xsl:version) <= 2.0"> <xsl:message terminate="yes"> Cette feuille nécessite un moteur XSLT 2.0 ou plus. </xsl:message> </xsl:if> [...] </xsl:template> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 120

Quelques détails sur le fonctionnement des espaces de noms L'espace de nom réservé à XSLT distingue sans ambiguïté les instructions XSLT de tous les autres noeuds (littéraux) Le cas échéant, les autres namespaces utilisés dans la feuille seront automatiquement déclarés dans le document résultat Il est possible de fabriquer des noeuds XSLT au sein même d'une feuille XSLT : <xsl:stylesheet version="1.0" xmlns:axsl="http://foo/bar" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:namespace alias stylesheet prefix="axsl" result prefix="xsl"/> <xsl:template match="/"> <axsl:stylesheet> <xsl:apply templates/> </axsl:stylesheet> </xsl:template> </xsl:stylesheet> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 121

Appliquer une feuille de style à document Les modalités précises d'utilisation sont spécifiques à chaque moteur XSLT La plupart sont disponibles en ligne de commande ou sous forme d'api (souvent les deux) Xalan, Saxon, XSLTProc, MSXML, Sablotron, etc. Exemple en shell : $ xsltproc feuille.xsl input.xml o output.xml Exemple Xalan : $ java jar xalan.jar XSL feuille.xsl... Ils permettent quasiment toujours de spécifier des valeurs pour les paramètres de la feuille de style Ex : $ xsltproc param name value feuille.xsl input.xml... Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 122

Lier un document XML à une feuille de style XSLT Comme pour une feuille CSS, l'instruction de traitement xml stylesheet permet d'associer une feuille XSLT à un document Recommandation W3C : http://www.w3.org/tr/xml stylesheet/ Le type spécifié doit être xml/text Un outil intégrant un moteur XSLT pourra transformer le document avant affichage Le vocabulaire XML utilisé dans le document devra bien sûr être visualisable par cet outil (ex : XHTML, MathML, SVG,...) Exemple : affichage dans un navigateur (Mozilla, IE,...) <?xml version="1.0" encoding="utf 8"?> <?xml:stylesheet type="text/xml" href="feuille.xsl"?> <document> [...] </document> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 123

<FIN/> Frédérik Bilhaut Université de Caen MI2 RADI 2004/2005 124