Element - Cedric
Transcription
Element - Cedric
Publication de données avec XML, Xpath et XSLT License Professionelle ACSID CNAM, Paris 2003 - Bernd Amann [email protected] CNAM, Paris Introduction à XML/XSLT / B. Amann et P. Rigaux – p.1/167 Objectifs du Cours Mieux comprendre la publication des données sur le Web : Intégration de données avec XML Adressage de fragments avec XPath Transformation de documents XML avec XSLT Site de Comprendre XSLT, B. Amann et P. Rigaux, O’Reilly, 2002 : http://cortes.cnam.fr:8080/XSLT Introduction à XML/XSLT / B. Amann et P. Rigaux – p.2/167 La publication de données avec XML La publication de données avec XML - B. Amann et P. Rigaux – p.3/167 Les applications du Web Diffusion d’informations: journaux, publicité, radio, télévision Échange et partage d’informations : forums, news, portails Recherche d’information : moteurs de recherche par mots-clés Commerce électronique : billetterie, bourse, catalogues électroniques La publication de données avec XML - B. Amann et P. Rigaux – p.4/167 Nouveaux besoins Mots clés : échange et publication de données. L’environnement est hétérogène: Les données doivent être représentées indépendamment d’un langage ou d’une machine donnée. Il faut pouvoir transformer facilement les données échangées entre différentes applications La publication de données avec XML - B. Amann et P. Rigaux – p.5/167 Le problème ? Je voudrais : rendre les mêmes données disponibles et sans gérer interfaces pour serveurs différents. clients et récupérer les données existantes La publication de données avec XML - B. Amann et P. Rigaux – p.6/167 Pourquoi XML ? Le langage XML est une réponse à ces besoins. Un document XML peut être échangé facilement (format ASCII) ; permet de représenter pratiquement toute information structurée ; n’est pas lié à un mode d’utilisation : chacun peut se définir ses propres « structures » ; peut être transformé (relativement) facilement (avec le langage XSLT). La publication de données avec XML - B. Amann et P. Rigaux – p.7/167 Les applications du Web avec XML Publication d’informations: transformation de XML en différents formats/dialectes : HTML, SMIL, WML, SVG, MathML Diffusion d’informations: Web Sémantique : RDF/RSS, Dublin core Échange et partage d’informations : dialectes XML partagés entre les membres d’une communauté, services Web (SOAP) Recherche d’information : recherche avec “requêtes structurés” Commerce électronique : standards La publication de données avec XML - B. Amann et P. Rigaux – p.8/167 Pourquoi pas HTML ? Actuellement, le principal format du Web est HTML: HTML est un langage pour présenter des informations à l’écran. il ne permet pas d’échanger des données il ne permet pas un traitement des données autre que l’affichage On ne sait pas interpréter des données fournies en HTML. La publication de données avec XML - B. Amann et P. Rigaux – p.9/167 Une étude de cas L’Officiel des spectacles ! On a des cinémas qui veulent diffuser leur programme (salles, séances) sur le Web, sur le WAP, sur des tracts et des affiches... inclure des informations sur des films provenant d’une base de données MySQL, approvisionner un moteur de recherche pour chercher des séances, des films, des horaires... La publication de données avec XML - B. Amann et P. Rigaux – p.10/167 La fiche du film Gladiator La fiche du film peut être publiée en HTML pour Netscape/IE en WML pour le portables WAP en SMIL pour Realplayer dans un moteur de recherche SallesEnLigne.com L’information ? c’est la même, sous des formes différentes elle est échangée entre plusieurs acteurs La publication de données avec XML - B. Amann et P. Rigaux – p.11/167 Les solutions XML ? Format universel : représentation en chaîne de caractères d’un contenu structuré indépendant de toute application Publier l’information outils de transformation simples pour convertir un contenu XML Échanger et intégrer l’information assembler des contenus XML, ou au contraire en extraire des informations La publication de données avec XML - B. Amann et P. Rigaux – p.12/167 XML, format universel XML, format universel - B. Amann et P. Rigaux – p.13/167 XML, c’est quoi ? XML = rendre un contenu accessible à toute application. Le contenu : L’Epée de bois, 100 rue Mouffetard, métro Censier-Daubenton Le même, en XML : <?xml version="1.0" encoding="ISO-8859-1"?> <CINEMA><NOM>Epée de Bois</NOM><ADRESSE>100, rue Mouffetard</ADRESSE><METRO> Censier-Daubenton</METRO></CINEMA> XML, format universel - B. Amann et P. Rigaux – p.14/167 Le même, mieux présenté Présentation courante : avec indentation <?xml version="1.0" encoding="ISO-8859-1"?> <CINEMA> <NOM> Epée de Bois </NOM> <ADRESSE> 100, rue Mouffetard </ADRESSE> <METRO> Censier-Daubenton </METRO> </CINEMA> NB : il y a des espaces et des sauts de ligne XML, format universel - B. Amann et P. Rigaux – p.15/167 Encore mieux : sous forme d’arbre CINEMA NOM ADRESSE METRO Épée de bois 100, rue Mouffetard Censier-Daubenton Traiter un document XML = extraire des informations d’un arbre. XML, format universel - B. Amann et P. Rigaux – p.16/167 Un exemple plus complet, avec attributs <?xml version="1.0" encoding="ISO-8859-1"?> <CINEMA> <NOM>Epée de bois</NOM> <ADRESSE>100, rue Mouffetard</ADRESSE> <METRO>Censier-Daubenton</METRO> <SALLE NO=’1’ PLACES=’320’> <TITRE>Alien</TITRE> <REMARQUE>Reservation conseillée</REMARQUE> <SEANCES> <SEANCE>15:00</SEANCE> <SEANCE>18:00</SEANCE> <SEANCE>21:00</SEANCE> </SEANCES> </SALLE> </CINEMA> XML, format universel - B. Amann et P. Rigaux – p.17/167 Sous forme d’arbre CINEMA NOM Epée de bois ADRESSE 100, rue Mouffetard METRO SALLE NO=1 PLACES=320 SALLE NO=2 PLACES=120 Censier TITRE REMARQUE Alien Réservation conseillée SEANCES TITRE SEANCES Vertigo SEANCE SEANCE 15:00 18:00 SEANCE 21:00 SEANCE 22:00 XML, format universel - B. Amann et P. Rigaux – p.18/167 Documents XML Un document XML est une représentation alphanumérique de données (semi-)structurées provenant d’un ou de plusieurs fichiers et/ou d’un message et/ou d’une base de données... XML, format universel - B. Amann et P. Rigaux – p.19/167 Exemple d’Intégration <?xml version="1.0" encoding="ISO-8859-1"?> <SALLE NO=’2’ PLACES=’120’> <FILM> <TITRE>Vertigo</TITRE> <AUTEUR>Alfred Hitchcock</AUTEUR> <ANNEE>1958</ANNEE> <GENRE>Drame</GENRE> <PAYS>Etats Unis</PAYS> <RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu’il a vu mourir son collègue.... </RESUME> </FILM> <SEANCES> <SEANCE>22:00</SEANCE> </SEANCES> </SALLE> XML, format universel - B. Amann et P. Rigaux – p.20/167 Sous forme d’arbre Salle2.xml:/ SALLE NO=2 PLACES=120 FILM TITRE AUTEUR ANNEE GENRE SEANCES PAYS RESUME SEANCE Vertigo Hitchcock 1958 1958 USA Scotty... 22:00 XML, format universel - B. Amann et P. Rigaux – p.21/167 Le cinéma : intégration des salles <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE CINEMA [ <!ENTITY salle1 SYSTEM "Salle1.xml"> <!ENTITY salle2 SYSTEM "Salle2.xml"> ]> <CINEMA> <NOM>Epée de bois</NOM> <ADRESSE>100, rue Mouffetard</ADRESSE> <METRO>Censier-Daubenton</METRO> &salle1; &salle2; </CINEMA> XML, format universel - B. Amann et P. Rigaux – p.22/167 Premier bilan Disposer d’une et une seule représentation J’utilise un traitement de texte ? je suis prisonnier du format Je stocke dans une base de données ? idem Créer un langage pour décrire nos données Ne pas utiliser HTML, dédié à la présentation dans un navigateur = utiliser XML, et convertir vers HTML XML, format universel - B. Amann et P. Rigaux – p.23/167 Publication de données avec XSLT Publication de données avec XSLT - B. Amann et P. Rigaux – p.24/167 XSLT : pour quoi faire Séparer la gestion du contenu de la présentation Gestion du contenu = décrire nos informations, avec un vocabulaire XML Présentation = mettre en forme nos documents pour une application particulière XSLT permet d’écrire des programmes de conversions, très adaptés au traitement de documents XML Publication de données avec XSLT - B. Amann et P. Rigaux – p.25/167 Application Nous avons décrit notre cinéma avec notre propre langage. XSLT va permettre de traduire ce langage vers d’autres langages : HTML pour la présentation Web standard WML pour la présentation WAP SMIL pour une présentation multimédia XSL-FO pour la production de documents papier Publication de données avec XSLT - B. Amann et P. Rigaux – p.26/167 Version HTML HTML revisité : Un document HTML est un document XML Le vocabulaire est fixé, ainsi que la syntaxe Chaque balise a une signification bien définie HTML a été normalisé comme « dialecte » XML = XHTML Publication de données avec XSLT - B. Amann et P. Rigaux – p.27/167 Ce qu’on veut obtenir (démo) <html> <head><title>Film: Vertigo</title></head> <body bgcolor="white"> <p><img SRC="Vertigo.png"> <h1><i>Vertigo</i></h1> Drame, <i>Etats Unis</i>, 1958 </p> <p> Mis en scène par <b>Alfred Hitchcock</b> <h3>Résumé</h3>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu’il a vu mourir son collègue... </p> </body> </html> Publication de données avec XSLT - B. Amann et P. Rigaux – p.28/167 HTML, sous forme d’arbre html Marquage HTML body head ... p title img i h1 "Film: " <TITRE> i Eléments XML <TITRE> <GENRE> <PAYS> Publication de données avec XSLT - B. Amann et P. Rigaux – p.29/167 Le rôle de XSLT XSLT doit nous permettre : De prendre en entrée un document XML source De produire en sortie un autre arbre XML D’insérer dans le document en sortie des fragments du document source Donc bien adapté à une transformation XML HTML Publication de données avec XSLT - B. Amann et P. Rigaux – p.30/167 WML, autre dialecte de XML Document WML : marqué par la balise wml Il est divisé en cartes, unité d’affichage sur le mobile ( card ) Elements principaux : des balises simples de mise en forme ( b , i ) des ancres pour passer d’une carte à une autre Publication de données avec XSLT - B. Amann et P. Rigaux – p.31/167 Exemple d’une carte WML <?xml version="1.0" encoding="iso-8859-1"?> <wml> <card> <p> <b> Alien </b> , 1979, Ridley Scott <br/> Près d'un vaisseau spatial échoué sur une lointaine planète, .. </p> </card> </wml> Publication de données avec XSLT - B. Amann et P. Rigaux – p.32/167 SMIL Langage pour la création de documents multimédia avec XML. On indique une fenêtre d’affichage avec différentes régions pour l’affichage des composants. On place les composants dans les différentes régions (positionnement spatiale). On synchronise l’affichage des composants (positionnement temporel). Publication de données avec XSLT - B. Amann et P. Rigaux – p.33/167 Entête SMIL: Fenêtre et régions reg_img_grand <head> <meta reg_texte 600 pixels reg_img_petit name="title" content="Version SMIL" /> <meta name="author" content=" c 2001 Sallesenligne.com" /> <layout> <root-layout width="450" height="600" /> <region id="reg_img_grand" width="400" height="300" left="25" top="25" fit="meet" /> <region id="reg_img_petit" width="200" height="125" left="125" top="75" fit="meet" /> <region id="reg_texte" width="350" height="325" left="50" top="250" z-index="1"/> </layout> </head> 450 pixels Publication de données avec XSLT - B. Amann et P. Rigaux – p.34/167 Corps SMIL: Positionnement reg_img_grand Vertigo Scottie Ferguson, ancien inspecteur de police est sujet au vertige depuis qu’il a vu mourir son collègue. Elster, son ami 600 pixels reg_img_petit <body> <seq> <par endsync="first" id="page1" > <audio src="Sound.wav" /> <a href="#page2" > <img src="Vertigo.png" region="reg_img_grand" /> </a> </par> <par id="page2" dur="30s" > <text src="Vertigo-Resume.txt" region="reg_texte" /> <img src="Vertigo.png" region="reg_img_petit" /> </par> </seq> </body> 450 pixels Démo ! Publication de données avec XSLT - B. Amann et P. Rigaux – p.35/167 Version XSL-FO Version XSL-FO - B. Amann et P. Rigaux – p.36/167 XSL-FO Langage de description de documents avec XML. On indique les paramètres de mise en page (marges, taille des polices...) On place le contenu entre des balises de formatage = un processeur se charge de produire le document Version XSL-FO - B. Amann et P. Rigaux – p.37/167 Transformation, et mise en forme Document XML Document XSL-FO Transformation Document PDF Mise en Forme Version XSL-FO - B. Amann et P. Rigaux – p.38/167 Exemples d’un document XSL-FO <?xml version="1.0" encoding="iso-8859-1"?> <fo:root> <fo:layout-master-set> <fo:simple-page-master master-name="page" page-height="29.7cm" page-width="21cm"/> </fo:layout-master-set> <fo:page-sequence master-name=’simple’> <fo:flow font-size="20pt"> <fo:block> Ceci est le premier paragraphe, </fo:block> </fo:flow> </fo:page-sequence> </fo:root> Démo ! Le programme de l’Epée de Bois! Version XSL-FO - B. Amann et P. Rigaux – p.39/167 Échanges et intégration de données Échanges et intégration de données - B. Amann et P. Rigaux – p.40/167 Exemple : moteur de recherche réponse www.cine-marseille.fr requête www.sallesenligne.fr www.epee-de-bois.fr Échanges et intégration de données - B. Amann et P. Rigaux – p.41/167 Quelques idées J’ai mes données Je leur ai défini une représentation Je leur applique des traitements (publication ou autre) Je peux les transmettre à quelqu’un d’autre (tout ou partie) = un service externe m’apporte une valeur ajoutée Échanges et intégration de données - B. Amann et P. Rigaux – p.42/167 Quel format ? Mon problème : J’ai décrit mes données avec mon langage XML L’application attend des données dans son langage Il faut : Décrire formellement les deux langages Faire une traduction de l’un à l’autre Échanges et intégration de données - B. Amann et P. Rigaux – p.43/167 Les DTD Document Type Definition Pour définir la structure d’une classe de documents (d’un langage) Exemple : un élément de type texte : !ELEMENT TITRE ( #PCDATA ) Exemple : un élément constitué d’une liste !ELEMENT FILM (TITRE, CINEMA, VILLE, URL?, HEURE+) Échanges et intégration de données - B. Amann et P. Rigaux – p.44/167 La DTD du moteur de recherche Un fichier auquel on peut faire référence dans un document : 1 2 3 4 5 6 <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT FILM TITRE CINEMA VILLE URL HEURE ( ( ( ( ( ( TITRE, CINEMA, VILLE, URL?, HEURE+ ) > #PCDATA ) > #PCDATA ) > #PCDATA ) > #PCDATA ) > #PCDATA ) > Document valide : conforme à une DTD. Échanges et intégration de données - B. Amann et P. Rigaux – p.45/167 Architecture ( Démo ) DTD 1 XSLT Documents XML Client web Moteur de recherche Flux XML Intégration Recherche XSLT SQL Client web Client web DTD 2 BD Échanges et intégration de données - B. Amann et P. Rigaux – p.46/167 Le document intégrateur <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE MOTEUR [ <!ENTITY EpeeDeBois SYSTEM "http://epee-de-bois.fr/EDB.xml"> <!ENTITY CineMarseille SYSTEM "http://cine-marseille.fr/CM.xml"> ]> <MOTEUR> <CINEMA> &EpeeDeBois; </CINEMA> <CINEMA> &CineMarseille; </CINEMA> </MOTEUR> Échanges et intégration de données - B. Amann et P. Rigaux – p.47/167 Gestion de l’information avec XML Données dynamiques Base de données Fichiers XSLT Transformation XSLT XSLT application web Message XML Document XML XSLT Contenu formaté application édition XSLT XSLT Page WML application WAP Document XML application XML présentation Page XHTML Résultat Application Echange/intégration contenu transformation Données statiques Échanges et intégration de données - B. Amann et P. Rigaux – p.48/167 Récapitulons ! XML = format d’échange de données entre application Permet de définir des « langages » pour décrire des données (« méta-langage ») De nombreux outils d’analyse, parsing, interrogation, ... Transformation d’un langage à un autre avec XSLT = Bien adapté au web. Échanges et intégration de données - B. Amann et P. Rigaux – p.49/167 XML = syntaxe + modèle XML = syntaxe + modèle - B. Amann et P. Rigaux – p.50/167 Le World Wide Web Consortium (W3C) URL: http://www.w3.org 400 partenaires industriels, parmi lesquels les plus grand comme Oracle, IBM, Compaq, Xerox, Microsoft Laboratoires de recherche: MIT pour les États Unis, INRIA pour l’Europe, université Keio (Japon) pour l’Asie Objectif: définir un modèle pour faciliter l’échange de données sur le Web XML = syntaxe + modèle - B. Amann et P. Rigaux – p.51/167 Le langage de marquage XML XML = eXtensible Markup Language Recommendation W3C pour les documents Web (généralisation de HTML), mais aussi pour l’échange, l’intégration et l’interrogation des données sur le Web. XML = syntaxe + modèle - B. Amann et P. Rigaux – p.52/167 XML = Syntaxe “ASCII du 21e siècle” : ASCII (ISO 646) et UNICODE/ISO 10646: encodage de caractères XML: encodage/linéarisation de données XML premet de représenter des données avec une structure irrégulière, implicite et partielle Les nouvelles techniques d’intégration et d’interrogation de données semi-structurées peuvent être appliquées. XML = syntaxe + modèle - B. Amann et P. Rigaux – p.53/167 Notion de balisage structurel Principe clé de XML : séparer la structure logique des données de leur présentation. Avantages (par rapport à HTML): indépendance entre les outils de navigation (browser) et les outils de gestion de données (e.g. BD) différentes présentations sont possibles pour le même document indexation et interrogation XML = syntaxe + modèle - B. Amann et P. Rigaux – p.54/167 Forme sérialisée et forme arborescente Il existe deux représentations d’un document XML. Forme sérialisée : c’est la forme courante, où le contenu est marqué par des balises. Forme arborescente : elle met en évidence la structure du document. Il est plus facile de raisonner sur la forme arborescente pour concevoir des traitements XML = syntaxe + modèle - B. Amann et P. Rigaux – p.55/167 Un document sous forme sérialisée <?xml version="1.0" encoding="ISO-8859-1"?> <CINEMA> <NOM> Epée de Bois </NOM> <ADRESSE> 100, rue Mouffetard </ADRESSE> <METRO> Censier-Daubenton </METRO> </CINEMA> Cette représentation permet le stockage et l’échange de documents. XML = syntaxe + modèle - B. Amann et P. Rigaux – p.56/167 XML = modèle de données Un arbre, constitué de nœuds typés (éléments, commentaires, etc) CINEMA NOM ADRESSE METRO Épée de bois 100, rue Mouffetard Censier-Daubenton La structure des arbres XML est définie par le Document Object Model (DOM). XML = syntaxe + modèle - B. Amann et P. Rigaux – p.57/167 En pratique On utilise la forme sérialisée : pour stocker un document dans un fichier pour échanger des documents La forme arborescente : permet de spécifier des manipulations de données XML modèle de données XML = syntaxe + modèle - B. Amann et P. Rigaux – p.58/167 Représentation sérialisée Elle permet de marquer, par des balises, la structure d’un document. <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Commentaire --> <A>Le texte de A <B>Le texte de B</B> <D attr1="1" attr2="azerty"> <C/> </D> <![CDATA[2x < y]]> </A> XML = syntaxe + modèle - B. Amann et P. Rigaux – p.59/167 Passage à la représentation DOM Le document sérialisé est analysé, et une représentation arborescente est créée : le nœud racine est de type Document les catégories syntaxiques (commentaires, balises, texte) se traduisent par différents types de nœuds (Comment, Element, Text) les nœuds constituent un arbre qui reflète l’imbrication des éléments dans la forme sérialisée XML = syntaxe + modèle - B. Amann et P. Rigaux – p.60/167 La représentation DOM Document - Comment Commentaire Text Le texte de A Element A Element B Text Le texte de B Element D Attr attr1 1 Attr attr2 azerty CDataSection 2x y Element C XML = syntaxe + modèle - B. Amann et P. Rigaux – p.61/167 Présentation de la syntaxe XML Un ensemble de catégories syntaxiques : les éléments (et leurs attributs) les commentaires les instructions de traitement les sections de texte les sections littérales Ainsi que quelques règles sur la structure d’un document XML = syntaxe + modèle - B. Amann et P. Rigaux – p.62/167 La déclaration XML Tout document XML peut être précédé par une déclaration : <?xml version="1.0" encoding="ISO-8859-1"?> l’attribut encoding indique le jeu de caractères utilisé dans le document l’attribut optionnel standalone indique si le document est composé de plusieurs entités. XML = syntaxe + modèle - B. Amann et P. Rigaux – p.63/167 Déclaration de type On peut indiquer qu’un document est conforme à une DTD, et déclarer des entités. <!DOCTYPE nom SYSTEM "sourceExt" [decLoc]> nom est le type de l’élément racine sourceExt est un source extérieure contenant la DTD decLoc sont des déclarations locales (pour les entités principalement) XML = syntaxe + modèle - B. Amann et P. Rigaux – p.64/167 Entités et références à des entités Les entités servent à factoriser des parties du document. <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE A SYSTEM "minimal.dtd" [ <!ENTITY monTexte "texte simple"> <!ENTITY maSignature SYSTEM "signature.xml"> ]> <A> Du &monTexte;, sans caractères réservés: ni < ni > ni & ni ' ni " &maSignature; </A> XML = syntaxe + modèle - B. Amann et P. Rigaux – p.65/167 Entités caractères Déclaration entité <!ENTITY lt "<"> <!ENTITY gt ">"> <!ENTITY amp "&"> <!ENTITY apos "'"> <!ENTITY quot """> Référence < > & ' " Car. < > & ’ " Table 1: XML = syntaxe + modèle - B. Amann et P. Rigaux – p.66/167 Commentaires et instructions de traitement Les commentaires : à utiliser avec parcimonie : <!-- Ceci est un commentaire --> Instructions de traitement : lié au système qui traite le document : <?xml-stylesheet href="prog.xslt" type="text/xslt"> XML = syntaxe + modèle - B. Amann et P. Rigaux – p.67/167 Éléments Dans la forme sérialisée : C’est une balise ouvrante avec un nom, puis un contenu, puis une balise fermante Dans la forme arborescente C’est un nœud avec un nom Le contenu est un arbre XML = syntaxe + modèle - B. Amann et P. Rigaux – p.68/167 Exemple : un élément avec contenu <?xml version="1.0" encoding="ISO-8859-1"?> <A>Le texte de A <B>Le texte de B</B> </A> Element A Text Le texte de A Element B Text - Text Le texte de B XML = syntaxe + modèle - B. Amann et P. Rigaux – p.69/167 Quelques remarques sur les éléments Un nom d’élément ne contient pas de blanc, ni de caractère accentué Les majuscules sont distinguées des minuscules Il existe une forme abrégée pour les éléments sans contenu : <C></C> peut s’écrire <C/>. Tout document comprend un et un seul élément racine XML = syntaxe + modèle - B. Amann et P. Rigaux – p.70/167 Attributs Les attributs constituent un autre moyen de représenter de l’information. <A att1=’1’ att2=’2’> l’ordre des attributs n’est pas important il doit toujours y avoir une valeur, encadrée par des guillemets (différent de HTML) il ne peut pas y avoir deux attributs avec le même nom dans un élément. XML = syntaxe + modèle - B. Amann et P. Rigaux – p.71/167 Attributs : exemples <A att1=’1’ att2=’2’> est équivalent à <A att2=’2’ att1=’1’> Attr att1 1 Element A Attr att2 2 <A att=a> n’est pas bien formé : pas d’apostrophe <A att1=’1’ att1=’2’/> : interdit <A att1=’1’/> <B att1=’2’/> : autorisé (deux éléments différents) XML = syntaxe + modèle - B. Amann et P. Rigaux – p.72/167 Les sections littérales À priori, on n’a pas le droit de placer dans le contenu d’un document XML des caractères comme ’<’, ’>’, ou ’&’. <?xml version=’1.0’?> <PROGRAMME> if ((i < 5) && (j > 6)) printf("error"); </PROGRAMME> est incorrecte! XML = syntaxe + modèle - B. Amann et P. Rigaux – p.73/167 Solution : sections CDATA Elles permettent d’inclure du texte qui n’est pas analysé par le parseur : <?xml version=’1.0’?> <PROGRAMME> <![CDATA[if ((i < 5) && (j > 6)) printf("error"); ]]> </PROGRAMME> CDATASection if ((i < 5) && (j > 6)) printf("error"); XML = syntaxe + modèle - B. Amann et P. Rigaux – p.74/167 Résumé : structure d’un document XML Un document XML comprend trois parties : le prologue, avec la déclaration XML, la DTD, des commentaires, des instructions de traitements (optionnels) un élément racine avec son contenu un épilogue avec des commentaires, ou des instructions de traitements (optionnels) Le contenu du document proprement dit est le contenu de l’élément racine. XML = syntaxe + modèle - B. Amann et P. Rigaux – p.75/167 XPath Sélectionner des Fragments XML XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.76/167 Exemple: Document XML Document XML: / FILM TITRE AUTEUR ANNEE RESUME Vertigo Hitchcock 1958 Scotty... XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.77/167 Exemple: Règle de transformation / FILM TITRE AUTEUR ANNEE RESUME Vertigo Hitchcock 1958 Scotty... * i * * h1 i p * Résumé: h3 p XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.78/167 Exemple: Résultat Fragment HTML: p h1 i p i 1958 Hitchcock h3 Résumé: Scotty... Vertigo XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.79/167 Référencer des fragments XML avec XPA Pour pouvoir transformer un document XML il faut pouvoir extraire des fragments (nœuds) XML XPath : d’un document XPath est fondé sur une représentation arborescente (DOM) du document XML Objectif : référencer nœuds (éléments, attributs, commentaires, ...) dans un document XML XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.80/167 XPath: Exemples de chemins XPath Document XML: / /FILM FILM /FILM/RESUME /FILM/TITRE TITRE AUTEUR ANNEE RESUME /FILM/RESUME/text() Vertigo Hitchcock 1958 Scotty... XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.81/167 XPath: Utilisation Le langage permet de désigner un ou plusieurs nœuds dans un document XML, à l’aide d’expressions de chemin. XPath est utilisé par XSLT pour sélectionner des règles de transformation XML Schéma pour créer des clés et références XLink pour créer des liens entre documents/fragments XML XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.82/167 Les arbres XPath Un typage simplifié par rapport à celui de DOM Document Element Text Attribut ProcessingInstruction Comment pas d’entité, pas de section littérale XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.83/167 Exemple : l’arbre DOM... Document - Element EXEMPLE Text Section littérale avec SectionCDATA des ’&’, des ’ ’ des ’ ’ Text et un text XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.84/167 Puis l’arbre XPath... Document - Element EXEMPLE Text Section littérale avec des ’&’, des ’ ’ des ’ ’ et un texte XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.85/167 Expressions XPath Une expression XPath : s’évalue en fonction d’un nœud contexte désigne un ou plusieurs chemins dans l’arbre à partir du nœud contexte a pour résultat un ensemble de nœuds ou une valeur, numérique, booléenne ou alphanumérique XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.86/167 Chemins XPath Un chemin XPath est une suite d’étapes : [/]étape /étape /.../étape Deux variantes : Un chemin peut être absolu : /FILM/RESUME Le nœud contexte est alors la racine du document. ou relatif : RESUME/text() Le nœud contexte est un nœud dans le document (pas forcément la racine). XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.87/167 Étapes XPath Une étape : trois composants [axe::]filtre[prédicat1][prédicat2] l’axe : sens de parcours des nœuds (par défaut: child). le filtre : type des nœuds qui seront retenus le(s) prédicat(s) que doivent satisfaire les nœuds retenus XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.88/167 Les axes XPath Un axe XPath recouvre les deux notions suivantes : un sous-ensemble des nœuds de l’arbre relatif au nœud contexte ; l’ordre de parcours de ces nœuds à partir du nœud contexte. XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.89/167 Exemple de référence Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.90/167 Exemple : le nœud contexte Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.91/167 child::D ou D Document - Instruction Java ins1 Element B Attr att1 a1 Element D Element D Text Texte1 Text Texte2 Element A Comment CommFin Nœud contexte Element C Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.92/167 attribute::att1 ou @att1 Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Nœud contexte Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.93/167 parent::A Document - Instruction Java ins1 Element B Attr att1 a1 Element D Element D Text Texte1 Text Texte2 Element A Comment CommFin Nœud contexte Element C Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.94/167 Notation abrégée de parent::A La notation abrégée .. désigne le père du nœud contexte, quel que soit son type. Équivalent à : parent:node() node() est un filtre qui désigne tous les types de nœuds (sauf les attributs) XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.95/167 Axe descendant Document - Instruction Java ins1 Element B Attr att1 a1 Element D Element D Text Texte1 Text Texte2 Element A Comment CommFin Nœud contexte Element C Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.96/167 Axe ancestor Document - Instruction Java ins1 Element B Attr att1 a1 Element D Element D Text Texte1 Text Texte2 Element A Comment CommFin Nœud contexte Element C Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.97/167 Axe self il désigne le nœud contexte lui-même. Doit être complété par un filtre. Exemples : notre nœud contexte : self::B mais self::A renvoie un ensemble vide Pour prendre le nœud quel que soit son type : self::node() Notation abrégée : « . » XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.98/167 Axe preceding-sibling Document - Instruction Java ins1 Element B Attr att1 a1 Element D Element D Text Texte1 Text Texte2 Element A Comment CommFin Nœud contexte Element C Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.99/167 Axe following Document - Instruction Java ins1 Element B Attr att1 a1 Element D Element D Text Texte1 Text Texte2 Element A Comment CommFin Nœud contexte Element C Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.100/167 Axes: Résumé nœuds enfants et descendants: child, descendant, descendant-or-self nœud parent et ancêtres: parent, ancestor frères: preceding-sibling, following-sibling nœuds précédents et suivants: preceding, following nœud même: self XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.101/167 Filtres Deux manières de filtrer les nœuds : par leur nom : possible pour les types de nœuds qui ont un nom : Element, ProcessingInstruction et Attr par leur type DOM. XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.102/167 Chemin absolu : /A/B/D Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.103/167 /descendant::node()/@att2 Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.104/167 Nom générique : /A/* Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.105/167 Filtrage sur le type de nœud text() : Nœuds de type Text comment() : Nœuds de type Comment Exemple : /comment() processing-instruction() : Nœuds de type ProcessingInstruction Exemple : /processing-instruction(), ou /processing-instruction(’java’) node() : Tous les types de nœud XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.106/167 /A/B//text() Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.107/167 /comment() Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.108/167 Prédicats Prédicat : expression booléenne constituée d’un ou plusieurs tests, composés avec les connecteurs logiques habituels and et or Test : toute expression XPath, dont le résultat est convertie en booléen; une comparaison, un appel de fonction. il faut connaître les règles de conversion XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.109/167 Quelques exemples /A/B[@att1] : Les nœuds /A/B qui ont un attribut @att1 /A/B[@att1=’a1’] : Les nœuds /A/B qui ont un attribut @att1 valant ’a1’ /A/B/descendant::text()[position()=1] : Le premier nœud de type Text descendant d’un /A/B. /A/B/descendant::text()[1] : idem XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.110/167 Pour bien comprendre Dans l’expression /A/B[@att1] : On s’intéresse aux nœuds de type B fils de l’élément racine A. Parmi ces nœuds on ne prend que ceux pour lesquels le prédicat [@att1] s’évalue à true Cette expression s’évalue avec pour nœud contexte un élément B [@att1] vaut true ssi @att1 renvoie un ensemble de nœuds non vide XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.111/167 Contexte d’évaluation Une étape s’évalue en tenant compte d’un contexte constitué de un nœud contexte, position initiale du chemin ; ce nœud fait lui-même partie d’un ensemble obtenu par évaluation de l’étape précédente on connaît la taille de cet ensemble (fonction last()) on connaît la position du nœud contexte dans cet ensemble (fonction position()) XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.112/167 /A/B/descendant::text()[1] Document - Instruction Java ins1 Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.113/167 Typage avec XPath On peut effectuer des comparaisons, des opérations. Cela implique un typage et des conversions de type. Types XPath : les numériques les chaînes de caractères les booléens (true et false) enfin les ensembles de nœuds XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.114/167 Numériques Notation décimale habituelle Comparaisons habituelles (<, >, !=) Opérations : +, -, *, div, mod La fonction number () permet de tenter une conversion Si la conversion échoue on obtient NaN (Not a Number ). À éviter... Ex : //node()[number(@att1) mod 2=1] XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.115/167 Conversions Deux conversions sont toujours possibles. Vers une chaîne de caractères. utile pour la production de texte en XSLT (balise xsl:value-of) Vers un booléen utile pour les tests effectués dans XSLT (xsl:if, xsl:when) XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.116/167 Conversions booléennes Pour les numériques : 0 ou NaN sont false, tout le reste est true Pour les chaînes : une chaîne vide est false, tout le reste est true Pour les ensembles de nœuds : un ensemble vide est false, tout le reste est true Comparaisons : des règles de conversion étranges... XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.117/167 Fonctions XPath Quelques fonctions utiles dans les prédicats : concat(chaîne1, chaîne2, ...) pour concaténer des chaînes contains(chaîne1, chaîne2) teste si chaîne1 contient chaîne2 count (expression) renvoie le nombre de nœuds désignés par expression name() renvoie le nom du nœud contexte not(expression) : négation XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.118/167 Prédicats: Exemples Axes « d’avancement » : child::*[3]: le 3e enfant child::*[position()=3]: idem child::*[last()]: le dernier enfant descendant::*[last()]: le dernier descendant La position d’un nœud dépend de l’axe choisi. XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.119/167 Prédicats: Axes inverses Axes « inverses » : ancestor::*[1]: le premier ancêtre du nœud contexte (dernier dans l’ordre du document). preceding-sibling::*[last()]: le dernier frère qui précède le nœud contexte (premier dans l’ordre du document). XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.120/167 Prédicats: Exemples Test du nombre d’occurrences : CINEMA[count(SEANCE) > 1]: cinémas avec au moins 2 séances FILM[count(ACTEUR) = 0]: films sans acteur FILM[not(ACTEUR)]: films sans acteur XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.121/167 Prédicats: Sélection par valeur Sélection par valeur: FILM[not(ACTEUR[NOM=’Willis’])]: films sans Bruce Willis FILM[ACTEUR/NOM=’Willis’]: films avec Bruce Willis FILM[ACTEUR[NOM=’Willis’]]: idem XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.122/167 Prédicats: Exemples Test sur la structure : chemins imbriqués avec connecteurs logiques (qualifiers) ACTEUR[NOM and DATENAISSANCE] ou ACTEUR[NOM][DATENAISSANCE]: les acteurs avec un nom et une date de naissance FILM[@TITRE = ’Brazil’ and ACTEUR/NOM = ’De Niro’]: le film Brazil avec l’acteur De Niro FILM[@TITRE = ’Brazil’][ACTEUR/NOM = ’De Niro’]: idem XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.123/167 Remarque sur les prédicats Attention: Les deux premières expressions sont equivalentes, mais pas la troisième! Pourquoi? FILM[ACTEUR and position()=1] FILM[position()=1][ACTEUR] FILM[ACTEUR][position()=1] XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.124/167 Un cas épineux : les espaces Un document XML avec espaces <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet href="ex.xsl" type="text/xsl"?> <!-- commentaire --> <!DOCTYPE A SYSTEM "ex.dtd" > <A> <B at1=’ val1 ’ at2=’ avec blanc ’ /> <C> </C> <D> texte </D> </A> XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.125/167 Où sont les espaces ? Un peu partout ! avant la balise ouvrante de l’élément racine ; à l’intérieur d’une balise ; à l’intérieur d’un élément ; à l’intérieur de la valeur d’un attribut ; entre deux balises ; entre deux attributs. Tous n’ont pas la même importance XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.126/167 Les espaces dans XPath Les espaces du prologue ou de l’épilogue sont supprimés. Les espaces consécutifs sont réduits à un seul. Les fins de lignes sont représentées par le caractère #xA. En général, les espaces en début et fin d’attributs sont supprimées. XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.127/167 L’arbre XPath du document Document - Element A Text #xA#20 Attr at1 #20val1#20 Element B Text #xA#20 Attr at2 #20avec#20blanc#20 Element C Text #20 Text #xA#20 Element D Text #xA#20 Text #20texte#20 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.128/167 Instruction xsl:strip-space Document - Element A Element B Attr at1 #20val1#20 Element C Attr at2 #20avec#20blanc#20 Element D Text #20texte#20 XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.129/167 XPath : Résumé XPath est un langage pour extraire des noeuds dans un arbre XML : On navigue dans l’arbre grâce à des axes de navigation. Un chemin de navigation est une séquence d’étapes. Dans chaque étape on choisi un axe, un filtre et éventuellement des prédicats. Le résultat d’une étape (d’une séquence d’étapes) est un séquence de noeuds. XPathSélectionner des Fragments XML - B. Amann et P. Rigaux – p.130/167 Introduction à XSLT Introduction à XSLT - B. Amann et P. Rigaux – p.131/167 Sommaire Une introduction à XSLT, destinée à comprendre les mécanismes du langage. Règles XSLT Désignation de fragments XML Appels de règles Application : XML - HTML et XML - WML Passage de paramètres Introduction à XSLT - B. Amann et P. Rigaux – p.132/167 Qu’est-ce qu’on peut faire avec XSLT? Transformer un document XML en un ou plusieurs documents XML, HTML, WML, SMIL document papier: PDF (XSL-FO), LaTeX texte simple Introduction à XSLT - B. Amann et P. Rigaux – p.133/167 Fonctions d’une Feuille de Style XSLT Fonction de Base: Langage de règles de transformation de documents/arbres XML: extraction de données génération de texte suppression de contenu (noeuds) déplacer contenu (noeuds) dupliquer contenu (noeuds) trier Introduction à XSLT - B. Amann et P. Rigaux – p.134/167 Exemple / FILM TITRE AUTEUR ANNEE RESUME Vertigo Hitchcock 1958 Scotty... * i * * h1 i p * Résumé: h3 p Introduction à XSLT - B. Amann et P. Rigaux – p.135/167 Exemple: Règle de transformation 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <xsl:template match="FILM"> <p> <h1> <i> <xsl:value-of select="TITRE"/> </i> </p> <i> <xsl:value-of select="ANNEE"/> </i> <p> <xsl:value-of select="AUTEUR"/> </p> <h3>Résumé: <xsl:value-of select="RESUME"/> </h3> </p> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.136/167 Extraction de données Exemple : recherche du titre pour le nœud FILM : xsl:value-of select="TITRE"/ Plus généralement : on donne un chemin d’accès XPath à un nœud à partir du nœud courant (noeud contexte). Introduction à XSLT - B. Amann et P. Rigaux – p.137/167 Génération de texte Produire une phrase quand on rencontre un nœud FILM : <xsl:template match="FILM"> Ceci est le texte produit par application de cette règle. </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.138/167 Génération d’un arbre XML Produire un document/fragment/arbre XML quand on rencontre un nœud FILM : <xsl:template match="FILM"> <body> <p>Un paragraphe</p> </body> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.139/167 Génération avec extraction Produire un document/fragment/arbre XML quand on rencontre un nœud FILM : 1 2 3 4 5 6 7 8 <xsl:template match="FILM"> <body> <p> <xsl:text>Titre: </xsl:text> <xsl:value-of select="TITRE"/> </p> </body> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.140/167 Structure de base : les règles Règle = template : élément de base pour produire le résultat une règle s’applique dans le contexte d’un nœud de l’arbre l’application de la règle produit un fragment du résultat. Programme XSLT = ensemble de règles pour construire un résultat Introduction à XSLT - B. Amann et P. Rigaux – p.141/167 Un exemple 1 2 3 4 5 6 7 8 9 10 11 12 <xsl:template match="FILM"> <p> <h1> <i><xsl:value-of select="TITRE"/></i> </h1> <i><xsl:value-of select="ANNEE"/></i> <p><xsl:value-of select="AUTEUR"/></p> <h3> Résumé: <xsl:value-of select="RESUME"/> </h3> </p> </xsl:template> Motif de sélection : match="FILM" Corps de la règle = fragment d’arbre à produire Introduction à XSLT - B. Amann et P. Rigaux – p.142/167 Illustration Contexte d’application de la règle XSLT select="TITRE" FILM TITRE AUTEUR ANNEE GENRE PAYS RESUME Vertigo Hitchcock 1958 Drame USA Scotty... Introduction à XSLT - B. Amann et P. Rigaux – p.143/167 Une règle complète 1 2 3 4 5 6 7 8 9 10 11 12 13 <xsl:template match="FILM"> <html> <head> <title>Film: <xsl:value-of select="TITRE"/> </title> </head> <body> Le genre du film, c’est <b><xsl:value-of select="GENRE"/></b> </body> </html> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.144/167 Le résultat On obtient : 1 2 3 4 5 6 7 8 9 10 11 <html> <head> <title>Film: Vertigo </title> </head> <body> Le genre du film, c’est <b>Suspense</b> </body> </html> Introduction à XSLT - B. Amann et P. Rigaux – p.145/167 Chemins complexes Dans l’exemple précédent, on accédait aux fils d’un nœud. En fait on peut : Accéder à tous les descendants Accéder aux parents, aux frères, aux neveux... Accéder aux attributs Effectuer des boucles Le langage d’expression de chemins : XPath. Introduction à XSLT - B. Amann et P. Rigaux – p.146/167 Exemple: Document XML 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet href="Salle.xsl" type="text/xsl"?> <?cocoon-process type="xslt"?> <SALLE NO=’1’ PLACES=’320’> <FILM> <TITRE>Alien</TITRE> <AUTEUR>Ridley Scott</AUTEUR> <ANNEE>1979</ANNEE> <GENRE>Science-fiction</GENRE> <PAYS>Etats Unis</PAYS> <RESUME>Près d’un vaisseau spatial échoué sur une lointaine planète, des Terriens en mission découvrent de bien étranges "oeufs". Ils en ramènent un à bord, ignorant qu’ils viennent d’introduire parmi eux un huitième passager particulièrement féroce et meurtrier. </RESUME> </FILM> <REMARQUE>Réservation conseillée</REMARQUE> <SEANCES> <SEANCE>15:00</SEANCE> <SEANCE>18:00</SEANCE> <SEANCE>21:00</SEANCE> </SEANCES> </SALLE> Introduction à XSLT - B. Amann et P. Rigaux – p.147/167 Exemple: Traduction de Salle 1 2 3 4 5 6 7 8 9 10 <xsl:template match="SALLE"> <h2>Salle No <xsl:value-of select="@NO"/></h2> Film: <xsl:value-of select="FILM/TITRE"/> de <xsl:value-of select="FILM/AUTEUR"/> <ol> <xsl:for-each select="SEANCES/SEANCE"> <li><xsl:value-of select="."/></li> </xsl:for-each> </ol> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.148/167 Le résultat Appliqué à Salle1.xml : 1 2 3 4 5 6 7 8 <h2>Salle No 1 </h2> Film: Alien de Ridley Scott <ol> <li> 15:00</li> <li> 18:00</li> <li> 21:00</li> </ol> NB : c’est un fragment HTML, à intégrer dans un document complet. Introduction à XSLT - B. Amann et P. Rigaux – p.149/167 Salles et séances Contexte d’application de la règle chemin "@NO" SALLE chemin "FILM/TITRE" NO=2 PLACES=320 chemin SEANCES/SEANCE FILM chemin "REMARQUE" TITRE Alien AUTEUR ANNEE Scott Science-Fiction GENRE PAYS 1979 USA RESUME REMARQUE SEANCES Près d’un Réservation vaisseau spatial... conseillée boucle for-each SEANCE SEANCE 15:00 18:00 SEANCE 21:00 Introduction à XSLT - B. Amann et P. Rigaux – p.150/167 Chemins complexes Descendants : le titre du film est désigné par select="FILM/TITRE" ; Attributs : le numéro de la salle est désigné par select="@NO" ; Boucles : avec xsl:for-each sur l’ensemble des séances désignées par select="SEANCES/SEANCE" ; L’élément contexte : désigné par le symbole ’.’, comme dans select=".". Introduction à XSLT - B. Amann et P. Rigaux – p.151/167 Appels de règles En général on produit un résultat en combinant plusieurs règles : La règle initiale s’applique à la racine du document traité (’/’) On produit alors le cadre du document HTML On appelle d’autres règles pour compléter la création du résultat Introduction à XSLT - B. Amann et P. Rigaux – p.152/167 Exemple : L’Épée de bois « Cadre » HTML, puis appel de la règle CINEMA 1 2 3 4 5 6 7 8 9 10 11 <xsl:template match="/"> <html> <head><title>Programme de <xsl:value-of select="CINEMA/NOM"/> </title> </head> <body bgcolor="white"> <xsl:apply-templates select="CINEMA"/> </body> </html> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.153/167 Règle CINEMA Exploitation de l’élément CINEMA, puis appel à la règle SALLE 1 2 3 4 5 6 7 8 9 10 11 <xsl:template match="CINEMA"> <h1><i> <xsl:value-of select="NOM"/> </i></h1><hr/> <xsl:value-of select="ADRESSE"/>, <i>Métro: </i> <xsl:value-of select="METRO"/> <hr/> <xsl:apply-templates select="SALLE"/> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.154/167 Vue d’ensemble html head title Règle "/" body h1 hr adresse p p i h2 h2 h3 h3 Epée de bois Salle No 1 Film: Alien Salle No 2 Film : Vertigo Règle "CINEMA" Règle "SALLE" Introduction à XSLT - B. Amann et P. Rigaux – p.155/167 La même chose, en WML On génère les cartes du site 1 2 3 4 5 6 7 8 9 10 11 12 <xsl:template match="/"> <wml> <!-- Carte d’accueil --> <xsl:apply-templates select="CINEMA"/> <!-- Cartes pour les salles et séances --> <xsl:apply-templates select="CINEMA/SALLE"/> <!-- création des cartes pour les films --> <xsl:apply-templates select=".//FILM"/> </wml> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.156/167 Arbre XML du site wml card id=index p a a card id=S1 p href=S1 href=Alien a card id=S2 p card p id=Alien card id=Vertigo p href=Vertigo a href=S2 Introduction à XSLT - B. Amann et P. Rigaux – p.157/167 Règle CINEMA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <xsl:template match="CINEMA"> <card id="index" title="Programme"> <p align="center"> <xsl:value-of select="NOM"/> </p> <xsl:for-each select="SALLE"> <p> <a href="#S{@NO}"> Salle <xsl:value-of select="@NO"/>: </a> <xsl:value-of select="FILM/TITRE"/> </p> </xsl:for-each> </card> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.158/167 Résultat 1 2 3 4 5 6 7 8 9 10 11 12 13 <card id="index" title="Programme"> <p align="center"> Epée de bois </p> <p> <a href="#S1"> Salle 1: </a> Alien </p> <p> <a href="#S2"> Salle 2: </a> Vertigo </p> </card> Introduction à XSLT - B. Amann et P. Rigaux – p.159/167 Règle SALLE 1 2 3 4 5 6 7 8 9 10 11 12 13 <xsl:template match="SALLE"> <card id="S{@NO}"> <p>Séances salle <xsl:value-of select="@NO"/></p> <p> <a href="#{FILM/TITRE}"> Film : <xsl:value-of select="FILM/TITRE"/> </a> </p> <xsl:apply-templates select="SEANCES"/> </card> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.160/167 Résultat 1 2 3 4 5 6 7 8 9 10 11 12 <card id="S2"> <p> Séances salle 2 </p> <p> <a href="#Vertigo"> Film : Vertigo</a> </p> <p> Séance 22:00 </p> </card> Introduction à XSLT - B. Amann et P. Rigaux – p.161/167 XSLT avec paramètres 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <html> <head> <title>Formulaire de Recherche</title> </head> <body bgcolor="white"> <h1>Formulaire de Recherche</h1> <form method=’get’ action=’Moteur.xml’ name=’Form’> Film: <input type=’text’ name=’titre’> <br> Séance: <input type=’text’ NAME=’seance’ > (hh:mm)<br> Ville: <input type=’text’ name=’ville’><br> <input type=’submit’ name=’chercher’ value="Chercher"/> </form> </body> </html> Introduction à XSLT - B. Amann et P. Rigaux – p.162/167 Le document XML <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE MOTEUR [ <!ENTITY EpeeDeBois SYSTEM "http://epee-de-bois.fr/EDB.xml"> <!ENTITY CineMarseille SYSTEM "http://cine-marseille.fr/CM.xml"> ]> <MOTEUR> <CINEMA> &EpeeDeBois; </CINEMA> <CINEMA> &CineMarseille; </CINEMA> </MOTEUR> Introduction à XSLT - B. Amann et P. Rigaux – p.163/167 Traitement des paramètres ... <xsl:param name="titre"/> <xsl:param name="seance"/> <xsl:param name="ville"/> <xsl:template match="MOTEUR"> <xsl:for-each select="CINEMA"> <xsl:if test=" ($titre = ’’ or TITRE = $titre) and ($seance = ’’ or HEURE >= $seance) and ($ville = ’’ or VILLE = $ville)"> <xsl:apply-templates select="." /><p/> </xsl:if> </xsl:for-each> </xsl:template> Introduction à XSLT - B. Amann et P. Rigaux – p.164/167 Conclusion sur XSLT Un langage totalement adapté au traitement de documents XML Parcours d’un document, vu comme un arbre Déclenchement de règles sur certains nœuds Association de plusieurs programmes à un même document Introduction à XSLT - B. Amann et P. Rigaux – p.165/167 Bibliographie sur XSLT 1. Recommendation XSLT sur le site du W3C 2. B. Amann et P. Rigaux, Comprendre XSLT, O’Reilly 3. P. Wadler, A formal semantics of patterns in XSLT Introduction à XSLT - B. Amann et P. Rigaux – p.166/167 Conclusion Le monde XML est encore dans ces débuts et il resterait beaucoup de choses à dire sur le langage XSLT même (syntaxe et sémantique), sa relation avec d’autres technologies (e.g. XQuery, DOM, services Web...) et son intégration dans les architectures (serveurs et portails Web, SGBD, ...) Introduction à XSLT - B. Amann et P. Rigaux – p.167/167