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&apos;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 &lt; ni &gt; ni &amp; ni &apos; ni &quot;
&maSignature;
</A>
XML = syntaxe + modèle - B. Amann et P. Rigaux – p.65/167
Entités caractères
Déclaration entité
<!ENTITY lt "&#60;">
<!ENTITY gt "&#62;">
<!ENTITY amp "&#38;">
<!ENTITY apos "&#39;">
<!ENTITY quot "&#34;">
Référence
&lt;
&gt;
&amp;
&apos;
&quot
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&#xE9;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&#xE9;ances salle 2
</p>
<p>
<a href="#Vertigo">
Film : Vertigo</a>
</p>
<p>
S&#xE9;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 &gt;= $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

Documents pareils