Introduction à XML INTRODUCTION À XML 1. NOTIONS DE BASE 2. EXEMPLE SIMPLE 3. SYNTAXE XML 3.1. LES CARACTÈRES SPÉCIAUX 4. DTD 5. DOCUMENT XML AVEC FEUILLE DE STYLE CSS 6. XLS ET XSLT 6.1. EXEMPLE DE DOCUMENT XSLT 6.2. AUTRE EXEMPLE DE DOCUMENT XSLT 6.3. TRI D'ÉLÉMENTS AVEC XSLT 1. Notions de base Extensible Markup Language Un métalangage: un langage pour définir des langages o Aucune balise prédéfinie. o L'usager définit ses propres balises Sous-ensemble de SGML : plus simple, plus facile à utiliser o La spécification de XML tient dans 26 pages, celle de SGML prend plus de 500 pages! Plusieurs langages sont des applications XML (comme le HTML est une application SGML) o MathML (Mathematical Markup Language) pour écrire des expressions mathématiques o WML (Wireless Markup Language) pour des clients Wap (Wireless Application Protocol) par exemple des téléphones mobiles o SOAP (Simple Object Access Protocol) protocole d'échange d'informations o XHTML pour des données affichées par un navigateur o Voir http://www.oasis-open.org/cover/xml.html#applications Pour décrire des données o Ne sert pas à afficher les données mais à stocker des informations structurées Les données représentées au moyen de XML peuvent être manipulées par la suite par différentes applications. Les données peuvent être affichées mais sont surtout transformées par des applications. o Rendu au moyen de feuille de style : CSS et XSL (XML Stylesheet Language) o Pour transformer par exemple un document XML en HTML o Pour transformer par exemple un document XML en pdf o Possibilité de manipuler les données avec Javascript et DOM Possibilité d utiliser des balises provenant de différents langages de balises grâce aux espaces de nommage (namespace) 2008 Hélène Desaulniers 1
2. Exemple simple <annuaire> <nom>leblanc</nom> <prénom>carole</prénom> <téléphone>375-4567</téléphone> <email>cleblanc@sympatico.ca</email> <nom>després</nom> <prénom>gilles</prénom> <téléphone>373-3211</téléphone> <email>despresg2@cgo.com</email> </annuaire> <?xml version="1.0" encoding="iso8859-1"?> o <?xml version="1.0"?> indique au navigateur que le document est un document écrit en xlm dans la version 1.0 o C'est ce qu'on appelle la déclaration xml. o Ce n'est pas une balise XML, c'est un PI (Processing Instruction) une instruction de traitement destinée à l'application qui traite le document (l'agent utilisateur). L'attribut encoding permet de spécifier le jeu de caractères du document. Ici le ISO8859-1 Simple fichier texte avec extension xml Voir http://linux04.uqtr.ca/~helene/xml/exemple1.xml Le navigateur affiche simplement les différents nœuds du document 2008 Hélène Desaulniers 2
On peut réduire la présentation en "fermant"des embranchements 3. Syntaxe XML Syntaxe stricte o Chaque balise ouvrante a une balise fermante o Une élément vide (sans contenu) peut s'écrire sans balise fermante, avec seulement une balise ouvrante de la forme <nom-balise/> o Les éléments doivent être correctement imbriqués o Les valeurs d attributs doivent être encadrées de guillemets ou apostrophe, o La casse doit être respectée dans le nom des éléments et attributs o Le document a une racine unique Les commentaires sont introduits de la même façon que dans un document html: <!--commentaires --> <annuaire> <nom>leblanc</nom> <prénom>carole</prénom> <categorie type="ami"></categorie> <téléphone>375-4567</téléphone> <email>cleblanc@sympatico.ca</email> <nom>després</nom> <prénom>gilles</prénom> 2008 Hélène Desaulniers 3
<categorie type='collegue' /> <téléphone>373-3211</téléphone> <email>despresg2@cgo.com</email> </personne Voir http://linux04.uqtr.ca/~helene/xml/testvariantesyntaxique.xml Le XHTML est le langage HMTL avec la syntaxe XML Un document qui suit la syntaxe XML est un document bien formé. Le navigateur n affiche que les documents bien formés. Voir http://linux04.uqtr.ca/~helene/xml/testxmlerreur.xml <?xml version="1.0" encoding="iso8859-1"?> <annuaire> <nom>leblanc</nom> <prénom>carole</prénom> <téléphone>375-4567</téléphone> <email>cleblanc@sympatico.ca</email> <nom>després</nom> <prénom>gilles</prenom> <téléphone>373-3211</téléphone> <email>despresg2@cgo.com</email> </annuaire> 3.1. Les caractères spéciaux Afin d'avoir la possibilité d'utiliser des caractères qui ont un sens particulier en XML, il y a des références d'entités de caractères qui sont prédéfinies: Caractère Référence d'entité de caractères > > < <; & & " " ' ' Les autres références d'entités de caractères couramment utilisées en HTML ( par exemple) ne sont pas prédéfinies en XML 4. DTD Spécifie la grammaire et le vocabulaire du langage Décrit la structure des éléments du document en donnant l'ensemble des règles et propriétés des éléments o Nom des éléments o Imbrication des éléments o Ordre de succession des balises o Attributs des éléments 2008 Hélène Desaulniers 4
Peut être externe ou interne au document XML. Dans l'exemple ci-dessous, nous avons une DTD interne: de <!DOCTYPE annuaire [ à ]> Un élément du langage est introduit par <!ELEMENT Nom_de_l'élément Nom_des_enfants > o Par exemple <!ELEMENT annuaire (personne*) > indique que annuaire est un élément du langage et qu'il contient 0 ou plus éléments personne o Par exemple <!ELEMENT nom (#PCDATA) > indique que nom est un élément du langage et qu'il contient du texte. Un document qui respecte la DTD est un document valide: l'exemple ici est un document bien formé et non valide <!DOCTYPE annuaire [ <!ELEMENT annuaire (personne*)> <!ELEMENT personne (nom,prénom,téléphone,email)> <!ELEMENT nom (#PCDATA)> <!ELEMENT prénom (#PCDATA)> <!ELEMENT téléphone (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <annuaire> <prénom>carole</prénom> <nom>leblanc</nom> <téléphone>375-4567</téléphone> <email>cleblanc@sympatico.ca</email> <nom>després</nom> <prenom>gilles</prenom> <telephone>373-3211</telephone> <email>despresg2@cgo.com</email> </annuaire> Voir http://linux04.uqtr.ca/~helene/xml/exemple2.xml Il y a peu de service en ligne pour valider un document XML. Par exemple: o http://www.xmlvalidation.com/xml.0.html?l=0 Attention cependant, certains valideurs ne vérifient pas comme tel la validité du document au sens de la DTD, ils vérifient seulement que le document est bien formé. Un attribut d'élément du langage est introduit par <!ATTLIST Nom_de_l'élément Nom_de_l'attribut Type Valeur_par_défaut > Par exemple: <!ATTLIST téléphone lieu (maison travail) "maison" > indique que l'élément téléphone admet un attribut lieu dont la valeur peut être maison ou travail et dont la valeur par défaut est maison. Pour avoir une DTD externe, on utilise le mot SYSTEM dans la déclaration de type de document: o <!DOCTYPE annuaire SYSTEM "http://linux04.uqtr.ca/~helene/xml/annuaire.dtd"> 2008 Hélène Desaulniers 5
o Voir http://linux04.uqtr.ca/~helene/xml/exemple3.xml 5. Document XML avec feuille de style CSS On associe une feuille de style à un document xml à l'aide d'un PI (Processing Instruction) o <?xml-stylesheet href="styleannuaire.css" type="text/css"?> La feuille de style a la même syntaxe que pour HTML personne{display:block} nom{font-size:12pt;color:red;} prénom{font-size:10pt;} téléphone{font-style:italic;} email{ color:blue} Voir http://linux04.uqtr.ca/~helene/xml/exemple4.xml Il y a une autre méthode pour associer des propriétés visuelles à des éléments xml c'est la feuille de style XSLT 6. XLS et XSLT XSL: extensible Stylesheet Language o Comprend 3 parties: XSLT: un langage pour transformer un document xml XPath: un langage pour définir des parties d'un document xml XSL-FO : un langage pour formater un document xml Contient des possibilités de formatage (FO pour Formating Object) plus puissantes que des balises HTML Intéresse plus particulièrement le monde des typographes. XSLT est dont un langage pour transformer un document XML (document source; en fait arbre source) en un document d'un autre type (un document XHTML par exemple ou HTML) (document résultant, arbre résultant) o Filtrer et trier des données XML o Générer une table de matière, un index o Rendre des données XML pour différents media: écran, papier, voix Essentiellement un document XSLT comprend une série de règles de gabarit (template rules). o C'est un document texte, externe au document contenant les données XML o Le fichier porte l'extension.xsl o C'est un document XML bien formé <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform">... </xsl:stylesheet> Une règle de gabarit est introduite par l'élément xsl:template. Elle comprend 2 parties: 2008 Hélène Desaulniers 6
o Un modèle pour désigner un nœud de l'arbre source sur lequel s'applique la règle C'est l'attribut match de l'élément xsl:template. La forme la plus simple d'un modèle est le nom d'un élément Par exemple xsl:template match="personne" introduit une règle de gabarit pour l'élément personne D'une façon générale, la valeur de l'attribut match est un chemin de localisation qui désigne un nœud du document source. Ce chemin de localisation est spécifié au moyen d'une syntaxe précise : le XPath. o Une description du nœud de l'arbre résultant. C.est le contenu de l'élément xsl:template. Dans la description de ce nœud résultant, on a accès au contenu et aux attributs du nœud de l'arbre source L'élément xsl:value-of permet d'accéder au contenu d'un élément en format texte. L'élément est désigné par son chemin de localisation et correspond à l'attribut sélect <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output method="text" /> <xsl:template match="annuaire"> <p> <xsl:value-of select="personne"/> </p> </xsl:stylesheet> Voir http://linux04.uqtr.ca/~helene/xml/exemple5.xml Le processeur XLT parcourt l'arbre source et pour chaque nœud rencontré, il applique la règle de gabarit correspondante L'arbre résultant est complètement séparé de l'arbre source et dans la transformation d'un élément source vers un élément résultant, on peut: enlever des éléments, modifier l'ordre des éléments, supprimer des éléments. On peut appliquer la transformation o Coté serveur Le serveur envoie le document résultant o Coté client Le serveur envoie les documents XML et XSLT Le navigateur utilise un processeur XSLT qui applique les transformations du XSL sur le XML Nécessite IE6 ou Netscape6+, Mozilla (supportent XSLT1.0) o Manuellement Un programme lit le document XML et XSL et produit le document résultant SAXON XLT Processor (http://saxon.sourceforge.net/saxon6.5.3/instant.html) 1 1 Téléchargez et installez l'application. Ajoutez le répertoire de saxon.exe dans la variable path et entrer la commande saxon o <nom du ficher html> -a <nom du fichier xml> 2008 Hélène Desaulniers 7
6.1. Exemple de document XSLT Feuille de style pour afficher en HTML les données de annuaire1.xml (même contenu que exemple1.xml avec la déclaration d'une feuille de style. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="annuaire"> <html> <head> <title>annuaire</title> </head> <body> <h1>voici la liste des personnes inscrites</h1> <ul> <xsl:apply-templates/> </ul> </body> </html> <xsl:template match="personne"> <li> <xsl:value-of select="prénom"/> <xsl:value-of select="nom"/> </li> </xsl:stylesheet> Le document lui-même est un document XML mais il a l'extension xls L'attribut xmlns:xsl=http://www.w3.org/1999/xsl/transform désigne un espace de nommage (xmlns pour XMLNameSpace) o Ça signifie que tous les noms de balises qui ont le préfixe xsl font référence à la o spécification XSL telle que définie dans http://www.w3.org/1999/xsl/transform Par exemple l'élément xsl:template fait référence à l'élément template de l'espace de nommage xsl Le document XML qui va utiliser la feuille de style formathtml1.xls doit contenir la ligne: <?xml-stylesheet type="text/xsl" href="formathtml1.xsl"?> Le processeur parcourt l'arbre du document source. À chaque noeud qu'il rencontre dans l'arbre il cherche une règle de gabarit qui lui est associé. o Si il en trouve une, il l'applique. (Si il en trouve plusieurs il applique des règles de précédence.) o Si il ne trouve aucune règle pour un élément, il applique une règle par défaut. Dans le cas de annuaire1.xml. le processeur trouve 2 règles de gabarit o Une règle pour le nœud annuaire (<xsl:template match="annuaire">). o Une règle pour le nœud personne (<xsl:template match="personne">). o En cours de traitement, l'instruction <xsl:apply-templates/> demande au processeur de traiter les enfants du nœud courant (le nœud annuaire). Après avoir traité chaque 2008 Hélène Desaulniers 8
nœud enfant (des nœuds personne), le processeur poursuit le traitement du nœud annuaire. Voyons en détails la feuille de style o Vous trouverez la documentation sur les éléments XSL a: http://saxon.sourceforge.net/saxon6.5.3/xsl-elements.html <xsl:template match="annuaire"> o xsl:template Élément XSLT pour définir une règle de gabarit (template rule) (transforme un élément source en un élément résultant) Comporte 2 parties: Une expression qui désigne un nœud de l'arbre source Un fragment qui sera inséré dans l'arbre résultant match="annuaire" attribut de l'élément template "annuaire": désigne le nœud du nom annuaire o Le contenu de l'élément xls:template (tout de qui est entre <xsl:template match="annuaire/"> et ) comprend: Du texte qui sera inséré dans le document résultant Des instructions xsl. <xsl:apply-templates/> o Élément XSLT pour indiquer au processeur de traiter les enfants du nœud courant. o Élément habituellement vide (pas de contenu) <xsl:value-of select="prénom" /> o xsl:value-of: permet d'accéder à la valeur d'un noeud La valeur d'un nœud est toujours une chaîne de caractères La valeur d'un nœud élément est la concaténation du texte de tous les nœuds entre la balise ouvrante et la balise fermante de l'élément. o select="prénom" : désigne le premier enfant prénom o Balise vide (pas de contenu, seulement des attributs) Voir http://linux04.uqtr.ca/~helene/xml/annuaire1.xml o Remarquez que le code source n'est pas du html, c'est du xml. o Le navigateur interprète le xml et le xslt o Il n'y a donc pas de notion de html valide ici. Si on utilise une application comme saxon pour produire le document html on a: <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>annuaire</title> </head> <body> <h1>voici la liste des personnes inscrites</h1> <ul> <li>carole Leblanc </li> <li>gilles Després 2008 Hélène Desaulniers 9
</ul> </body> </html> </li> Si on veut produire du code html valide on utilise l'élément xlt:output avec les valeurs d'attributs correspondant à HTML strict:. <xsl:output method = "html" encoding="utf-8" doctype-public="-//w3c//dtd HTML 4.01//EN" doctype-system="http://www.w3.org/tr/html4/strict.dtd"/> De même on peut utiliser une feuille de style pour le html en introduisant un élément link dans l'entête du document html généré par le xslt: Voir http://linux04.uqtr.ca/~helene/xml/annuaire1a.xml Exemple qui illustre le traitement par défaut: http://linux04.uqtr.ca/~helene/xml/annuaire2.xml <xsl:template match="annuaire"> <html> <head> <title>annuaire</title> </head> <body> <h1>voici la liste des personnes inscrites</h1> <xsl:apply-templates/> <p>fin de l'annuaire</p> </body> </html> On peut constater que le traitement par défaut est simplement d'écrire le contenu des éléments sans aucun formatage. 6.2. Autre exemple de document XSLT Voici un document XSLT qui va transformer le document annuaire.xml pour produire une table en html. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="annuaire"> <html> <head> <title>annuaire</title> </head> <body> <h1>voici la liste des personnes inscrites</h1> <table border="2"> <tr><th>prénom</th><th>nom</th><th>téléphone</th><th>courriel</th></tr> <xsl:apply-templates/> 2008 Hélène Desaulniers 10
</table> </body> </html> <xsl:template match="personne"> <tr><xsl:apply-templates/></tr> <xsl:template match="prénom"> <td><xsl:value-of select="."/></td> <xsl:template match="nom"> <td><xsl:value-of select="."/></td> <xsl:template match="téléphone"> <td><xsl:value-of select="."/></td> <xsl:template match="email"> <td><xsl:value-of select="."/></td> </xsl:stylesheet> Ici la valeur. de l'attribut select de l'élément value-of désigne la valeur de l'élément courant. Voir http: //linux04.uqtr.ca/~helene/xml/annuaire3.xml 6.3. Tri d'éléments avec XSLT Il est possible de trier des éléments avec xsl: sort comme dans l'exemple suivant: <xsl:template match="annuaire"> <html> <head> <title>annuaire</title> </head> <body> <h1>voici la liste des personnes inscrites</h1> <table border="2"> <tr><th>nom</th><th>prénom</th><th>téléphone</th><th>courriel</th></tr> <xsl:apply-templates> <xsl:sort select="nom" /> </xsl:apply-templates> </table> </body> </html> Le reste du document XSL est identique à l'exemple précédent. Voir http://linux04.uqtr.ca/~helene/xml/annuaire4.xml 2008 Hélène Desaulniers 11