Cours XML
Brahim ER-RAHA
Brahim ER-RAHA
Mr Brahim ER-RAHA
ENSA-Département Informatique
135 avenue des FAR
80 000 Agadir
Maroc
bureau 028-55-55-24
fax 061-55-55-55
Je veux envoyer ma carte de visite par courrier électronique
On peut l'envoyer tel quel, dans le texte du courrier
Brahim ER-RAHA
Autre possibilité :
A la réception, le lecteur humain saura décoder les différents champs de l'adresse
Mr ER-RAHA Brahim
ENSA-Département Informatique
135 avenue des FAR
80 000 Agadir
Maroc
bureau 028-55-55-24
fax 061-55-55-55
Brahim ER-RAHA
• il faut l'extraire du reste du texte => identification
• il faut l'analyser FACILEMENT => moteur de recherche
• il faut le vérifier FACILEMENT => validation
• on doit pouvoir l'utiliser dans d'autres applications => portabilité
• on doit pouvoir la transformer pour d'autres applications => format du
numéro de téléphone.
Plus difficile par un logiciel!
Brahim ER-RAHA
<carte>
<!-- ma carte de visite -->
<nom préfixe="Mr">ER-RAHA</nom>
<prénom>Brahim</prénom>
<adresse>
<site>ENSA-Département Informatique</site>
<rue>135 avenue des FAR</rue>
<ville>Agadir</ville>
<code-postal>80 000</code-postal>
<pays>Maroc</pays>
</adresse>
<téléphone type="bureau">028-55-55-24</téléphone>
<téléphone type="fax">061-55-55-55</téléphone>
</carte>
Brahim ER-RAHA
HTML est un langage pour présenter des informations à l’écran.
1. il ne permet pas d’échanger des données
2. il ne permet pas un traitement des données autre que l’affichage
On ne sait pas interpréter des données fournies en HTM
Le principal langage du Web est HTML
Commerce électronique : les entreprises veulent échanger des informations
(pas pour les afficher !)
Moteur de recherche : si je sais interpréter les données transmises, je peux les
indexer efficacement
Services en ligne : je peux envoyer mes données à un serveur pour leur
appliquer un traitement donné (ex : publication)
Nouvelles utilisations du Web
Quelques applications :
Brahim ER-RAHA
Le réseau est hétérogène : les données doivent être représentées
indépendamment d’une machine donnée.
Les applications sont variées : les données doivent être représentées
indépendamment d’une application.
Une application = un format de données : il faut pouvoir transformer
facilement les données d’un format à un autre.
Nouveaux besoins : échange et publication de données.
Un document XML est au format ASCII : il voyage (relativement) facilement
XML n’est pas lié à un mode d’utilisation : chacun peut se définir son propre
« langage », (SMIL, SVG, WML, etc)
Beaucoup d’outils de manipulation : DOM, SAX, XSLT, XPath, XQuery, etc
Le langage XML est une réponse à ces besoins :
Brahim ER-RAHA
Origine de XML
Standard Generalized Markup Language
SGML
HTML
XML
( Sépare les données la structure des données et la
mise en forme )
Hyper Text Markup Language
( Mélange les données et la mise en forme )
eXtensible Markup Language
( Sépare les données la structure des données et la
mise en forme )
Brahim ER-RAHA
I- INTRODUCTION
I-1 Définition
XML (eXtensible Markup Language et traduisez Langage à balises étendu, ou
Langage à balises extensibles) est en quelque sorte un langage HTML amélioré
permettant de définir de nouvelles balises. Il s'agit effectivement d'un langage
permettant de mettre en forme des documents grâce à des balises (markup).
En réalité les balises XML décrivent le contenu plutôt que la présentation
(contrairement À HTML). Ainsi, XML permet de séparer le contenu de la
présentation ce qui permet par exemple d'afficher un même document sur des
applications ou des périphériques différents sans pour autant nécessiter de créer
autant de versions du document que l'on nécessite de représentations
XML a été mis au point par le XML Working Group sous l'égide du World Wide
Web Consortium (W3C) dès 1996. Depuis le 10 fevrier 1998, les spécifications
XML 1.0 ont été reconnues comme recommandations par le W3C, ce qui en fait
un langage reconnu. (Tous les documents liés à la norme XML sont
consultables et téléchargeables sur le site web du W3C,
http://www.w3c.org/XML/)
XML ?
XML est un langage d’échange de données structurés
entre applications de différents systèmes d’informations.
Les données d’un fichier XML sont organisée d’une
manière hiérarchique
Les données d’un fichier XML peuvent provenir des
bases de données relationnelles. (Documents XML
Dynamiques)
Les fichiers XML sont également utilisés en tant que
fichiers de configuration d’une application. ( Documents
XML Statiques )
Pour lire un fichier XML, une application doit utiliser un
parseur XML.
Un parseur XML est une API qui permet de parcourir un
fichier XML en vue d’en extraire des données précises.
XML est au cœur des systèmes
d’informations
Serveur d’application IIS
Application .net
Fichiers XML dont le contenu est généré
Dynamiquement et povient d’une source
De donnée comme une BD relationnelle
Serveur d’application J2EE
Application JEE
XML
SGBD
SGBD XML Parser
SQL Server
Fichier.xml
Client Leger
Ajax
Flash XML
XML Parser
Oracle
Fichier.xml Fichier.xml
Fichiers XML dont le contenu
Est créés manuellement
Pour configurer l’application
Publication multi-supports
XML
Base de
Données
Application de
publication
(XSL)
TV Numérique
Pourquoi XML ?
Middleware
XMLizer
Projet GIE Cartes Bancaires:
publication des spécifications de protocoles pour réseau Carte Bancaires
vers les fournisseurs et prestataires du GIE
Échange de données: ETL
Extractor
JDBC JDBC
Mapper
BD
relationnelle
Datawarehouse
Datamining
Pourquoi XML ?
Projet MEN : Echange de données avec
les académies (remontée et descente)
Gestion documents semi structurés
Feuille
de style
XSL
Feuille
de style
XSL
Requêtes
HTTP GET
HTTP POST
Requêtes
Mapping
XML-SQL
Processeur
XSL
Feuille
de style
XSL
HTML généré
Serveur d’Applications
Projet AMELI : Une application de
serveur XML pour la saisie et la
consultation de documents semi-structurés
par internet/intranet
Interface avec les applications
bureautiques
Amendemen
t
SGBDR
Pourquoi XML ?
XML EDI
Échange B2B XML EDI
XMLizer
Internet
(SOAP)
Donneur d’ordre
Fournisseur
Pourquoi XML ?
Projet EDIXML : Expérimentation de la
chaîne pour un grand donneur d'ordres
Forces et faiblesses de XML
 Une technologie
structurante
 Clarifie tous les échanges
 Des standards internes et
externes
 Transversale à
l'entreprise
 Échanges de données
 Bureautique
 GED
 Sites Web
 EDI
 Bases de données
 Intégration e-business
 …
 Une syntaxe bavarde
 Un méta-langage, mais de
nombreux langages
 Coûteux en CPU
 Parsing
 Coûteux en mémoire
 Instanciation
 Format compressé à l’étude
 XML Binaire
Pourquoi XML ?
Brahim ER-RAHA
 La lisibilité : aucune connaissance ne doit théoriquement être nécessaire pour
comprendre un contenu d'un document XML
 Autodescriptif et extensible
 Une structure arborescente : permettant de modéliser la majorité des problèmes
informatiques
 Universalité et portabilité : les différents jeux de caractères sont pris en compte
 Déployable : il peut être facilement distribué par n'importe quels protocoles à
de transporter du texte, comme HTTP
 Intégrabilité : un document XML est utilisable par toute application pourvue d'un
parser (c'est-à-dire un logiciel permettant d'analyser un code XML)
 Exensibilité : un document XML doit pouvoir être utilisable dans tous les domaines
I-2 Avantages de XML
Voici les principaux atouts de XML :
Brahim ER-RAHA
XML est particulièrement adapté à l'échange de données et de documents.
L'intérêt de disposer d'un format commun d'échange d'information dépend du
contexte professionnel dans lequel les utilisateurs interviennent. C'est pourquoi,
de nombreux formats de données issus de XML apparaissent (il en existe plus
d'une centaine) :
AML Astronomical Markup Language langage décrivant les différents types de
données utilisées en astronomie.
MathML Mathematical Markup Language notation mathématique sur le web
CML Chemical Markup Language pour la publication Internet des formules
chimiques, de molécules, des équations
VML Vector Markup Language langage de balisage d’information graphique
vectorielle.
PGML Precision Graphics Markup Language décrit les structures de données
graphiques complexes avec les primitives du langage Postscript. Il permet la
conversion de documents aux formats ps et pdf en XML.
SMIL Synchronized Multimedia Integration Language pour la création
multimédia, il spécifie comment et quand des éléments multimédia peuvent
apparaître dans une page web.
Brahim ER-RAHA
CDF Channel Definition Format utilisé par Microsoft pour décrire le contenu
Active Channel. Une chaîne délivre des informations directement à l’utilisateur en
utilisant la technologie push d’un serveur (envoi de contenus web à des
utilisateurs sans que ceux-ci aient besoin d’accéder spécifiquement au site). Les
chaînes fournissent des informations récentes aux utilisateurs qui peuvent
sélectionner le contenu Web qu’ils souhaitent recevoir.
RDF les applications traitant les données RDF peuvent récupérer les informations
(auteur, URL, titre, description) et créer des bases de données permettant la
recherche d’information.
WML Wireless Markup Language le langage de balisage pour l’internet mobile
Brahim ER-RAHA
XML est un format de description des données et non de leur représentation,
comme c'est le cas avec HTML. La mise en page des données est assurée par un
langage de mise en page tiers. A l'heure actuelle (fin de l'année 2000) il existe trois
solutions pour mettre en forme un document XML :
CSS (Cascading StyleSheet), la solution la plus utilisée actuellement, étant donné
qu'il s'agit d'un standard qui a déjà fait ses preuves avec HTML
XSL (eXtensible StyleSheet Language), un langage de feuilles de style extensible
développé spécialement pour XML. Toutefois, ce nouveau langage n'est pas
reconnu pour l'instant comme un standard officiel
XSLT (eXtensible StyleSheet Language Transformation). Il s'agit d'une
recommandation W3C du 16 novembre 1999, permettant de transformer un
document XML en document HTML accompagné de feuilles de style
I-3 Mise en page de XML
Brahim ER-RAHA
XML fournit un moyen de vérifier la syntaxe d'un document grâce aux DTD
(Document Type Definition). Il s'agit d'un fichier décrivant la structure des
documents y faisant référence grâce à un langage adapté. Ainsi un document
XML doit suivre scrupuleusement les conventions de notation XML et peut
éventuellement faire référence à une DTD décrivant l'imbrication des éléments
possibles.
Un document suivant les règles de XML est appelé document bien formé. Un
document XML possédant une DTD et étant conforme à celle-ci est appelé
document valide.
I-4 Structure des documents XML
Brahim ER-RAHA
XML permet donc de définir un format d'échange selon les besoins de
l'utilisateur et offre des mécanismes pour vérifier la validité du document
produit. Il est donc essentiel pour le receveur d'un document XML de pouvoir
extraire les données du document. Cette opération est possible à l'aide d'un
outil appelé analyseur (en anglais parser, parfois francisé en parseur).
Le parseur permet d'une part d'extraire les données d'un document XML (on
parle d'analyse du document ou de parsing) ainsi que de vérifier
éventuellement la validité du document.
I-5 Décodage d'un document XML
Structure d’un document XML
Un document XML se compose de 3 fichiers :
Document XML
Fichier XML DTD
Qui contient Ou
Les données Schémas XML
Pour déclarer
La structure
Du fichier XML
Feuille de style
XSL
Pour la présentation
Des données du
Fichier XML
Le fichier XML stocke les données du document sous forme d’un arbre
DTD ( Data Type Definition ) ou Schémas XML définit la structure du fichier XML
La feuille de style définit la mise en forme des données de la feuille xml
XML?
Le parseur XML permet de créer une structure
hiérarchique contenant les données contenues
dans le document XML.
Il existe deux types de parseurs XML:
◦ DOM (Document Object Model) : permet
d’accéder et d’agir d’une manière directe sur le
contenu et la structure de l’arbre XML.
◦ SAX (Simple API for XML) : permet de réagir sur le
contenu et la structure d’une document XML
pendant une lecture séquentielle.
Brahim ER-RAHA
Tout document XML se compose :
 d’un prologue, dont la présence est facultative mais conseillée. Il contiendra un
certain nombre de déclarations. Le prologue peut contenir une déclaration XML,
des instructions de traitement et une déclaration de type de document.
Syntaxe : <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
Elle indique au programme qui va traiter le document :
• la version du langage XML utilisée
• le codage de caractères utilisé dans le document ; par défaut ISO 10646 mais le
programme doit pouvoir traiter aussi l’UTF-8 et l’UTF-16.
• l’existence ou non de déclarations extérieures au document qui doivent être prise
en compte pour le traitement de celui-ci.
La déclaration est facultative mais fortement conseillée. Chacune des trois
informations est elle aussi facultative mais si elles apparaissent c’est
obligatoirement dans cet ordre.
 d’un arbre d’éléments. Il forme le contenu du document.
 de commentaires et d’instructions de traitement, dont la présence est facultative.
Ils pourront, moyennant certaines restrictions, apparaître aussi bien dans le
prologue que dans l’arbre d’éléments.
II DOCUMENT XML
Brahim ER-RAHA
exemple :
Quelques outils de travail
DTD, Schéma,
XSL, XPath
XMLMind Editor
XML Mind
DTD, Schéma,
XSL, XPath
XMLMate
Insight Soft.
Schéma
XML Junction
Data Junction
DTD, Schéma XSL,
XQuery
Oxygen
SyncRO Ltd.
DTD, Schéma XSL,
XQuery
XMLSpy
Altova
DTD, XSL, XQuery
Schéma
Turbo XML
Tibco
Support
Outil
Editeur
IDE
Exemple de document XML
<?xml version="1.0" encoding="UTF-8"?>
<biblio>
<etudiant code="1" nom="A" prenom="B" age="23">
<livre id="534" titre="java" datePret="2006-11-12" rendu="oui"/>
<livre id="634" titre="XML" datePret="2006-11-13" rendu="non"/>
</etudiant>
<etudiant code="2" nom="C" prenom="D" age="22">
<livre id="33" titre="E-Commerce" datePret="2006-1-12" rendu="non"/>
</etudiant>
</biblio> biblio
+ etudiant
@code
@nom
@prenom
@age
+ livre
@id
@titre
@datePret
@rendu
Biblio
Etudiant Etudiant Etudiant
livre livre livre
Représentation graphique de l’arbre XML
Brahim ER-RAHA
Un document XML est bien formé (l’analyseur XML peut construire son arborescence) si
il suit les règles suivantes :
a- Choisir le nom de nos propre balise
Il y a quelques règles pour la composition des noms des balises :
- Les noms peuvent contenir des lettres, des chiffres ou d'autres caractères.
- Les noms ne peuvent débuter par un nombre ou un signe de ponctuation.
- Les noms ne peuvent commencer par les lettres xml (ou XML ou Xml...).
- Les noms ne peuvent contenir des espaces.
- La longueur des noms est libre.
- On évitera certains signes qui pourraient selon les logiciels, prêter à confusion comme
"-", ";", ".", "<", ">", etc.
On profitera de cette liberté dans les noms pour les rendre le plus descriptif possible
comme par exemple <gras_et_italique>.
II-1 Documents bien formés
b- Les balises sont sensibles au majuscules et minuscules
Ainsi, la balise <Message> est différente de la balise <message>. La balise
d'ouverture et la balise de fermeture doivent donc être identiques. Ainsi par
exemple ; <Message> ... </message> est incorrect et <message> ... </message>
est correct.
Une tendance se dégage pour n'écrire les balises qu'en minuscules, limitant ainsi
les erreurs possibles.
Brahim ER-RAHA
Fini les écritures bâclées du Html où l'on pouvait dans certains cas omettre la balise
de fin comme pour le paragraphe <p> ou l'élément de liste <li>.
Les éventuelles balises uniques ou appelées aussi balises vides, comme <br>,
<meta> ou <img> en Html, doivent également comporter un signe de fermeture soit
<balise/>. Ainsi une balise <meta/> est correcte en XML.
c- Toute balise ouverte doit impérativement être fermée
Le XML étant très préoccupé par la structure des données, des balises
mal imbriquées sont des fautes graves de sens. Ainsi l'écriture suivante est
incorrecte car les balises ne sont pas bien imbriquées :
<parent><enfant>Omar</parent></enfant>
L'écriture correcte avec une bonne imbrication des éléments est :
<parent><enfant>Omar</enfant></parent>
d- Les balises doivent être correctement imbriquées.
Brahim ER-RAHA
En fait, la première paire de balises d'un document XML sera considéré
comme la balise de racine [root]. Par exemple :
<racine>
suite du document XML ...
</racine>
Par exemple :
<parents>
<enfants>
<petits_enfants> ... </petits_enfants>
</enfants>
</parents>
e- Tout document XML doit comporter une racine.
Le XML peut avoir (comme le Html) des attributs avec des valeurs. En XML, les
valeurs des attributs doivent obligatoirement être entre des guillemets, au
contraire du Html où leur absence n'a plus beaucoup d'importance. Ainsi,
l'écriture suivante est incorrecte car il manque les guillemets.
<date anniversaire=071185> La bonne écriture est :
<date anniversaire="071185">
f- Les attributs des éléments
Brahim ER-RAHA
<test>
<code xml:space="preserve">Ici les espaces ainsi
que les sauts de ligne sont préservés
</code>
<code xml:space="default"> les espaces ainsi que les sauts de ligne
sont traités suivant le mode par défaut de l'application XML.
</code>
</test>
g- Attributs prédéfinis
Exemple1 :
Exemple2 :
<test>
<code xml:lang="fr">Ici, du français</code>
<code xml:lang="fr-FR">Ici, il n'y a pas une seule
bogue</code>
<code xml:lang="fr-CA">Ici, il n'y a pas un seul
bogue</code>
<code xml:lang="en-GB">Watercolour</code>
<code xml:lang="en-US">Watercolor</code>
</test>
Brahim ER-RAHA
Un élément peut contenir d’autres éléments, des données, des références à des
entités, des sections littérales et des instructions de traitement.
Un élément peut avoir un contenu récursif, c’est à dire qu’il peut contenir une
instance du même type d’élément que lui-même.
Les données des éléments peuvent contenir tous les caractères autorisés sauf le
et commercial & et le inférieur <. Mais on peut toujours utilisé la section CDATA,
Par exemple :
<test>
<code><![CDATA[Ici on peut mettre ce que l'on
veut, < ou &, sans
problèmes, sauf la chaîne ]]>, bien sûr
</code>
</test>
h- Contenu d’un élément
Brahim ER-RAHA
Un auteur peut vouloir insérer un caractère non disponible sur sa plate-forme
ou son clavier. Il utilise pour cela le numéro du caractère dans les tables ISO
10646 ou Unicode.
Ce numéro sera précédé des caractères &# puis suivi d’un point virgule ;. Le
numéro peut être donné en décimal ou en hexadécimal (dans ce cas on le
préfixe par &#x).
Par exemple &#38; ou &#x2267; correspond au caractère et commercial &
j- Référence à des caractères ou à des idéogrammes
k- Référence à des entités prédéfinies
Il existe quelques entités prédéfinies afin de faciliter leur insertion dans un
document XML. Il s’agit notamment des caractères <, >, &, ‘ et «
&lt; <
&gt; >
&amp; &
&apos; ‘
&quot; "
Brahim ER-RAHA
Des commentaires peuvent être insérés dans les documents. Ils sont encadrés
pas les marques de début <!-- et de fin --> de commentaire.
Syntaxe : <!-- commentaire -->
Le corps du commentaire peut contenir n’importe quel caractère à l’exception de
la chaîne --. On ne peut donc pas inclure un commentaire dans un autre. Le
commentaire ne peut pas non plus être inclus à l’intérieur d’une balise.
l- Les commentaires
Brahim ER-RAHA
XML permet d'utiliser un fichier afin de vérifier qu'un document XML est conforme à
une syntaxe donnée. La norme XML définit ainsi une définition de document type
appelée DTD (Document Type Definition), c'est-à-dire une grammaire permettant
de vérifier la conformité du document XML. La norme XML n'impose pas l'utilisation
d'une DTD pour un document XML, mais elle impose par contre le respect exact
des règles de base de la norme XML.
Document Valide : pour un document XML bien formé, fait référence a une DTD
et il se conforme à elle.
Document Bien Formé : pour un document XML ne comportant pas de DTD mais
répondant aux règles de base du XML
Une DTD peut être définie de 2 façons:
sous forme interne : c'est-à-dire en incluant la grammaire au sein même du
document
sous forme externe : soit en appelant un fichier contenant la grammaire à partir
d'un fichier local ou bien en y accédant par son URL
II-2 Document XML validé
Brahim ER-RAHA
a- DTD interne
Un document valide peut inclure directement sa DTD dans sa déclaration de type.
L'attribut standalone doit prendre la valeur yes, indiquant ainsi que le document
est complet et qu'aucune déclaration externe ne doit être recherchée.
Exemple :
<?xml version="1.0" standalone="yes" ?>
<!DOCTYPE carte [
<!ELEMENT carte (#PCDATA)>
]>
<carte>As de pique</carte>
b- DTD externe
Le document peut aussi faire référence à une DTD stockée dans une entité
externe. L'avantage est alors la réutilisation possible de la DTD.
Exemple : Fichier jeu.xml
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE carte SYSTEM "carte.dtd"> Fichier carte.dtd
<carte>As de pique</carte>
II-3 Utilisation des DTD
Brahim ER-RAHA
La déclaration de type de document indique, le cas échéant, la DTD à laquelle
se conforme le document. Elle permet aussi de spécifier certaines déclarations
propres au document. La syntaxe de déclarations est :
Syntaxe : <!DOCTYPE Racine [ déclarations ]>
Racin : est le nom de l’élément racine de document XML.
Déclarations : ils contient la définition de tous les éléments constituant le
document XML. Il s’agit de :
 les éléments types, i.e. elle donne les noms de tous les éléments et leur
modèle de contenu ;
 les attributs pour chaque élément (nom, type et valeur par défaut) ;
 les entités et les notations qui servent à identifier les types spécifiques de
données externes.
1- Syntaxe d’utilisation d’une DTD
Brahim ER-RAHA
La syntaxe de déclaration d’un élément est la suivante :
<!ELEMENT nom_element modele_de_contenu>
Élément vide
Un élément vide ne contient aucun texte, aucun autre élément, comme les
éléments IMG, HR, BR de HTML.
<!ELEMENT nom_element EMPTY>
Par exemple, dans la DTD de XHTML 1.0 l’élément img est déclaré :
<!ELEMENT img EMPTY>
2 Déclaration des éléments
Élément non vide
Un élément non vide est formé d’une balise ouvrante, d’un contenu et d’une balise
fermante. Pour décrire ce contenu dans la DTD on utilise un modèle de contenu
dans la déclaration d’éléments
Brahim ER-RAHA
Données
Si l’élément contient uniquement des données (autrement dit, s’il n’y a aucun autre
élément inclus dans cet élément) on utilise le type #PCDATA qui signifie Parsed
Character DATA i.e. données caractères analysées :
<!ELEMENT nom_element (#PCDATA)>
Conteneur d’éléments
Si l’élément contient uniquement d’autres éléments, le modèle de contenu définit les
éléments pouvant être inclus dans un élément donné et spécifie également les
éléments devant apparaître obligatoirement, leur ordre et leur fréquence.
Les parenthèses dans la déclaration d’élément introduisent les éléments enfants de
l’élément défini. L’ordre dans lequel les éléments sont précisés est l’ordre dans lequel
ils doivent apparaître dans l’élément en cours de définition. Pour indiquer des choix, il
est possible d’utiliser le |.
Les indicateurs d’occurrences sont les suivants :
? = 0 ou 1 fois
* = 0 ou n fois
+ = au moins une fois
Brahim ER-RAHA
Mixte
Si l’élément a un contenu mixte (données + éléments) il est possible d’utiliser
PCDATA et les éléments imbriqués. Dans le cas d'un modèle mixte (Données
textuelles et balises)
• #PCDATA est toujours en première position
• le modèle se termine par le caractère de répétition '*‘
<!ELEMENT mixedElement (#PCDATA | inlineElement1 | inlineElement2 )*>
Élément libre
Élément qui peut contenir tout élément déclaré dans la DTD et du texte.
<!ELEMENT nom_element ANY>
O
p
é
r
a
t
e
u
r S
i
g
n
i
f
i
c
a
t
i
o
n E
x
e
m
p
l
e
+ L
'
é
l
é
m
e
n
td
o
i
tê
t
r
ep
r
é
s
e
n
ta
u
m
i
n
i
m
u
m
u
n
ef
o
i
s A
+
* L
'
é
l
é
m
e
n
tp
e
u
tê
t
r
ep
r
é
s
e
n
tp
l
u
s
i
e
u
r
sf
o
i
s(
o
u
a
u
c
u
n
e
) A
*
? L
'
é
l
é
m
e
n
tp
e
u
tê
t
r
eo
p
t
i
o
n
n
e
l
l
e
m
e
n
tp
r
é
s
e
n
t A
?
| L
'
é
l
é
m
e
n
tA
o
u
B
p
e
u
v
e
n
tê
t
r
ep
r
é
s
e
n
t
s(
p
a
sl
e
sd
e
u
x
) A
|
B
, L
'
é
l
é
m
e
n
tA
d
o
i
tê
t
r
ep
r
é
s
e
n
te
ts
u
i
v
id
el
'
é
l
é
m
e
n
tB A
,
B
(
)
L
e
sp
a
r
e
n
t
h
è
s
e
sp
e
r
m
e
t
t
e
n
td
er
e
g
r
o
u
p
e
rd
e
sé
l
é
m
e
n
t
sa
f
i
n
d
el
e
u
ra
p
p
l
i
q
u
e
rl
e
s
a
u
t
r
e
so
p
é
r
a
t
e
u
r
s
(
A
,
B
)
+
Brahim ER-RAHA
<bibliothèque>
<livre>
<titre>N ou M</titre>
<auteur>Agatha Christie</auteur>
<ref>Policier-C-15</ref>
</livre>
<livre>
<titre>Le chien des Baskerville</titre>
<auteur>Sir Arthur Conan Doyle</auteur>
<ref>Policier-D-3</ref>
</livre>
<livre>
<titre>Dune</titre>
<auteur>Franck Heckbert</auteur>
<ref>Fiction-H-1</ref>
</livre>
</bibliothèque>
Proposer une DTD qui valide ce document ?
Brahim ER-RAHA
Le rôle de la déclaration d’attributs est de donner pour un élément cible :
 les noms d’attributs permis ;
 le type de chaque attribut ;
 la valeur par défaut de l’attribut.
<!ATTLIST element_cible nom_attribut type_attribut valeur_par_défaut>
3- Déclaration d’attribut
Valeur par défaut
La valeur par défaut est la valeur prise par l’attribut si aucune valeur n’est
précisée dans l’élément. Cette valeur doit être du même type que celui donné à
l’attribut.
 "une simple chaîne de caractères"
 #REQUIRED = obligatoire, i.e. la valeur d’attribut doit être spécifiée lorsque
l’élément est utilisé dans le document
 #IMPLIED = facultatif, i.e. la valeur d’attribut peut rester non spécifiée
 #FIXED ‘val’ = fixée à ‘val’ i.e. la valeur de l’attribut est fixe et ne peut pas être
modifiée par l’utilisateur
Brahim ER-RAHA
Types de données
- chaînes de caractères CDATA
Le type d'attribut CDATA indique que la valeur de l'attribut sera une chaîne de
caractères prise littéralement, c'est à dire sans reconnaissance et traitement des
caractères spéciaux de la syntaxe XML.
<!ATTLIST element_cible nom_attribut CDATA valeur_par_défaut>
- Énumérations
<!ATTLIST element_cible nom_attribut (val1 | val2 | ... | valN) « valdefaut »>
Ce type d'attribut permet de spécifier la liste des valeurs qu'il peut prendre dans un
document. Il est également possible d'indiquer une valeur par défaut.
-Identificateurs
<!ATTLIST element_cible nom_attribut ID>
<!ATTLIST element_cible nom_attribut IDREF>
Un attribut de type ID représente un identificateur unique d’élément, i.e. un attribut
dont la valeur distingue l’élément de tous les autres dans le document XML courant
Notons que cet attribut prend généralement le nom id
Un attribut ID ne peut être que du type REQUIRED
Brahim ER-RAHA
<?xml version="1.0" encoding="UTF-8"?>
<!--DOCTYPE operateur SYSTEM "abonnementVrai.dtd"-->
<operateur>
<client code="1" nom="hassouni">
<abonnement num="123" type="GSM" dateAb="2006-1-11">
<facture numFact="432" dateFact="2006-2-11" montant="350.44" reglee="oui"/>
<facture numFact="5342" dateFact="2006-3-11" montant="450" reglee="oui"/>
<facture numFact="5362" dateFact="2006-4-13" montant="800.54" reglee="non"/>
</abonnement>
<abonnement num="2345" type="FIXE" dateAb="2006-12-1">
<facture numFact="5643" dateFact="2007-1-12" montant="299" reglee="oui"/>
<facture numFact="6432" dateFact="2007-2-12" montant="555" reglee="non"/>
</abonnement>
</client>
<client code="2" nom="abbassi">
<abonnement num="7543" dateAb="2006-12-1" type="GSM">
<facture numFact="7658" dateFact="2007-2-12" montant="350.44" reglee="oui"/>
<facture numFact="7846" dateFact="2007-3-12" montant="770" reglee="non"/>
</abonnement>
</client>
</operateur>
Un opérateur Télécom fournit périodiquement, à l’opérateur de réglementation des
télécoms ANRT un fichier XML qui contient les clients de cet opérateur. Chaque
client possède plusieurs abonnements et chaque abonnement reçoit plusieurs
factures. Un exemple de fichier XML correspondant à ce problème est le suivant :
Travail demandé
1.
2.
3.
4.
Faire une représentation graphique de l’arbre XML.
Ecrire une DTD qui permet de valider ce document XML
Créer le fichier XML
Ecrire une feuille de style XSL qui permet de transformer le document
XML en une page HTML qui permet d’afficher pour chaque client la
liste de ses abonnement en affichant le montant total des factures de
chaque abonnement
Corrigé : DTD operateur
+client
@code
@nom
+abonnement
@num
@type
@dateAb
+facture
@numFact
@dateFact
@montant
@reglee
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT operateur (client+) >
<!ELEMENT client (abonnement+) >
<!ELEMENT abonnement (facture+) >
<!ELEMENT facture EMPTY >
<!ATTLIST client
code NMTOKEN #REQUIRED
nom CDATA #REQUIRED>
<!ATTLIST abonnement
num NMTOKEN #REQUIRED
type (GSM|FIXE) 'FIXE'
dateAb CDATA #REQUIRED>
<!ATTLIST facture
numFact NMTOKEN #REQUIRED
dateFact CDATA #REQUIRED
montant CDATA #REQUIRED
reglee (oui|non) 'non'>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head></head>
<body>
<xsl:for-each select="operateur/client">
<h3>
Nom Client : <xsl:value-of select="@nom"/>
</h3>
<table border="1" width="80%">
<tr>
<th>Num</th><th>Type</th><th>Date</th><th>Total Factures</th>
</tr>
<xsl:for-each select="abonnement">
<tr>
<td><xsl:value-of select="@num"/></td>
<td><xsl:value-of select="@type"/></td>
<td><xsl:value-of select="@dateAb"/></td>
<td><xsl:value-of select="sum(facture/@montant)"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Brahim ER-RAHA
-Attribut ENTITY ou ENTITIES
Les types ENTITY et ENTITIES représentent un nom / une liste de noms d’entités
séparées par des blancs, non-XML précédemment déclarées dans la DTD.
C’est utilisé par exemple pour établir un lien avec une image.
Exemple :
<!ATTLIST image source ENTITY #REQUIRED>
<!ENTITY vacances SYSTEM " plage.gif">
qui sera utilisé dans le document XML : <image source="vacances"/>
-Attributs NMTOKEN ou NMTOKENS
Le type d'attribut NMTOKEN permet d'indiquer que l'attribut de l'élément peut prendre
comme valeur un nom symbolique composé uniquement de caractères
alphanumériques.
Exemple :
<-- Dans une DTD -->
<!ELEMENT livre EMPTY>
<!ATTLIST livre code_editeur NMTOKEN #REQUIRED>
<-- Dans le corps du document -->
<livre code_editeur="G09052" />
Brahim ER-RAHA
-Attribut NOTATION
NOTATION signifie que l’attribut attend une notation qui apparaît dans la DTD dans
une déclaration NOTATION Si une liste de valeurs est préfixée par le mot NOTATION
les notations listées comme des valeurs possibles doivent toutes avoir déjà été
déclarées :
Exemple :
<!ATTLIST image type NOTATION(GIF | JPEG | PNG) " GIF ">
4- Déclaration d’entité
Chaque entité XML est définie dans une DTD. Les entités spécifiques au document
sont présentes dans sa DTD interne (images, autres documents non XML,
caractères spécifiques).
Une entité est un alias associant un nom à un groupe de données. Ces données
peuvent prendre un ou plusieurs formats
Brahim ER-RAHA
- Entités paramètres
<!ENTITY % nom « chaîne_de_remplacement »>
Ces entités apparaissent uniquement dans les DTD. Ce sont des raccourcis vers des
parties de déclarations de la DTD.
Exemple :
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE article [
<!ENTITY % fich-dtd-1 SYSTEM "fichier-1.dtd">
<!ENTITY % fich-dtd-2 SYSTEM "fichier-2.dtd">
%fich-dtd-1;
%fich-dtd-2;
<!ENTITY % texte "#PCDATA">
<!ELEMENT nom (%texte;)>
<!ELEMENT prénom (%texte;)>
..
]>
Brahim ER-RAHA
- Entités caractères
la syntaxe de déclaration est :<!ENTITY nom "&#code;">
Les entités caractères sont des caractères réservés du XML représentés sous forme
d'entités générales afin de pouvoir les insérer dans le document XML. Voici la liste
des entités caractères principales :
Entité caractère Représentation
&amp; &
&lt; <
&gt; >
&apos; '
&quot; "
Il est également possible de définir des entités caractères pour n'importe quel
caractère en utilisant le code hexadécimal du caractère :
<! ENTITY nome "&#xCODEHEXA;">
Par exemple
<! ENTITY ccedille "&#x00E7;">
<!ENTITY CopieRight "&#169;">
<!ENTITY Delta "&#948;" >
Dans le document l’appel s’effectue avec &nom;
<code> le petit Delta est : &Delta;</code>
Brahim ER-RAHA
-Entités générales
Les entités générales permettent de définir des éléments pouvant être substitués
dans le corps du document XML (bien qu'ils soient définis au sein de la DTD et non
du document XML lui-même).
La syntaxe d'une entité générale est la suivante :
<! ENTITY nom_de_l_entite "Contenu de l'entite">
Il est par exemple possible de déclarer l'entité générale suivante dans la DTD :
<! ENTITY site "commentcamarche.net">
Les entités définies dans la DTD peuvent ainsi être utilisées dans le code XML en
les appelant avec la syntaxe suivante :
&nom_de_l_entite;
La déclaration précédente pourra donc donner un document XML du style:
<personne>
<nom>Pillou</nom>
<prenom>Jean-Francois</prenom>
<site>&site;</site>
<email>webmaster@&site;</email>
</personne>
Brahim ER-RAHA
Entités externes
Les entités générales peuvent aussi être contenues dans un fichier extérieur
(afin d'être utilisé par plusieurs DTD par exemple), on parle alors d'entité externe.
La syntaxe d'une entité externe est la suivante :
<! ENTITY nom_de_l_entite SYSTEM "nom_du_fichier">
Dans l'exemple suivant, le contenu du fichier ccm.txt (situé dans le même
répertoire que la DTD) sera inséré dans le fichier XML à chaque fois que l'entité
&ccm; sera rencontrée :
<! ENTITY ccm SYSTEM "ccm.txt">
Les entités externes représentent des données contenues dans des fichiers
séparés par rapport au document XML.
 Analysées
<!ENTITY nom SYSTEM « URL »>
Brahim ER-RAHA
<!DOCTYPE book SYSTEM « book.dtd »
[
<!ENTITY toc SYSTEM « toc.xml »>
<!ENTITY chap1 SYSTEM « chapters/c1.xml »>
<!ENTITY chap2 SYSTEM « chapters/c2.xml »>
<!ENTITY index SYSTEM « index.xml »>
]>
<book>
<head>&toc;</head>
<body>
&chap1;
&chap2;
&index;
</body>
</book>
Exemple :
Brahim ER-RAHA
Non analysées
La syntaxe de déclaration est :
<!ENTITY nom SYSTEM « URI » NDATA type_notation>
Les entités externes non analysées permettent de déclarer un contenu non XML
dans le document XML (fichiers binaires images, sons...). Ces entités requièrent
en particulier une notation. Une notation identifie le format, ou type, des
ressources auxquelles se réfère l’entité.
Voici un exemple :
<!ENTITY Image SYSTEM « Image02.Gif » NDATA GIF>
Cette déclaration d’entité signifie littéralement, l’entité Image est un fichier binaire
dans la notation GIF. Le mot clé NDATA (Notation DATA) précise le type d’entité
non analysée que le processeur XML doit traiter.
< !NOTATION GIF SYSTEM « /utils/Gifview.exe »>
indique au processeur XML
Brahim ER-RAHA
III MODELE SCHAMA XML
Dans le paragraphe précédent nous avons vu la syntaxe et la déclaration d'une DTD
au ceint d'un document XML. Néanmoins, les DTD présentent des inconvénients :
- Ce n'est pas une application XML: il utilise une syntaxe dédiée
- Les types de données sont limités
- Le contrôle du nombre d'occurrences est limité par les opérateurs ?,+,*
- Ils ne tiennent pas compte des espaces de noms (namespaces)
- La modularisation est limitée à la notion d'entité
En remplacement, le consortium W3 a défini la notion de schéma, qui utilise la
notation XML. (2 mai 2001).
Un schéma doit permettre de spécifier le même genre d'information qu'une DTD,
c'est-à-dire la syntaxe d'une classe de documents XML, en définissant les éléments et
attributs ainsi que les contraintes sur les valeurs de ceux-ci.
La validation d'un document XML au moyen d'un schéma englobe :
- La validité du modèle de contenu (structure)
- La validité des types de données
Brahim ER-RAHA
Les schémas peuvent être utilisés avec ou sans espace de nom. Sans espace de
nom associé, l'élément racine d'un schéma a la forme suivant :
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
</xs:schema>
l'assignation de ce type de document Schema dans un documnet XMLde racine
Root afin de le valider se fait comme suit :
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="modele.xsd">
</Root>
où modele est le nom du fichier contenant le schéma.
III-1 Syntaxe de Déclaration d'un Schema
1- Sans espace de nom
Brahim ER-RAHA
Si un schéma définit un espace de nom, son élément racine définit les attributs
suivants :
-targetNamespace="URI", pour définir l'espace de nom dans lequel le schéma définit
ses éléments
-xmlns="URI", l'espace de nom par défaut (souvent identique à targetNamespace)
-elementFormDefault et attributeFormDefault pour déterminés si les éléments
(resp. les attributs), par défaut, sont qualifiés
l'assignation de ce type de document Schema dans un document XML de racine Root
afin de le valider se fait comme suit :
<Root xmlns="URI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance“
xsi:schemaLocation="URI Modele.xsd">
</Root>
2- Schéma avec espace de nom
Brahim ER-RAHA
Voir le dossier Exemple cours XML
Brahim ER-RAHA
Les éléments sont les principaux composant d'un document schema.
 Un élément ne contenant pas de sous-élément ni d'attribut est considéré
comme étant de type simple (p.ex. <auteur>Bertrand Ibrahim</auteur>).
 Un élément contenant soit des sous-éléments (p.ex. <titre> Un journaliste
<souligne> accuse </souligne>, ...</titre>), soit des attributs, ou même les deux
à la fois est considéré de type complexe.
Il y a trois formes de déclaration d'élément
- <xs:element name=" LeNomDeMonElement ">
... simple or complex type definition
</xs:element>
- <xs:element name="LeNomDeMonElement" type="LeTypeDeContenuDeCetElement "/>
-<xs:element ref=" LeNomDeMonElement "/>
Avec name représente le nom de l'élément et type détermine le type de son contenue
III-1 Déclaration des éléments dans un Schema
Brahim ER-RAHA
Les éléments peuvent avoir un continue simple de l'un des tes types prédéfinis
suivants :
string, boolean, byte, int, integer, long, float, double, date, time, Name (un nom
conforme à XML), anyURI
Exemple :
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="Prix" type="xs:decimal"/>
</xs:schema>
<Prix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:Untitled2.xsd">192.25</Prix>
----------------------------------------------------------------------------------------------------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="DateNaissance" type="xs:date"/>
</xs:schema>
<DateNaissance xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="C:Untitled3.xsd">1923-12-05</DateNaissance>
a- Définition des types simples
a-1 Type simple prédéfini
Les types simples (1)
 string
 Confirm this is electric
 normalizedString
 Confirm this is electric
 token
 Confirm this is electric
 byte
 -1, 126
 unsignedByte
 0, 126
 base64Binary
 GpM7
 hexBinary
 0FB7
 integer
 -126789, -1, 0, 1, 126789
 positiveInteger
 1, 126789
 negativeInteger
 -126789, -1
 nonNegativeInteger
 0, 1, 126789
 nonPositiveInteger
 -126789, -1, 0
 int
 -1, 126789675
 unsignedInt
 0, 1267896754
Schema
Les types simples (2)
 long
 -1, 12678967543233
 unsignedLong
 0, 12678967543233
 short
 -1, 12678
 unsignedShort
 0, 12678
 decimal
 -1.23, 0, 123.4, 1000.00
 float
 -INF, -1E4, -0, 0, 12.78E-2, 12,
INF, NaN
 double
 -INF, -1E4, -0, 0, 12.78E-2, 12,
INF, NaN
 boolean
 true, false 1, 0
 time
 13:20:00.000, 13:20:00.000-
05:00
 dateTime
 1999-05-31T13:20:00.000-
05:00
 duration
 P1Y2M3DT10H30M12.3S
 date
 1999-05-31
 gMonth
 --05--
 gYear
 1999
Schema
Les types simples (3)
 gYearMonth
 1999-02
 gDay
 ---31
 gMonthDay
 --05-31
 Name
 shipTo
 QName
 po:USAddress
 NCName
 USAddress
 anyURI
 http://www.example.com/,
 http://www.example.com/doc.html#ID
5
 language
 en-GB, en-US, fr
 ID
 "A212"
 IDREF
 "A212"
 IDREFS
 "A212" "B213"
 ENTITY
 ENTITIES
 NOTATION
 NMTOKEN, NMTOKENS
 US
 Brésil Canada Mexique
Schema
Brahim ER-RAHA
Les types simples personnalisés peuvent être utilisés soit :
 Localement
<xs:element name="myelt">
<xs:simpleType>
definition de type
</xs:simpleType>
</xs:element>
Globalement et réutilisés
<xs:simpleType name="mytype">
definition de type
</xs:simpleType>
La dérivation de ces types à partir des types prédéfinis se fait soit par :
- Restriction (en utilisant des facettes de contrainte)
- List
- Union
- Extension
a-2 Type simple personnalisé (dérivé)
et le déclaration de type dans l'élément se
fait par:
<xs:element name="myelt" type="mytype"/>
Brahim ER-RAHA
1- Restriction
Une restriction limite les valeurs possibles d'un type donné (appelé type de base) et est
définie sur certaines propriétés du type de base, appelées facettes de contraintes
dont les valeurs les plus utilisés sont :
-length (longueur de chaîne) ou minLength et maxLength (bornes inf. et sup. de la
langueur)
- pattern (expression régulière)
- enumeration (ens. de valeurs)
- minInclusive, maxInclusive , minExclusive, maxExclusive (bornes des valeurs)
- totalDigits (nombre de chiffres d'un nb. entier)
-fractionalDigits (nombre de chiffres significatifs pour la partie décimale)
la facette pattern permet de contraindre la forme lexicale à l'aide d'une expression
régulière (en perl)
- [abc] désigne les lettres a, b, c
- [a-z] désigne les lettres allant de a à z
- ^[abc] signifie toutes les lettres sauf a, b, c
- E? signifie 0 ou 1 fois
- E* signifie 0 ou plusieurs fois
- E+ signifie 1 ou plusieurs fois
- E{n,m} signifie entre n et m fois
- E{n} signifie exactement n fois
- E|F signifie soit E soit F
-  sert de caractère d'échappement
Brahim ER-RAHA
<xsd:simpleType name="Code">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="1000" />
<xsd:maxInclusive value="9999" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="AA" type="Code"/>
<AA> 9999 </AA>
<xsd:simpleType name="JourDeSemaine">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="lundi" />
<xsd:enumeration value="mardi" />
<xsd:enumeration value="mercredi" />
<xsd:enumeration value="jeudi" />
<xsd:enumeration value="vendredi" />
<xsd:enumeration value="samedi" />
<xsd:enumeration value="dimanche" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="AA" type="JourDeSemaine"/>
<AA> lundi </AA>
<xsd:simpleType name="Date"> <xsd:restriction
base="xsd:string"><xsd:pattern value="d{2}-
d{2}-d{4}"/>
</xsd:restriction></xsd:simpleType>
<xsd:element name="AA" type="Date"/>
<AA> 23-05-1998 </AA>
<xsd:simpleType name="code"> <xsd:restriction
base="xsd:string"><xsd:pattern value="[A-Za-z]{6}-
d{2}"/> </xsd:restriction></xsd:simpleType>
<xsd:element name="AA" type="code"/>
<AA> Agadir-25 </AA>
<xs:simpleType name="type-no-tel">
<xs:restriction base="xs:string">
<xs:pattern
value="0[1-9]{1,2} [0-9]{3} [0-9]{3}" />
</xs:restriction>
</xs:simpleType>
<xsd:element name="AA" type="type-no-yel"/>
<AA> 066 000 000 </AA>
<xs:simpleType name="AS">
<xs:restriction base="xs:float">
<xs:totalDigits value="4"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="AA" type="AS"/>
<AA> 12.56 </AA>
Brahim ER-RAHA
2- List
La liste permet de définir un nouveau type à partir d'un type de base, où une valeur du nouveau
type correspond à plusieurs valeurs du type de base séparées par un espace. Exemple :
<xsd:simpleType name="Ville">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Agadir"/>
<xsd:enumeration value="Fes"/>
<xsd:enumeration value="Casa"/>
<xsd:enumeration value="Rabat"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ListeVille"> <xsd:list
itemType="Ville"/></xsd:simpleType>
<xsd:element name="villes" type="ListeVille"/>
<villes>Agadir </villes>
3- Union
L'union permet de définir un nouveau type incluant toutes les valeurs possibles d'un certain
nombre d'autres types. Par exemple :
<xsd:simpleType name="JourDeSemaine">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="lundi" />
<xsd:enumeration value="mardi" />
<xsd:enumeration value="mercredi" />
<xsd:enumeration value="jeudi" />
<xsd:enumeration value="vendredi" />
<xsd:enumeration value="samedi" />
<xsd:enumeration value="dimanche" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="AbregeSemaine">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="lu" />
<xsd:enumeration value="ma" />
<xsd:enumeration value="me" />
<xsd:enumeration value="je" />
<xsd:enumeration value="ve" />
<xsd:enumeration value="sa" />
<xsd:enumeration value="di" />
</xsd:restriction>
</xsd:simpleType
Brahim ER-RAHA
<xsd:simpleType name="JrSemaine">
<xsd:union memberTypes="JourDeSemaine AbregeSemaine" />
</xsd:simpleType>
<xsd:element name="AA" type="JrSemaine"/>
<AA> Lundi lu </AA>
le type JrSemaine ci-dessous est défini à partir des types JourDeSemaine et
AbregeSemaine définis précédemment et correspond à une chaîne de caractères
indiquant un jour de la semaine ou un abrégé de jour de la semaine
4- Extension
Une extension consiste à définir un nouveau type à partir d'un type existant en lui
ajoutant éventuellement des sous-éléments et/ou des attributs. Une extension produit
donc toujours un type complexe. On en verra des exemples plus loin
Brahim ER-RAHA
Un type complexe est défini à l'aide de l'élément <xsd:complexType name="..."> qui
pourra contenir, entre autres, une séquence d'éléments, une série d'attributs, etc. On
définit d'abord les sous-éléments, puis les attributs.
Comme les types simples, les types complexe peuvent être utilisés soit:
 localement
<xs:element name="myelt">
<xs:complexType>
definition de type
</xs:complexType>
</xs:element>
Un type complexe est définit à l'aide de compositeurs (règles de composition), il existe
trois sortes de compositeurs :
-<xs:sequence> : les sous-éléments énumérés doivent être tous présents dans l'ordre
indiqué
-<xs:choice> : un seul des sous-éléments énumérés doit être présent (exclusion
mutuelle)
-<xs:all> : les sous-éléments énumérés doivent être tous présents au plus une fois,
dans n'importe quel ordre. Les attributs minOccurs et maxOccurs doivent
valoir 0 ou 1.
b- Définition de types complexes
 globalement et réutilisés
<xs:complexType name="mytype">
definition de type
</xs:complexType>
<xs:element name="myelt" type="mytype"/>
Brahim ER-RAHA
Les attributs minOccurs et maxOccurs contrôlent les occurrences d'apparition
d'un élément, par défaut, minOccurs="1" et maxOccurs="1" et en particulier
minOccurs="0" signifie qu'il est optionnel et maxOccurs="unbouded" signifie qu'il est
répétitif. Ces attributs peuvent être utilisés dans une définition d'élément <element
...> et aussi dans les compositeurs (sequence, choice, all)
b-1 contenu composé uniquement de sous-éléments
Compositeur déclaration du type document XML
valide
sequence <xsd:complexType name="EnteteType" >
<xsd:sequence>
<xsd:element name="titre" type="xsd:string" />
<xsd:element name="auteur" type="xsd:string" />
<xsd:element name="date" type="xsd:string" />
<xsd:element name="lieu" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="entete" type="EnteteType" />
<entete>
<titre>...</titre>
<auteur>...</auteur>
<date> …</date>
<lieu>…</lieu>
</entete>
Brahim ER-RAHA
<xsd:complexType name="EnteteType" >
<xsd:sequence minOccurs=2>
<xsd:element name="titre" type="xsd:string" />
<xsd:element name="auteur" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="entete" type="EnteteType" />
<entete>
<titre>...</titre>
<auteur>...</auteur>
<titre> …</titre>
<auteur>…</auteur>
</entete>
sequence
Brahim ER-RAHA
<xsd:complexType name="EnteteType" >
<xsd:sequence minOccurs=2>
<xsd:element name="titre" type="xsd:string" minOccurs=2/>
<xsd:element name="auteur" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="entete" type="EnteteType" />
<entete>
<titre>...</titre>
<titre>….</titre>
<auteur>...</auteur>
<titre> …</titre>
<titre>….</titre>
<auteur>…</auteur>
</entete>
Brahim ER-RAHA
<xsd:complexType name="EnteteType" >
<xsd:choice minOccurs=2>
<xsd:element name="titre" type="xsd:string" />
<xsd:element name="auteur" type="xsd:string" />
</xsd:choice>
</xsd:complexType>
<xsd:element name="entete" type="EnteteType" />
<entete>
<titre>...</titre>
<auteur>…</auteur>
</entete>
Choice
Brahim ER-RAHA
<xsd:complexType name="EnteteType" >
<xsd:choice minOccurs="2">
<xsd:element name="titre" type="xsd:string" minOccurse="2" />
<xsd:element name="auteur" type="xsd:string" />
</xsd:choice>
</xsd:complexType>
<xsd:element name="entete" type="EnteteType" />
<entete>
<titre>...</titre>
<titre>….</titre>
<auteur>...</auteur>
</entete>
Brahim ER-RAHA
<xsd:complexType name="EnteteType" >
<xsd:all minOccurs="1">
<xsd:element name="titre" type="xsd:string" minOccurse="1" />
<xsd:element name="auteur" type="xsd:string" />
</xsd:choice>
</xsd:complexType>
<xsd:element name="entete" type="EnteteType" />
<entete>
<titre>...</titre>
<auteur>...</auteur>
<auteur> …</auteur>
<titre>….</titre>
<auteur>…</auteur>
</entete>
minOccurs ou maxOccurs de et de ses elements n’accepte que 0 ou 1
all
Brahim ER-RAHA
b-2 contenu composé uniquement d'attributs (Element vide)
On commence par déclaration du type:
<xsd:complexType name="ImageType">
<xsd:attribute name="src" type="xsd:anyURI" />
</xsd:complexType>
b-3 Exemple de contenu composé d'un contenu simple et d'attributs
Pour indiquer qu'un élément est composé d'un continu simple on utilise
l'élément s:simpleContent avec l'élément de dérivation xs:extension
comme il est monté sur les exemples suivants:
Brahim ER-RAHA
 Déclaration de type :
<xsd:element name="price">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:decimal">
<xsd:attribute name="currency" type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
 déclaration d'un élément de ce type:
<xsd:element name="prix" type="PrixType" />
 utilisation de l'élément dans un document XML:
<prix currency="EUR">423.46</prix>
Brahim ER-RAHA
 déclaration du type :
<xsd:simpleType name="NombreDeuxDecimales">
<xsd:restriction base="xsd:decimal">
<xsd:fractionDigits value="2"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="PrixType">
<xsd:simpleContent>
<xsd:extension base="NombreDeuxDecimales">
<xsd:attribute name="monaie" type="xsd:string" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
 déclaration d'un élément de ce type:
<xsd:element name="prix" type="PrixType" />
 utilisation de l'élément dans un document XML:
<prix monaie="CHF">3.50</prix>
Brahim ER-RAHA
b-4 Exemple de contenu composé de caractères et de sous-éléments (utilisation
de l'attribut mixed="true")
Pour indiquer qu'un élément est d'un continu composé on utilise l'attribut mixed="true"
de l' élément xs:complexType.
 déclaration du type :
<xsd:complexType name="TexteType" mixed="true">
<xsd:sequence>
<xsd:element name="grand" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
 déclaration d'un élément de ce type :
<xsd:element name="texte" type="TexteType" />
De par l'attribut mixed de l'élément xsd:complexType, l'élément texte pourra contenir du
texte aussi bien qu'un nombre indéterminé de sous-éléments grand. De par sa
déclaration, l'élément grand ne peut contenir que du texte simple.
Brahim ER-RAHA
Pour illustrer la définition d'attributs, reprenons l'exemple suivant :
<article titre="Un journaliste accuse, un policier dément" auteur="Alain Connu"
date="14 juin 1972" lieu="banquise">...</article>
Le schéma correspondant serait :
<xsd:element name="article" >
<xsd:complexType>
... <!-- les attributs doivent être déclaré après les sous-éléments -->
<xsd:attribute name="titre" type="xsd:string" />
<xsd:attribute name="auteur" type="xsd:string" use="required" />
<xsd:attribute name="date" type="xsd:date" use="required" />
<xsd:attribute name="lieu" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
Dans une déclaration d'attribut, l'attribut use peut prendre les valeurs suivantes
c-Définitions d'attributs dans un type complexe
valeur de l'attribut use signification
prohibited l'attribut ainsi défini ne doit pas apparaître
optional l'attribut peut apparaître au plus une fois
required l'attribut doit apparaître
Brahim ER-RAHA
Si l'attribut use n'est pas utilisé, la valeur par défaut est optional.
fixed et default ne peuvent pas être utilisés simultanément
d- Définition de groupes d'attributs
Les groupes d'attributs permettent de regrouper plusieurs déclarations d'attributs, la syntaxe
d'utilisation est :
<xs:attributeGroup name="N1" ...>
définition des attributs
</xs:attributeGroup>
Ensuite, ils peuvent être utilisés ensemble
<xs:attributeGroup ref="N1"/>
Exemple: groupe d'attributs
<xs:attributeGroup name="books">
<xs:attribute name="pubisher" type="xs:string">
<xs:attribute name="isbn" type="xs:string">
</xs:attributeGroup>
autres attributs signification
fixed
si l'attribut ainsi défini est présent dans la balise, il ne peut prendre que la valeur associée à
fixed. Exemple:
<xsd:attribute name="..." type="xsd:decimal" fixed="0" />
default
l'attribut peut ne pas être défini, auquel cas il prendra une valeur par défaut. Exemple:
<xsd:attribute name="..." type="xsd:decimal" default="10" />
<xs:element ...>
<xs:attributeGroup ref="books">
</xs:element>
Brahim ER-RAHA
e- Annotations
Les annotations <xs:annotation> permettent d'ajouter des informations pour :
- l'utilisateur (humain) <xs:documentation>
- une application (machine) <xs:appInfo>
f- Définition de groupes modèles
Les groupes modèles permettent de définir des composants de schéma, la syntaxe
d'utilisation est :
<xs:group name="myGroup">
... composition
</xs:group>
et de les réutiliser comme suis :
<xs:complexType>
<xs:group ref="myGroup">
</xs:complexType>
Application
Un service d’envoi des mandats établit
mensuellement un rapport qui contient
les mandats envoyés. Chaque mandat
concerne un expéditeur et un
destinataire. L’expéditeur est défini par
son cin, son nom, son prénom et sa ville.
Le destinataire est défini également par
son cin, son nom, son prénom et sa ville.
Application
Un exemple de fichier XML correspondant à ce problème est le suivant :
<?xml version="1.0" encoding="UTF-8"?>
<rapport>
<mandat num="7124536" date="2007-1-1" montant="1000" etat="reçu">
<expediteur cin="A123245" nom="slimani" prenom="youssef" ville="casa"/>
<destinataire cin="P98654" nom="hassouni" prenom="laila" ville="fes"/>
</mandat>
<mandat num="7124537" date="2007-1-1" montant="3200" etat="non reçu">
<expediteur cin="M123245" nom="alaoui" prenom="mohamed" ville="marra
<destinataire cin="M92654" nom="alaoui" prenom="imane" ville="casa"/>
</mandat>
<mandat num="7124538" date="2007-1-2" montant="500" etat="reçu">
<expediteur cin="H123222" nom="qasmi" prenom="slim" ville="oujda"/>
<destinataire cin="B91154" nom="qasmi" prenom="hassan" ville="rabat"/>
</mandat>
</rapport>
Travail à faire
Faire une représentation graphique de l’arbre XML
Ecrire une DTD qui permet de déclarer la structure du document XML
Ecrire le schéma XML qui permet de déclarer la structure du document
XML
Créer le fichier XML valide respectant ce schéma.
Ecrire une feuille de style XSL qui permet de transformer le document
XML en document HTML suivant :
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
L’utilisation d’une feuille de style est obligatoire en XML pour contrôler la mise en page
du document, en effet un document XML ne contient que des informations sur la
structure, aucune information relative à la mise en page n’apparaît dans le document.
Il est possible d’utiliser pour présenter un document XML les feuilles de style CSS ou
les feuilles de style XSL (eXtensible StylesheetLanguage). Ces dernières sont issues
de DSSSL (Document Style Semantics and Specification Language) la norme
internationale ISO 10179 de feuilles de style pour les documents SGML
A l'heure actuelle il existe trois solutions pour mettre en forme un document XML :
CSS (Cascading StyleSheet), la solution la plus utilisée actuellement, étant donné qu'il
s'agit d'un standard qui a déjà fait ses preuves avec HTML
XSL (eXtensible StyleSheet Language), un langage de feuilles de style extensible
développé spécialement pour XML. Toutefois, ce nouveau langage n'est
pas reconnu pour l'instant comme un standard officiel
XSLT (eXtensible StyleSheet Language Transformation). Il s'agit d'une
recommandation W3C du 16 novembre 1999, permettant de transformer
un document XML en document HTML accompagné de feuilles de style
IV- Mise en page d'un document XML
Brahim ER-RAHA
Les cascading style sheets ont été initialement conçues pour le langage HTML. La
première version du standard, dite CSS niveau 1, a été publiée en 1996. En mai 1998,
le consortium W3 a publié une nouvelle version dite CSS niveau 2 qui introduit des
possibilités nouvelles par rapport a CSS-1.
CSS est un mécanisme puissant et relativement complexe et on a plusieurs manières
de procéder :
1- En incluant en-tête de page HTML les styles que l'on souhaite employer dans la
page en question.
2- En écrivant une feuille de style dans un fichier séparé. Et Cette seconde solution
est celle qui a été retenue pour l'utilisation avec XML
IV-1 feuilles de style CSS.
Cela s'écrit de la façon suivante :
<?xml version='1.0'?>
<?xml-stylesheet href="FeuilleDeStyle.css" type="text/css" ?>
Brahim ER-RAHA
Une feuille de style CSS se compose de règles de style qui s'appliquent à un ou
plusieurs éléments du document traité, voire à une partie seulement d'un élément
(première ligne ou première lettre). Chaque règle est composée d'un sélecteur qui
indique quels sont les éléments auxquels elle s'applique, et d'une ou plusieurs
propriétés qui décrivent les conditions de rendu physique de cet élément.
Syntaxiquement, une règle se présente ainsi :
Sélecteur {propriété:valeur; propriété:valeur}
Le nombre de couples "proriété-valeur" contenus dans la régle n'est pas limité. Une
règle très simple pour définir le formatage des éléments titre peut s'écrire :
Titre { font-weight:bold;
Font-size:14pt;
Font-family:Garamond;
Font-style: normal}
Des règles de style alternatives peuvent être définies pour un même élément en fonction
*de type de média visé. Par exemple, une feuille de style spécifiera que le contenu des
éléments titre doit être réalisé en police Garmond 10 points pour le type média Print, et
en police Arial 12 points pour le type de media Screen.
Toutes les feuilles de style CSS sont insensibles à la casse
1- Principe de base
Brahim ER-RAHA
Pour chaque propriété définie pour un élément, il est possible d’indiquer si sa valeur
doit être héritée par les éléments descendants du premier. Soit par exemple un
document dont l’élément racine est article, la règle suivante :
Article {background : yellow}
Réalisera tous les éléments du document sur fond jaune, sauf ceux pour les quels
une règles plus spécifique serait indiquée dans la suite de la feuille de style.
Exemple, cette feuille de style :
Article { font-size: 10pt } titre { font-size: 120% }
et cet extrait d'un document :
<Article> <Titre>Un <EM>grand</EM> titre</Titre></Article>
Ici, la propriété 'font-size' de l'élément Titre aura une valeur calculée de '12pt' (120%
de la valeur de son parent). Et, comme la valeur de la propriété 'font-size' est héritée,
la valeur calculée pour l'élément EM sera aussi '12pt'.
Quelque fois, on utilise la valeur Inherit qui signifie que pour un élément donné, la
propriété de cet élément prend la même valeur calculée que pour celle de son parent.
La valeur héritée qui est normalement utilisée comme une valeur refuge, peut être
renforcée par une valeur 'inherit' explicite.
2-Héritage
Brahim ER-RAHA
La règle '@import', placée impérativement en tête de la feuille de style avant toute
règle de formatage, permet aux utilisateurs l'importation de règles de style à partir
d'une autre feuille de style. Le mot-clé '@import' doit être suivi de l'URI de la feuille de
style à intégrer.
Les lignes suivantes ont une signification équivalente et illustrent les deux syntaxes
(celle avec "url()" et celle avec une simple chaîne) :
@import "mystyle.css";
ou @import url("mystyle.css");
@import “http://foo.bar.org/somestyle.css”;
Les feuilles de styles importées et enveloppées dans une règle @media produiraient
les mêmes effets, avec ce média, que les feuilles de style suivantes,
@import url("fineprint.css") print;
@import url("bluish.css") screen, tv;
Si le type de média n'est pas précisé, l'import est inconditionnel. De même, si on
spécifie le type de média 'all'
3- Importation des règles
Brahim ER-RAHA
Toute règle peut se voir affecter un niveau de priorité parmi deux valeurs possibles.
Par défaut, elles ont toutes le niveau « normale ». Une règle dont on souhaite
quelle ait priorité sur une autre règle concurrente peut avoir le niveau important.
Cela s’indique de la façon suivante :
Sélecteur {propriété : valeur !important}
Lorsque plusieurs règles s’appliquent à un élément si l’une d’entre elle est spécifiée
avec l’indicateur !important elle a priorité sur une règle normale.
En fin, les règles importées par @import participent aussi à la cascade des
propriétés : à niveau d’importance égale, les règles locales définies dans la feuille
de style ont la priorité sur les règles importés.
4- La cascade
Brahim ER-RAHA
Exemple :
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="css.css"?>
<ARTICLE> voila un exemple d’article
<HEADLINE>La rencontre de Frédéric le Grand et de Bach</HEADLINE>
<AUTHOR>Johann Nikolaus Forkel</AUTHOR>
<PARA>
Un soir, alors qu'il préparait sa
<INSTRUMENT>flûte</INSTRUMENT> et que ses
musiciens étaient réunis, un officier lui apporta
la liste des étrangers qui venaient d'arriver.
</PARA>
</ARTICLE>
Fichier css.css
@import url("im.css");
article {
color: #ff45ee;
background: green !important;
}
Fichier im.css
article {
color: red !important;
background: yellow ;
}
Brahim ER-RAHA
4- Types Médias
Une des fonctions primordiales des feuilles de style repose sur le fait de pouvoir
spécifier comment représenter un document (réalisation physique d’un document) pour
différents médias : un écran, une feuille de papier, un synthétiseur de parole, un appareil
(TV). Pour spécifier les règles propres à chaque type de media, trois méthodes
complémentaires sont possibles.
 La première consiste à réaliser une feuille de style différente par type de média visé.
 La seconde méthode consiste à déclarer les différentes règles dans une même
feuille en les regroupant dans des sections spécifiques
@media print { article { font-size: 10pt }
@media screen { article { font-size: 12pt } }
@media screen, print { article { line-height: 1.2 } }
 La troisième méthode consiste à réaliser une feuille de style différente
contenant les déclarations propres à chaque style, et à réaliser en outre une
feuille de style contenant les règles communes à l’ensemble des médias visés.
Plus des règles d’importation des feuilles spécifiques ; en indiquant à quels types
de médias elles correspondent.
Brahim ER-RAHA
Les types de médias reconnus sont :
All : convient pour tous les appareils ;
Aural : destiné aux synthétiseurs de parole.
Handheld : destiné aux appareils portatifs (typiquement ceux avec petits
écrans, monochromes et à bande passante limitée).
Print : destiné à un support paginé opaque et aux documents vus sur
écran en mode aperçu avant impression.
Projection : destiné aux présentations en projection, par exemple avec
des projecteurs ou des impressions pour des transparents
screen : destiné principalement aux moniteurs couleurs.
tv : destiné aux appareils du type télévision (avec ces caractéristiques :
basse résolution, couleur, défilement des pages limité, sonorisé).
@import “style-papier.css” print;
@import “style-papier.css” screen ;
@media screen, print { ici les régles valides pour les deux types }
Brahim ER-RAHA
5- Les commentaires
Dans les feuilles de style les commentaires sont de la même façons que dans les
langages de programmation C ou Java.
Syntaxe est /* Ecrire Commentaire */
Exemple :
@media print {titre { color:red;font-size: 10pt } /*la couleur de contenu est rouge ici*/
@media screen {titre{ color:green;font-size:12pt }/* la couleur de contenu est vert ici*/
Brahim ER-RAHA
Motif Signification Décrit au chapitre...
* Correspond à tout élément. Sélecteur universel
E Correspond à tout élément E (c.à.d., un élément de type E). Sélecteurs de type
E F Correspond à tout élément F qui est un descendant de l'élément E. Sélecteurs descendants
E > F Correspond à tout élément F aussi un enfant de l'élément E. Sélecteurs d'enfant
E:first-child
Correspond à un élément E aussi le premier enfant de son élément
parent.
La pseudo-classe :first-
child
E,F,G Groupement des éléments F, E et G Sélecteurs de type
E:lang(c)
Correspond à l'élément de type E qui emploie une langue c (la
détermination de cette langue est spécifique au langage du
document).
La pseudo-classe :lang()
E + F
Correspond à tout élément F immédiatement précédé par un élément
E.
Les sélecteurs adjacents
E[foo]
Correspond à tout élément E avec l'attribut "foo" (quelles qu'en
soient les valeurs).
Sélecteurs d'attribut
E[foo="warni
ng"]
Correspond à tout élément E dont l'attribut "foo" a exactement la
valeur "warning".
Sélecteurs d'attribut
E[foo~="warn
ing"]
Correspond à tout élément E dont l'attribut "foo" a pour valeur une
liste de valeurs séparées par des blancs et dont une de celles-ci est
"warning".
Sélecteurs d'attribut
E[lang|="en"]
Correspond à tout élément E dont l'attribut "lang" a pour valeur une
liste de valeurs séparées par des tirets, cette liste commençant (à
gauche) par "en".
Sélecteurs d'attribut
6- Sélecteurs d’éléments : Les sélecteurs d’éléments disponibles en CSS sont :
Brahim ER-RAHA
-Pa > el [att= "foo "] {propriété : valeur} sélectionne tout élément el ayant
l’attribut att= "foo ", et fils d’un élément pa.
- pa [att="bar"]>* {propriété : valeur}sélectionne n'importe quel élément (*), fils
d'un élément pa, et doté de l'attribut att="bar".
Exemple :
7- Propriétés
7-1 Dimension
Lorsque on exprime la dimension (hauteur, largeur, épaisseur, distance) d'une
propriété, celle-ci est généralement indiquer à l'aide d'une unités absolues ou
relatives:
Les unités absolues sont :
- in : pouce, soit 2,54 cm
- cm : centimètre
- mm : millimètre
- pt : point typographique
- pc : pica (=12 points)
Les unités relatives sont :
- em : égale à la taille de la police courante.
- ex : égale à la hauteur de glyphe dans la police
courante
Brahim ER-RAHA
7-2 Couleur
Les propriétés CSS permettent aux auteurs la spécification d'une couleur d'avant-
plan et d'arrière-plan pour un élément.
 La couleur d'avant-plan : la propriété ‘color’
Cette propriété décrit la couleur d'avant-plan du contenu de texte d'un
élément. Voici plusieurs façons d'indiquer la couleur rouge :
EM { color: red } /* nom de couleur prédéfini */
EM { color: rgb(255,0,0) } /* couleurs en RGB allant de 0 à 255 */
EM { color: #FF0000 } /* couleurs en code héxadécimal */
 L'arrière-plan
Les propriétés d'arrière-plan :
'background-color', : mettre une couleur en arrière plan
'background-image' : ajouter une image en arrière plan
Brahim ER-RAHA
'background-repeat' : Quand on spécifie une image d'arrière-plan, cette propriété
indique si l'image est répétée (apposée) et la manière de la répétition. Les
significations des valeurs sont :
repeat : L'image se répète à la fois horizontalement et verticalement ;
repeat-x : L'image ne se répète qu'horizontalement ;
repeat-y : L'image ne se répète que verticalement ;
no-repeat : L'image ne se répète pas : un seul exemplaire de celle-ci est dessiné
'background-attachment' : Quand on spécifie une image d'arrière-plan, cette
propriété indique si l'image est fixe par rapport à la zone de visualisation (pour la
valeur 'fixed'), ou si celle-ci défile en même temps que le document (pour la valeur
'scroll')
'background-position' : Quand on spécifie une image d'arrière-plan, cette propriété
indique la position initiale de celle-ci. Les valeurs de cette propriété sont :
top left et left top
Identique à '0% 0%' ;
top, top center et center top
Identique à '50% 0%';
right top et top right
Identique à '100% 0%' ;
bottom left et left bottom
Identique à '0% 100%' ;
bottom, bottom center et center bottom
Identique à '50% 100%'
left, left center et center left
Identique à '0% 50%' ;
center et center center
Identique à '50% 50%' ;
right, right center et center right
Identique à '100% 50%' ;
Brahim ER-RAHA
7-3 Police
Les propriétés de police de CSS décrivent l'apparence souhaitée pour le texte dans le
document, on distingue :
 famille de polices : la propriété 'font-family' : cette propriété donne une liste, par
ordre de priorité, de noms de familles de polices, exemple :
BODY { font-family: Baskerville, "Heisi Mincho W3", Symbol, serif }
La police "Baskerville" va fournir les glyphes pour les caractères latins, la police "Heisi
Mincho W3", ceux pour les caractères japonais, la police "Symbol", ceux pour les
symboles mathématiques, et la famille de polices générique 'serif', ceux éventuels
d'autres caractères.
 style de police : pour déterminer le style de police, on utilise 3 propriétés :
font-style : La propriété 'font-style' sélectionne, parmi les polices d'une famille de
polices, celles avec un dessin normal, italique et oblique.
font-variant : qui prend deux valeurs normal ou small-caps (lettre en petit
majiscule)
font-weight : La propriété 'font-weight' spécifie la graisse de la police. Les
significations des valeurs sont : Normal et bold
taille de police : la propriété utilisé et font-size ces valeurs sont : xx-small | x-
small | small | medium | large | x-large | xx-large ou directemet
par une valeur réelle comme 12 pt.
Brahim ER-RAHA
7-4 Formatage de texte
word-spacing : espacement entre les mots (en pt)
letter- spacing:espacement entre les lettres (en pt)
text-decoration: {none, underline, overline, blink} blink : le text clignote
vertical-align: ajuster l'alignement vertical d'un élément
text-transform : {u uppercase, l lowercase}
text-align : { left, right, center, j justify}
text-indent : fixe l'indentation de la première ligne d'un bloc de texte
7-5 modèle de boite
La mise en boite de continue d'un élément se fait par la propriété Display, ces
valeurs sont : Block : boite de type bloc
Inline : boite en ligne
- width : la largeur de bloc
- height : la hauteur de bloc
-margin-top, margin-right, margin-left, margin-bottom : définissent les largeurs
des quatre marges.
-padding, padding-top,…, padding-bottom : déterminent les épaisseurs des
quatres cotés de la boite.
- Border-width, border-top-width,.. : définissent l'épaisseur de la bordure.
- Border-color, Border-top-color,… : définissent la couleur de la bordure
-Border-style, Border-top-style,... : none, hidden, dotted, deshed, solid, double,
ridge (effet de relief)
Brahim ER-RAHA
eXtensible Stylesheet Language est un langage construit sur des principes
profondément différents de ceux de CSS et il offre par rapport à ce formalisme
des possibilités nouvelles très puissantes. XSL procède par reconstruction d'un
arbre à partir de l'arbre XML. Ce nouvel arbre peut avoir un ordre différent de
l'arbre source et de nouveaux éléments peuvent y être introduit. Des traitements
spécifiques peuvent même être mis en place au moment de sa construction.
XSL est donc un langage de feuille de style avec des possibilités de traitement
assez puissantes.
Le langage XSL se divise en deux parties :
1- XSLT (eXtensible Stylesheet Language Transformation) il permet de
transformer un document XML en un autre document XML (HTML, xHTML,
WML, SVG, SMIL,…), par défault, cette transformation produit un document
HTML bien formés.
2- XSL FO (Formatting Objects) c'est un langage de mise en page, il permet de
transformer un document XML en document non XML par exemple : PDF,
PostScript, RTF, Doc, text,…
IV-1 feuilles de style XSL
Brahim ER-RAHA
1-1 Association d'une feuille XSL à un document XML
Une feuille de style XSL (enregistré dans un fichier dont l'extension est .xsl) peut
être liée à un document XML (de telle manière à ce que le document XML utilise la
feuille XSL) en insérant la balise suivante au début du document XML :
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="fichier.xsl" type="text/xsl"?>
Cette dernière instruction de traitement indique le type de la feuille de style et son
emplacement.
1- Langage XSLT
Voir le dossier TestXSLT…
Brahim ER-RAHA
XSLT est une application XML, une feuille de style XSL est donc un document
XML. La feuille de style contient donc une déclaration XML et tous ses
éléments sont placés dans l’élément racine <xsl:stylesheet>. D’autre part, les
éléments XSL sont préfixés par xsl : qui fait référence à deux types de
domaines de nom :
- http://www.w3.org/TR/WD-xsl
-http://www.w3.org/1999/XSL/Transform
Exemple :
<?xml version="1.0" encoding="ISO-8859-1">
<xsl:stylesheet>
<xsl:template ... >
<!-- traitements à effectuer -->
</xsl:template >
</xsl:stylesheet>
L’élément racine contient principalement des balises xsl:template (modèle de
transformation) définissant les transformations à faire subir à certains éléments
du document XML
1-2 Structure d’une feuille de style XSLT
Brahim ER-RAHA
Une feuille de styles XSL contient un ou plusieurs modèles (templates), chaque
modèle contient des informations sur l’affichage d’une branche des éléments du
document.
I-3 Modèle unique pour un document XML
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"
href="biblio.xsl" ?>
<bibliotheque>
<livre>
<titre>N ou M</titre>
<auteur>Agatha Christie</auteur>
<ref>Policier-C-15</ref>
</livre>
<livre>
<titre>Le chien des Baskerville</titre>
<auteur>Sir Arthur Conan Doyle</auteur>
<ref>Policier-D-3</ref>
</livre>
<livre>
<titre>Dune</titre>
<auteur>Franck Heckbert</auteur>
<ref>Fiction-H-1</ref>
</livre>
</bibliotheque>
<?xml version= “1.0 “?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XS
L/Transform">
<xsl:template match="/">
<H2>Bibliotheque</H2>
<xsl:for-each
select="bibliotheque/livre">
<P style="font-style:italic">
<xsl:value-of select="titre"/>
</P>
<P style="color:red">
<xsl:value-of select="auteur"/>
</P>
<P style="color:blue">
<xsl:value-of select="ref"/>
</P>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Brahim ER-RAHA
Le modèle est appliqué à la branche spécifiée par l’attribut match de l’élément
template.
La transformation d’un document XML par une feuille de style XSL s’effectue donc
par un modèle traitant un nœud donné. Chaque modèle est divisé en deux parties :
un nœud cible indiqué par l’attribut match et une action sur le nœud :
<xsl:template match="noed_cible">
action
</xsl:template>
L'attribut "match" de la balise <xsl:template> permet de définir (grâce à la notation
XPath) le ou les éléments du document XML sur lesquels s'applique la
transformation.
La notation Xpath permet de définir des patterns, c'est-à-dire des chaînes de
caractères permettant de repérer un nœud dans le document XML.
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Le langage XPath est un standard du W3C pour décrire des "patterns"
(localisation de nœud) et extraire des valeurs de l'arbre du document XML. Il sert
en fait 2 autres "standards" XML :
XSLT : partie de XSL, ensemble de règles de transformation d'un document XML
vers un autre document.
XPointer : mécanisme de pointage pour les liens XLink de XML.
Un sélecteur de nœud (XPATH) est formée de trois parties :
<xsl:template match="//nom[position()=1]">
• un axe : il permet de se déplacer dans l'arbre du document
• un test : il permet de sélectionner un nœud
• un prédicat (entre crochets [xx]): il effectue une opération booléenne sur le
nœud sélectionné.
Considérons l'exemple suivant: (Fichier atome.xml)
a- Langage Xpath
Brahim ER-RAHA
<?xml version="1.0" encoding="iso-8859-1" ?>
<classification_atomique>
<famille type="gaz rare">
<atome>
<nom>hélium</nom>
<symbole>He</symbole>
<numero>2</numero>
<masse>4</masse>
</atome>
<atome>
<nom>néon</nom>
<symbole>Ne</symbole>
<numero>10</numero>
<masse>20</masse>
</atome>
<atome>
<nom>argon</nom>
<symbole>Ar</symbole>
<numero>18</numero>
<masse>40</masse>
</atome>
</famille>…..
< /classification_atomique>
Brahim ER-RAHA
Axes
Les axes décrivent les directions des chemins dans une arborescence, ils ont deux
allure identique :
1- Syntaxe Xpath (notation étendue) : racine, parent, nœud courant, descendant,
les axes s'utilisent ainsi : axe :: test
Supposons que le nœud courant soit <famille type="gaz rare">
• ancestor:: tous les nœuds parent de la branche du nœud courant
• ancestor-or-self:: tous les nœuds parent de la branche du nœud courant et la
branche en cours
• child:: les nœuds fils
• descendant:: les descendant du nœud courant
• descendant-or-self:: les descendant du nœud courant et le nœud courant
• following:: tous les nœuds suivant le nœud courant dans le document
• following-sibling:: sélectionne les nœuds frères du nœud courant se trouvant
après ce nœud courant
• parent:: parent de noeud courant
• preceding:: tous les nœuds précédent le nœud courant dans le document.
• preceding-sibling:: sélectionne les nœuds frères du nœud courant se trouvant
avant ce nœud courant
• self:: le nœud courant
• following :: parent :: tous les nœuds suivants le nœud parent du nœud
courant
Brahim ER-RAHA
Figure1 : Exemple de syntaxe Xpath sur un document
Brahim ER-RAHA
2- Syntaxe Simple
Supposons que le nœud courant soit <famille type="gaz rare">
/ ou /classification_atomique sélectionne l'élément racine du document, donc
<classification_atomique>
/ classification_atomique /famille sélectionne les éléments famille fils de l'élément
racine
./atome ou atome sélectionne les éléments atome fils du nœud courant.
atome/nom sélectionne les éléments nom fils d'un élément atome fils du nœud
courant
.. sélectionne l'élément père, donc <classification_atomique>
../famille sélectionne les éléments famille fils du père du nœud courant
//atome sélectionne les éléments atome descendant de l'élément racine
.//nom sélectionne les éléments nom descendant du nœud courant
* sélectionne tous les éléments fils du nœud courant
atome/* sélectionne tous les éléments fils d'un élément atome fils du nœud courant
@type sélectionne l'attribut type du nœud courant
/famille/@type sélectionne l'attribut type des éléments famille fils de l'élément
racine
@* sélectionne tous les attributs du nœud courant
./atome | .//nom union des 2 sélections
atome/node() sélectionne tous les nœuds (pas uniquement les nœuds éléments)
fils d'un élément atome fils du nœud courant
comment() tous les nœuds commentaire du nœud courant
Brahim ER-RAHA
Test
Il permet de déterminer dans un chemin Xpath le nom ou et le type de nœud
sélectionné. Exemple :
 nom d’élément: film
 nom d’attribut: @titre
 type de nœud:
– nœuds: node() (pas de sélection).
– éléments: *,
– attributs: @*,
– nœuds de type texte (PCDATA): texte():
 commentaires: comment()
Brahim ER-RAHA
Prédicat
Les prédicats sont utilisés dans les tests de XSLT. De plus, l'ensemble des nœuds
obtenus par un chemin XPtah peut être filtré à l'aide de prédicats entre crochets [].
Supposons que le nœud courant soit <famille type="gaz rare">
./atome[3] sélectionne le 3ème élément atome fils du nœud courant
./atome[position()=3] sélectionne l'élément atome fils du nœud courant dont le
position est en 3ème place.
atome[last()] sélectionne le dernier élément atome fils du nœud courant
atome[numero!=4] sélectionne les éléments atome fils du nœud courant dont le
numéro est différent de 4
atome[numero &gt;= 4] Remarquons qu'il faut utiliser &lt; (respectivement &gt;) à la
place de < (resp. >) dans les documents XML
following-sibling :: .[@type="non métal"] sélectionne les nœuds frère (suivant dans
le document) du nœud courant dont l'attribut type vaut "non métal"
atome[masse mod 2 =1] sélectionne les éléments atome fils du nœud courant dont la
masse est impair.
Brahim ER-RAHA
../famille[(@type="non métal") and (atome/masse &gt; 34)] sélectionne les nœuds
famille fils du père du nœud courant dont l'attribut type vaut "non
métal" et dont l'un des fils atome a un fils masse dont le
contenu est > à 34.
../famille[@type="non métal"]/atome[masse &gt; 34] sélectionne les nœuds atome,
ayant un fils masse dont le contenu est > à 34, et qui sont fils de nœud
famille fils du nœud racine dont l'attribut type vaut "non métal".
/famille/atome[3] [masse &gt; 34] sélectionne parmi les 3ème éléments atome des fils
famille du nœud racine ceux dont la masse est > à 34
/famille/atome[masse &gt; 34] [3] sélectionne le 3ème élément parmi les atomes,
dont la masse est > à 34, des fils famille du nœud racine
/famille[count(atome[masse &gt; 34]) != 0] sélectionne les nœuds famille du nœud
racine ayant au moins un fils atome de masse > à 34
/famille[not(contains(@type, 'gaz'))] sélectionne les nœuds famille du nœud racine
ayant un attribut type qui ne comporte pas la chaine 'gaz'
opérateurs : and, or, *, +, -, /, mod
fonctions numériques : number, sum, floor, ceiling, round
fonctions booléennes : not, lang
Brahim ER-RAHA
Correspondance entre syntaxe Xpath simple et étendu
Syntaxe Etendu Syntaxe Simple
/child::film/child::acteur /film/acteur
/child::cinéma/descendant::acteur /cinéma//acteur
/descendant::* //*
/descendant::film[@année=’2000’] //film[@année=’2000’]
Self .
Parent ..
Brahim ER-RAHA
1- AAA : Sélectionne l'élément racine AAA
<AAA>
<BBB/>
<CCC/> <xsl:template match="/">
<BBB/> <xsl:value-of select="AAA"/>
<BBB/> </xsl:template>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
2- /AAA/CCC : Sélectionne tous les éléments CCC qui sont enfants de l'élément
racine AAA
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>>
I- Syntaxe Simple
Brahim ER-RAHA
3- /AAA/DDD/BBB : Sélectionne tous les éléments BBB qui sont enfants de DDD, qui
sont enfants de l'élément racine AAA
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
4- //BBB : Sélectionne tous les éléments BBB
<AAA>
<BBB/>
<CCC/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
</CCC>
</AAA>
Brahim ER-RAHA
5- //DDD/BBB :Sélectionne tous les éléments BBB qui sont enfants de DDD
<AAA>
<BBB/>
<CCC/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
</CCC>
</AAA>
6- /AAA/CCC/DDD/* : Sélectionne tous les éléments inclus dans les éléments
/AAA/CCC/DDD
Brahim ER-RAHA
6- /*/*/*/BBB
Sélectionne tous les éléments BBB qui ont trois ancêtres
Brahim ER-RAHA
7- /AAA/BBB[1] : Sélectionne le premier élément BBB, fils de l'élément racine AAA
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
</AAA>
8- /AAA/BBB[last()] : Sélectionne le dernier élément :BBB, fils de l'élément racine
AAA
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
</AAA>
9- //@id : Sélectionne tous les attributs id
<AAA>
<BBB id = "b1"/>
<BBB id = "b2"/>
<BBB name = "bbb"/>
<BBB/>
</AAA>
Brahim ER-RAHA
10- //BBB[@id] : Sélectionne tous les BBB qui ont un attribut id
<AAA>
<BBB id = "b1"/>
<BBB id = "b2"/>
<BBB name = "bbb"/>
<BBB/>
</AAA>
10- //BBB[@name] Sélectionne tous BBB qui ont un attribut name
<AAA>
<BBB id = "b1"/>
<BBB id = "b2"/>
<BBB name = "bbb"/>
<BBB/>
</AAA>
11- //BBB[@*] Sélectionne tous BBB qui ont un attribut
<AAA>
<BBB id = "b1"/>
<BBB id = "b2"/>
<BBB name = "bbb"/>
<BBB/>
</AAA>
12- //BBB[not(@*)] :Sélectionne
Tous les BBB qui n'ont pas d'attribut
<AAA>
<BBB id = "b1"/>
<BBB id = "b2"/>
<BBB name = "bbb"/>
<BBB/>
</AAA>
Brahim ER-RAHA
13- //BBB[@id='b1'] :Sélectionne tous les éléments BBB ayant un attribut id dont la
valeur est b1
<AAA>
<BBB id = "b1"/>
<BBB name = " bbb "/>
<BBB name = "bbb"/>
</AAA>
14- //BBB[@name='bbb'] : Sélectionne tous les éléments BBB ayant un attribut name
dont la valeur est bbb
<AAA>
<BBB id = "b1"/>
<BBB name = " bbb "/>
<BBB name = "bbb"/>
</AAA>
15- //BBB[normalize-space(@name)='bbb'] :Sélectionne tous les éléments BBB
ayant un attribut name dont la valeur est bbb. Les espaces de début et de fin sont
supprimés avant la comparaison
<AAA>
<BBB id = "b1"/>
<BBB name = " bbb "/>
<BBB name = "bbb"/>
</AAA>
Brahim ER-RAHA
16- //*[count(BBB)=2]
Sélectionne les éléments ayant deux enfants BBB
<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
<EEE>
<CCC/>
<DDD/>
</EEE>
</AAA>
17- //*[count(*)=2] : Sélectionne les éléments ayant
deux enfants
<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>
<BBB/>
<BBB/>
</DDD>
<EEE>
<CCC/>
<DDD/>
</EEE>
</AAA>
Brahim ER-RAHA
18- //*[count(*)=3] : Sélectionne les éléments ayant trois enfants
Brahim ER-RAHA
19- //*[name()='BBB']
La fonction name() retourne le nom de l'élément
Brahim ER-RAHA
21- //*[starts-with(name(),'B')] :
la fonction start-with retourne vrai si la chaîne du premier argument commence
par celle du deuxième
<AAA>
<BCC>
<BBB/>
<BBB/>
<BBB/>
</BCC>
<DDB>
<BBB/>
<BBB/>
</DDB>
<BEC>
<CCC/>
<DBD/>
</BEC>
</AAA>
22- //*[contains(name(),'C')]
<AAA>
<BCC>
<BBB/>
<BBB/>
<BBB/>
</BCC>
<DDB>
<BBB/>
<BBB/>
</DDB>
<BEC>
<CCC/>
<DBD/>
</BEC>
</AAA>
Brahim ER-RAHA
23- //*[string-length(name()) = 3]
<AAA>
<Q/>
<SSSS/>
<BB/>
<CCC/>
<DDDDDDDD/>
<EEEE/>
</AAA>
24- //*[string-length(name()) &lt; 3]
<AAA>
<Q/>
<SSSS/>
<BB/>
<CCC/>
<DDDDDDDD/>
<EEEE/>
</AAA>
26- //CCC | //BBB : Sélectionne tous les éléments
CCC et BBB
<AAA>
<BBB/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<EEE/>
</AAA>
Brahim ER-RAHA
27- /AAA/EEE | //BBB : Sélectionne tous les éléments BBB et EEE qui sont
enfants de l'élément racine AAA
<AAA>
<BBB/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<EEE/>
</AAA>
Plusieurs chemins peuvent être combinés avec le séparateur |
28- /AAA/EEE | //DDD/CCC | /AAA | //BBB : Le nombre de combinaisons n'est
pas restreint
<AAA>
<BBB/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<EEE/>
</AAA>
Brahim ER-RAHA
1- /AAA : Équivalent à /child::AAA
<AAA>
<BBB/>
<CCC/>
</AAA>
2- /AAA/BBB : Equivalent à /child::AAA/child::BBB
<AAA>
<BBB/>
<CCC/>
</AAA>
3- /child::AAA/BBB
Les deux possibilités peuvent être combinées
<AAA>
<BBB/>
<CCC/>
</AAA>
4- /descendant::* Sélectionne tous les descendants de l'élément racine et donc tous les
éléments
II- Noms d'axes
Brahim ER-RAHA
6- /AAA/BBB/descendant::* :Sélectionne tous les descendants de /AAA/BBB
7- //CCC/descendant::* : Sélectionne tous les éléments qui ont CCC comme ancêtre
Brahim ER-RAHA
8- //CCC/descendant::DDD : Sélectionne les descendants de CCC dont au moins un
est un DDD
9- //DDD/parent::*
Brahim ER-RAHA
10- /AAA/BBB/DDD/CCC/EEE/ancestor::*: Sélectionne tous les éléments donnés dans
ce chemin absolu
11- //FFF/ancestor::* Sélectionne tous les ancêtres de l'élément FFF
Brahim ER-RAHA
12- /AAA/BBB/following-sibling::* //CCC/following-sibling::*
Brahim ER-RAHA
13- /AAA/XXX/preceding-sibling::*
Brahim ER-RAHA
12- //CCC/preceding-sibling::*
Brahim ER-RAHA
L'axe suivant (following) tous les nœuds du même document que le nœud contextuel
qui sont après le nœud contextuel dans l'ordre du document, à l'exclusion de tout
descendant, des attributs et des espaces de noms
13- /AAA/XXX/following::*
Brahim ER-RAHA
15- //ZZZ/following::*
Brahim ER-RAHA
L'axe cible précédente (preceding) contient tous les prédécesseurs du nœud contextuel; si
le nœud contextuel est un attribut ou un espace de noms, la cible précédente est vide
16- /AAA/XXX/preceding::*
Brahim ER-RAHA
17- //GGG/preceding::*
Brahim ER-RAHA
L'axe 'descendant-or-self' contient le nœud contextuel et ses descendants
18- /AAA/XXX/descendant-or-self::*
Brahim ER-RAHA
19- //CCC/descendant-or-self::*
Brahim ER-RAHA
L'axe ancestor-or-self contient le nœud contextuel et ses ancêtres; ainsi
l'axe ancestor-or-self contient toujours le nœud racine
20- /AAA/XXX/DDD/EEE/ancestor-or-self::*
Brahim ER-RAHA
21- //GGG/ancestor-or-self::*
Brahim ER-RAHA
22- //GGG/ancestor::*
23- //GGG/descendant::*
Brahim ER-RAHA
24- //GGG/following::*
25- //GGG/preceding::*
Brahim ER-RAHA
26- //GGG/self::*
27- //GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* |
//GGG/preceding::* | //GGG/self::*
Brahim ER-RAHA
III- les opérateurs
L'opérateur div réalise une division à virgule flottante, l'opérateur mod retourne le
reste d'une division. La fonction floor() retourne le plus grand nombre (le plus près
de l'infini positif) qui n'est pas plus grand que l'argument et qui est un entier. La
fonction ceiling() retourne le plus petit nombre (le plus près de l'infini négatif) qui
n'est pas plus petit que l'argument et qui est un entier
1- //BBB[position() mod 2 = 0 ]
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<CCC/>
<CCC/>
<CCC/>
</AAA>
Brahim ER-RAHA
2- //BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<CCC/>
<CCC/>
<CCC/>
</AAA>
3- //CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
<AAA>
<BBB/><BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<BBB/>
<CCC/>
<CCC/>
<CCC/></AAA>
Brahim ER-RAHA
<?xml version="1.0" encoding="iso-8859-1" ?>
<classification_atomique>
<atome ligne="1" colone="8">
<nom>hélium</nom>
<symbole>He</symbole>
<numero>2</numero>
<masse>4</masse>
<type>gaz rare</type>
</atome>
<atome ligne="2" colone="8">
<nom>néon</nom>
<symbole>Ne</symbole>
<numero>10</numero>
<masse>20</masse>
<type>gaz rare</type>
</atome>
<atome ligne="3" colone="8">
<nom>argon</nom>
<symbole>Ar</symbole>
<numero>18</numero>
<masse>40</masse>
<type>gaz rare</type>
</atome>…..
< /classification_atomique>
Brahim ER-RAHA
b- Action possible par le langages XSLT
b-1 Extraction de contenue d'un élément
Pour insérer le contenu des éléments sélectionnés par la règle de gabarit (template)
dans le fichier résultat, il suffit d'utiliser l'élément value-of, qui permet d'insérer le
contenu de la balise sélectionnée par l’attribut obligatoir select.
Exemple :
<xsl:output method="html"/>
<xsl:template match="/classification_atomique">
<html>
<body>
<P style="color:red">
<xsl:value-of select="atome/symbole"/>
</p></body></html>
</xsl:template>
Fichier Résultat
<html>
<body>
<p style="color:red">H</p>
</body>
</html>
Brahim ER-RAHA
Grâce à l'élément <xsl:for-each>, il est possible de sélectionner un ensemble
des éléments enfants et de leur appliquer une règle de transformation.
L'instruction de boucle for-each sélectionne tous les nœuds correspondants au
pattern atome/symbole à partir du nœud courant classification_atomique, et
leur applique les transformations spécifiées.
b-2 Réalisation des boucles
Fichier XSL appliquée sur atomes.xml --> résultat
<xsl:template
match="/classification_atomique">
<html>
<body>
<xsl:for-each select="atome/symbole">
<xsl:value-of select="."/>
<br/>
</xsl:for-each>
</body></html>
</xsl:template>
<html> <body>
H<br>
He<br>
Li<br>
Be<br>
B<br>
C<br>N<br>O<br>F<br>Ne<br>Na<br>Mg<br>A
l<br>Si<br>Ar<br>
</body></html>
Brahim ER-RAHA
b-3 Utilisation des structure de condition
XSLT propose deux instructions qui pemettent le traitement conditionnel dans un
modèle : xsl:if et xsl:choose . L'instruction xsl:if sert à exprimer la condition simple si-
alors ; L'instruction xsl:choose permet quant à elle un choix parmi plusieurs
possibilités
Traitement conditionnel par xsl:if
la syntaxe d'utilisation est :
<xsl:if test = boolean-expression>
traitement….
</xsl:if>
L'élément xsl:if a un attribut test qui spécifie une expression. Le contenu est un
modèle.
Brahim ER-RAHA
Fichier XSL Résultat HTML
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl=http://www.w3.org/1999/XSL/Transform>
<xsl:template match="/classification_atomique">
<html><body>
<table border="1">
<tr>
<th>symbole</th>
<th>numero</th>
</tr>
<xsl:for-each select="atome">
<xsl:if test="type='gaz rare'">
<tr>
<td>
<xsl:value-of select="nom"/>
</td>
<td>
<xsl:value-of select="numero"/>
</td>
</tr>
</xsl:if>
</xsl:for-each>
</table></body></html>
</xsl:template>
</xsl:stylesheet>
<html>
<body>
<table>
<tr>
<th>symbole</th>
<th>numero</th>
</tr>
<tr>
<td>h&eacute;lium</td>
<td>2</td>
</tr>
<tr>
<td>n&eacute;on</td>
<td>10</td>
</tr>
<tr>
<td>argon</td>
<td>18</td>
</tr>
</table>
</body>
</html>
Brahim ER-RAHA
la syntaxe d'utilisation est :
L'élément xsl:choose permet de faire un choix parmi plusieurs alternatives. Il
consiste en une séquence d'éléments xsl:when suivis par un élément
xsl:otherwise optionnel. Chacun des éléments xsl:when possède un attribut test
unique qui spécifie une expression. Le contenu des éléments xsl:when et
xsl:otherwise est un modèle de traitement
 Traitement conditionnel par xsl:choose
<xsl:choose>
(xsl:when+,
xsl:otherwise?)>
</xsl:choose>
<xsl:when test = boolean-
expression>
<!--Content: template -->
</xsl:when>
<xsl:otherwise>
<!-- Content: template -->
</xsl:otherwise>
Brahim ER-RAHA
Fichier XSL Résultat HTML
<xsl:template match="/classification_atomique">
<html><body><table border="1">
<tr>
<th>type</th>
<th>symbole</th>
<th>numero</th>
</tr>
<xsl:for-each select="atome">
<tr> <td>
<xsl:choose>
<xsl:when test="contains(type,'métal')">
métal </xsl:when>
<xsl:when test="contains(type,'gaz')">
gaz </xsl:when>
<xsl:otherwise>Rien</xsl:otherwise>
</xsl:choose>
</td>
<td>
<xsl:value-of select="nom"/>
</td>
<td>
<xsl:value-of select="numero"/>
</td> </tr>
</xsl:for-each> </table></body></html>
</xsl:template> </xsl:stylesheet>
<html> <body> <table>
<tr>
<th>type</th>
<th>symbole</th>
<th>numero</th>
</tr>
<tr>
<td></td>
<td>hydrog&egrave;ne</t
d> <td>1</td>
</tr>
<tr>
<td>gaz</td>
<td>h&eacute;lium</td>
<td>2</td>
</tr>
<tr>
<td>m&eacute;tal</td>
<td>lithium</td>
<td>3</td>
</tr>
<tr>....
Brahim ER-RAHA
Exemple
Brahim ER-RAHA
DTD
XML
Brahim ER-RAHA
XSL
HTML
Exemple 1
Un opérateur Télécom fournit périodiquement, à l’opérateur de réglementation des
télécoms ANRT un fichier XML qui contient les clients de cet opérateur. Chaque
client possède plusieurs abonnements et chaque abonnement reçoit plusieurs
factures. Un exemple de fichier XML correspondant à ce problème est le suivant :
<?xml version="1.0" encoding="UTF-8"?>
<operateur>
<client code="1" nom="hassouni">
<abonnement num="123" type="GSM" dateAb="2006-1-11">
<facture numFact="432" dateFact="2006-2-11" montant="350.44"
reglee="oui"/>
<facture numFact="5342" dateFact="2006-3-11" montant="450" reglee="oui"/>
<facture numFact="5362" dateFact="2006-4-13" montant="800.54"
reglee="non"/>
</abonnement>
<abonnement num="2345" type="FIXE" dateAb="2006-12-1">
<facture numFact="5643" dateFact="2007-1-12" montant="299" reglee="oui"/>
<facture numFact="6432" dateFact="2007-2-12" montant="555" reglee="non"/>
</abonnement>
</client>
<client code="2" nom="abbassi">
<abonnement num="7543" dateAb="2006-12-1" type="GSM">
<facture numFact="7658" dateFact="2007-2-12" montant="350.44"
reglee="oui"/>
<facture numFact="7846" dateFact="2007-3-12" montant="770" reglee="non"/>
</abonnement>
</client>
</operateur>
Travail demandé
1.
2.
3.
4.
Faire une représentation graphique de l’arbre XML.
Ecrire une DTD qui permet de valider ce document XML
Créer le fichier XML
Ecrire une feuille de style XSL qui permet de transformer le document
XML en une page HTML qui permet d’afficher pour chaque client la
liste de ses abonnement en affichant le montant total des factures de
chaque abonnement
Corrigé : DTD
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT operateur (client+) >
<!ELEMENT client (abonnement+) >
<!ELEMENT abonnement (facture+) >
<!ELEMENT facture EMPTY >
<!ATTLIST client
code NMTOKEN #REQUIRED
nom CDATA #REQUIRED>
<!ATTLIST abonnement
num NMTOKEN #REQUIRED
type (GSM|FIXE) 'FIXE'
dateAb CDATA #REQUIRED>
<!ATTLIST facture
numFact NMTOKEN #REQUIRED
dateFact CDATA #REQUIRED
montant CDATA #REQUIRED
reglee (oui|non) 'non'>
operateur
+client
@code
@nom
+abonnement
@num
@type
@dateAb
+facture
@numFact
@dateFact
@montant
@reglee
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head></head>
<body>
<xsl:for-each select="operateur/client">
<h3>
Nom Client : <xsl:value-of select="@nom"/>
</h3>
<table border="1" width="80%">
<tr>
<th>Num</th><th>Type</th><th>Date</th><th>Total Factures</th>
</tr>
<xsl:for-each select="abonnement">
<tr>
<td><xsl:value-of select="@num"/></td>
<td><xsl:value-of select="@type"/></td>
<td><xsl:value-of select="@dateAb"/></td>
<td><xsl:value-of select="sum(facture/@montant)"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Application
Un exemple de fichier XML correspondant à ce problème est le suivant :
<?xml version="1.0" encoding="UTF-8"?>
<rapport>
<mandat num="7124536" date="2007-1-1" montant="1000" etat="reçu">
<expediteur cin="A123245" nom="slimani" prenom="youssef" ville="casa"/>
<destinataire cin="P98654" nom="hassouni" prenom="laila" ville="fes"/>
</mandat>
<mandat num="7124537" date="2007-1-1" montant="3200" etat="non reçu">
<expediteur cin="M123245" nom="alaoui" prenom="mohamed" ville="marrakech"/>
<destinataire cin="M92654" nom="alaoui" prenom="imane" ville="casa"/>
</mandat>
<mandat num="7124538" date="2007-1-2" montant="500" etat="reçu">
<expediteur cin="H123222" nom="qasmi" prenom="slim" ville="oujda"/>
<destinataire cin="B91154" nom="qasmi" prenom="hassan" ville="rabat"/>
</mandat>
</rapport>
Travail à faire
Faire une représentation graphique de l’arbre XML
Ecrire une DTD qui permet de déclarer la structure du document XML
Ecrire le schéma XML qui permet de déclarer la structure du document
XML
Créer le fichier XML valide respectant ce schéma.
Ecrire une feuille de style XSL qui permet de transformer le document
XML en document HTML suivant :
Brahim ER-RAHA
b-4 Triage des données
Le triage des données est spécifié en ajoutant des éléments xsl:sort comme fils d'un
élément xsl:apply-templates ou d'un élément xsl:for-each. Le premier fils xsl:sort
spécifie la clé primaire de tri, le deuxième fils xsl:sort spécifie la clé de tri secondaire
et ainsi de suite.
xsl:sort possède un attribut select dont la valeur est une expression représentant la
nœud courante sur le quelle on effectue le tri et un autre attribut order indique si les
chaînes de caractères devraient être triées dans un ordre ascendant ou
descendant; par défaut, l'ordre est ascending
Brahim ER-RAHA
b-5 Création de l'arbre résultat
 Créer des éléments avec xsl:element
L'élément xsl:element permet la création d'un élément ayant un nom déterminé. Le
nom étendu de l'élément à créer est spécifié par l'attribut obligatoire name. Le
contenu de l'élément xsl:element est le modèle des attributs et enfants de l'élément
créé.
La syntaxe d'utilisation est :
<xsl:element name = { qname } use-attribute-sets = qnames>
<!-- Content: template -->
</xsl:element>
Créer des attributs avec xsl:attribute
L'élément xsl:attribute peut être utilisé pour ajouter des attributs aux éléments
résultats qui sont créés par un xsl:element. Le nom étendu de l'attribut à créer est
spécifié par l'attribut obligatoire name. le contenu de l'élément xsl:attribute est un
modèle de la valeur de l'attribut créé.
La syntaxe d'utilisation est:
<xsl:attribute name = { qname }}>
<!-- Content: template -->
</xsl:attribute>
Brahim ER-RAHA
 Créer de texte dans l'arbre résultat
l'élément xsl:text permet de créer des nœuds textuels dans le document
résultat, la syntaxe d'utilisation est :
<xsl:text >
<!-- Content: #PCDATA-->
</xsl:text>
 Créer des commentaires
L'élément commentaire xsl:comment sert à créer un nœud commentaire dans
l'arbre résultant.
la syntaxe d'utilisation est :
<xsl:comment>
Contenu de commentaire
</xsl:comment>
 Créer des instructions de traitement
L'élément xsl:processing-instruction sert à créer un nœud instruction de
traitement. L'élément xsl:processing-instruction possède un attribut obligatoire name qui
spécifie le nom du nœud instruction de traitement
La syntaxe d'utilisation est:
<xsl:processing-instruction name = { nom de l'instruction }>
<!-- Content: template -->
</xsl:processing-instruction>
Brahim ER-RAHA
Document XSL Document Résultat
<xsl:processing-instruction name="xml-
stylesheet">href="book.css" type="text/css“
</xsl:processing-instruction>
<?xml-stylesheet
href="book.css"type="text/css"?>
Exemple
Brahim ER-RAHA
Exemple :Xsl:element :
Fichier XML
Fichier XSL Arbre générée
<source>
<text
size="H1">Header1</text>
<text
size="H3">Header3</text>
<text size="b">Bold
text</text>
<text
size="sub">Subscript</text>
<text
size="sup">Superscript</text
> </source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/X
SL/Transform'>
<xsl:template match="/">
<xsl:for-each select="//text">
<xsl:element name="{@size}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:template></xsl:stylesheet>
<H1>Header1</H1>
<H3>Header3</H3>
<b>Bold text</b>
<sub>Subscript</sub>
<sup>Superscript</sup>
Brahim ER-RAHA
Xsl:attribute
Fichier XML
Fichier XSL Arbre généré
<source>
<color>blue</color>
<color>navy</color>
<color>green</color>
<color>lime</color>
<color>red</color>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/
XSL/Transform'>
<xsl:template match="color">
<TABLE>
<TR>
<TD>
<xsl:attribute name="style">
<xsl:text>color:</xsl:text>
<xsl:value-of select="."/>
</xsl:attribute>
<xsl:value-of select="."/>
</TD>
</TR>
</TABLE>
</xsl:template></xsl:stylesheet>
<TABLE>
<TR>
<TD style="color:blue">blue</TD>
</TR>
</TABLE>
<TABLE>
<TR>
<TD style="color:navy">navy</TD>
</TR>
</TABLE>
<TABLE>
<TR>
<TD style="color:green">green</TD>
</TR>
</TABLE>
<TABLE>
<TR>
<TD style="color:lime">lime</TD>
</TR>
</TABLE>
<TABLE>
<TR>
<TD style="color:red">red</TD>
</TR>
</TABLE>
Brahim ER-RAHA
Xsl: attribute-set : Avec l'élément xsl:attribute-set on ne peut pas utiliser l'élément value of
Fichier XML
Fichier XSL Arbre généré
<source>
<h1>GREETING</h1>
<p>Hello, world!</p>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
<xsl:apply-templates select="/source/*"/>
</xsl:template>
<xsl:template match="h1">
<xsl:copy use-attribute-sets="H1">
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
<xsl:template match="p">
<xsl:copy use-attribute-sets="P ">
<xsl:value-of select="."/>
</xsl:copy>
</xsl:template>
<xsl:attribute-set name="H1">
<xsl:attribute name="align">center</xsl:attribute>
<xsl:attribute name="style">color:red</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="P">
<xsl:attribute name="align">left</xsl:attribute>
<xsl:attribute name="style">color:blue</xsl:attribute>
</xsl:attribute-set>
</xsl:stylesheet>
<h1 align="center"
style="color:red">GREETING
</h1>
<p align="left"
style="color:blue">Hello,
world!</p>
Brahim ER-RAHA
 copier des nœuds vers le document résultat : XSl:Copy et XSl:Copy-of :
L'élément copy permet de copier uniquement le nœud courant (sans contenus, ni attribues).
L'élément copy-of permet de copier le nœud courant, sont contenu, ces attribues et ces enfants
Fichier XML Fichier XSL Arbre générée
<source>
<p id="a12"> Compare
<B>these
constructs</B>.
</p>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="p">
<DIV>
<B>
<xsl:text>copy-of : </xsl:text>
</B>
<xsl:copy-of select="."/>
</DIV>
<DIV>
<B>
<xsl:text>copy : </xsl:text>
</B>
<xsl:copy/>
</DIV>
<DIV>
<B>
<xsl:text>value-of : </xsl:text>
</B>
<xsl:value-of select="."/>
</DIV>
</xsl:template>
</xsl:stylesheet>
<DIV>
<B>
copy-of : </B>
<p id="a12">
Compare <B>these
constructs</B>.
</p>
</DIV>
<DIV>
<B>copy : </B>
<p/>
</DIV>
<DIV>
<B>value-of : </B>
Compare these constructs.
</DIV>
Brahim ER-RAHA
number Cet élément permet d'insérer un nombre formaté pouvant servir de
compteur. L'utilisation de cet élément est de la forme :
<xsl:number level="single"|"multiple" count="noeud" value="expression"
format="chaine" />
avec:
level : indique quels niveaux doivent être sélectionnés pour le comptage.
count : indique quels nœuds doivent être comptés dans les niveaux sélectionnés ;
dans le cas où cet attribut n'est pas défini, les nœuds comptés sont ceux
ayant le même type que celui du nœud courant.
Value : indique l'expression correspondant à la valeur du compteur ; si cet attribut
n'est pas défini, le nombre inséré correspond à la position du nœud
(position()).
Format : spécifie le format de l'affichage du nombre ; cela peut être un chiffre, un
caractère (a-z, A-Z) et comprendre un caractère de séparation tel que le
point (.), le trait d'union (-) ou autre. Les formats possibles sont "1", "01",
"a", "A", "i", "I"
 Création des listes
Brahim ER-RAHA
Exemple 1
Fichier XML Fichier XSL Arbre
généré
<source>
<n>one</n>
<n>two</n>
<n>three</n>
<n>four</n>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
<TABLE>
<xsl:for-each select="//n">
<TR>
<TD>
<xsl:number value="position()" format="1. "/>
<xsl:value-of select="."/>
</TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
1. one
2. two
3. three
4. four
Brahim ER-RAHA
Exemple 2:
Fichier XML Fichier XSL Arbre généré
<source>
<chapter>First
Chapter</chapter>
<chapter>Second Chapter
<chapter>Subchapter
1</chapter>
<chapter>Subchapter
2</chapter>
</chapter>
<chapter>Third Chapter
<chapter>Subchapter
A</chapter>
<chapter>Subchapter B
<chapter>sub a</chapter>
<chapter>sub b</chapter>
</chapter>
<chapter>Subchapter
C</chapter>
</chapter>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/199
9/XSL/Transform'>
<xsl:template match="/">
<TABLE BORDER="1">
<TR>
<TH>Number</TH>
<TH>text</TH>
</TR>
<xsl:for-each select="//chapter">
<TR>
<TD>
<xsl:number level="multiple"/>
</TD>
<TD>
<xsl:value-of select="./text()"/>
</TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
Number text
1 First Chapter
2
Second
Chapter
2.1 Subchapter 1
2.2 Subchapter 2
3
Third
Chapter
3.1 Subchapter A
3.2 Subchapter B
3.2.1 sub a
3.2.2 sub b
3.3 Subchapter C
Brahim ER-RAHA
L'élément <xsl:variable> sert à créer les variables dans XSLT. Il possède les
attributs suivants :
name : cet attribut est obligatoire. Il spécifie le nom de la variable.
select : expression XPath qui spécifie la valeur de la variable.
Par exemple :
<xsl:variable name="nombre_livres" select="255"/>
<xsl:variable name="Auteur" select="'Victor Hugo'"/>
<xsl:variable name="nombre_pages" select="livre/tome/@page"/>
On notera la présence des guillemets imbriqués quand il s'agit d'affecter une chaîne
de caractères à une variable. La valeur de la variable peut aussi être donnée de
cette façon :
<xsl:variable name="Auteur">Victor Hugo </xsl:variable>
La portée d'une variable est limitée aux éléments-frères et à leurs descendants. Par
conséquent, si une variable est déclarée dans une boucle xsl:for-each ou un
élément xsl:choose ou xsl:if, on ne peut s'en servir en-dehors de cet élément.
Une variable est appelée en étant précédée du caractère $ :
<xsl:value-of select="$nombre_pages" />.
 Utilisation des variables
Eléments de XSLT
<xsl:variable>
◦ L'élément <xsl:variable> sert à créer les variables dans
XSLT. Il possède les attributs suivants :
name : cet attribut est obligatoire. Il spécifie le nom de la variable.
select : expression XPath qui spécifie la valeur de la variable.
Par exemple :
<xsl:variable name="nombre_livres" select="255" />
<xsl:variable name="auteur" select="'Victor Hugo'" />
<xsl:variable name="nb" select="livre/tome/@page" />
On notera la présence des guillemets imbriqués quand il s'agit d'affecter
une chaîne de caractères à une variable.
La portée d'une variable est limitée aux éléments-frères et à leurs
descendants. Par conséquent, si une variable est déclarée dans une boucle
xsl:for-each ou un élément xsl:choose ou xsl:if, on ne peut s'en servir en-
dehors de cet élément.
Une variable est appelée en étant précédée du caractère $ :
<xsl:value-of select="$nb" />.
◦ On peut utiliser une variable pour éviter la frappe répétitive d'une chaîne de
caractères, et pour faciliter la mise à jour de la feuille de style.
Brahim ER-RAHA
Fichier XML Fichier XSL Arbre généré
<source>
<chapter>Chapter
A</chapter>
<chapter>Chapter
B</chapter>
<chapter>Chapter
C</chapter>
<chapter>Chapter
D</chapter> </source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:variable name="text">Chapter</xsl:variable>
<xsl:template match="/">
<TABLE>
<xsl:for-each select="//chapter">
<TR>
<TD>
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:variable name="text">First
chapter</xsl:variable>
</xsl:when>
<xsl:when test="position()=last()">
<xsl:variable name="text">Last
chapter</xsl:variable>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="text">
<xsl:value-of select="$text"/>
</xsl:variable>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$text"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="."/>
</TD>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
</xsl:stylesheet>
First Chapter : Chapter A
Chapter : Chapter B
Chapter : Chapter C
Last Chapter : Chapter D
Brahim ER-RAHA
I-4 Utilisation de plusieurs modèles dans le document XSL
Un document XSL peut contenir plusieurs modèles. il est possible d’appeler un
modèle a partir d'un autre en utilisant l'élément xsl:apply-templates la syntaxe
d'utilisation est
< xsl:apply-templates select="Xpath"/>
Document XML Document XSL Document Résultat
<source>
<AAA id="a1" pos="start">
<BBB id="b1"/>
<BBB id="b2"/>
</AAA>
<AAA id="a2">
<BBB id="b3"/>
<BBB id="b4"/>
<CCC id="c1">
<CCC id="c2"/>
</CCC>
<BBB id="b5">
<CCC id="c3"/>
</BBB>
</AAA>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/">
<html>
<xsl:apply-templates select="//CCC"/>
</html>
</xsl:template>
<xsl:template match="CCC" priority="1">
<h3 style="color:blue">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</h3>
</xsl:template>
<xsl:template match="CCC/CCC" priority="2">
<h2 style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> (id=</xsl:text>
<xsl:value-of select="@id"/>
<xsl:text>)</xsl:text>
</h2> </xsl:template></xsl:stylesheet>
<html>
<h3
style="color:blue">CCC
(id=c1)</h3>
<h2 style="color:red">CCC
(id=c2)</h2>
<h3
style="color:blue">CCC
(id=c3)</h3>
</html>
Eléments de XSLT
<xsl:call-template>
◦ L'élément <xsl:template> peut être appelé
indépendamment d'une sélection d'un
nœud.
◦ Pour cela, il faut renseigner l'attribut name,
et l'appeler à l'aide de l'élément
<xsl:call-template>.
◦ Par exemple
<xsl:template name="separateur">
<hr />
<img src="ligne.gif" alt="séparation“height="2" width="150“ />
<hr />
</xsl:template>
Il suffit alors de l'appeler avec
<xsl:call-template name="separateur"/>
Eléments de XSLT
<xsl:param> et <xsl:with-param>
◦ Un paramètre est créé avec l'élément <xsl:param>, et passé à
un modèle avec l'élément <xsl:with-param>.
◦ Les deux ont deux attributs :
name, obligatoire, qui donne un nom au paramètre ;
select, une expression XPath facultative permettant de donner une valeur par défaut
au paramètre.
◦ Par exemple, on peut imaginer un template permettant d'évaluer le résultat
d'une expression polynômiale :
◦
<xsl:template name="polynome">
<xsl:param name="x"></xsl:param>
<xsl:value-of select="2*$x*$x+(-5)*$x+2" />
</xsl:template>
◦
Ce template peut être appelé comme suit:
◦
<xsl:call-template name="polynome">
<xsl:with-param name="x" select="3.4"></xsl:with-param>
</xsl:call-template>
◦
permet d'afficher le résultat de 2*3.4^2-5*3.4+2.
Brahim ER-RAHA
Fichier XML Fichier XSL Arbre
généré
<source>
<number>1</number>
<number>3</number>
<number>4</number>
<number>17</number>
<number>8</number>
</source>
<xsl:template match="/">
<TABLE>
<xsl:for-each select="//number">
<TR>
<TH>
<xsl:choose>
<xsl:when test="text() mod 2">
<xsl:apply-templates select=".">
<xsl:with-param name="type">odd</xsl:with-param>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="."/>
</xsl:otherwise>
</xsl:choose>
</TH>
</TR>
</xsl:for-each>
</TABLE>
</xsl:template>
<xsl:template match="number">
<xsl:param name="type">even</xsl:param>
<xsl:value-of select="."/>
<xsl:text> (</xsl:text>
<xsl:value-of select="$type"/>
<xsl:text>)</xsl:text>
</xsl:template>
1 (odd)
3 (odd)
4 (even)
17 (odd)
8 (even)
param et with param
Brahim ER-RAHA
Fichier XML Fichier XSL Arbre généré
<source>
<AAA>
<BBB>
<CCC>C1</CCC>
</BBB>
<CCC>C2</CCC>
<CCC>C3</CCC>
</AAA>
<AAA>
<CCC>
<DDD>D1</DDD>
<DDD>D2</DDD>
</CCC>
</AAA>
</source>
<xsl:variable name="var1" select="//AAA/CCC/text()"/>
<xsl:variable
name="var2">//AAA/CCC/text()</xsl:variable>
<xsl:template match="/">
<xsl:call-template name="function">
<xsl:with-param name="path1“
select="//AAA/CCC/DDD"/>
<xsl:with-param
name="path2">//AAA/CCC/DDD</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="function">
<xsl:param name="path1"/>
<xsl:param name="path2"/>
<P>
<xsl:value-of select="$path2"/>
<xsl:text> : </xsl:text>
<xsl:value-of select="$path1"/>
</P>
<P>
<xsl:value-of select="$var2"/>
<xsl:text> : </xsl:text>
<xsl:for-each select="$var1">
<xsl:value-of select="."/>
<xsl:text/>
</xsl:for-each>
</P>
</xsl:template>
//AAA/CCC/DDD : D1
//AAA/CCC/text() : C2C3
Brahim ER-RAHA
Document XML Document XSL Document Résultat
<source>
<AAA id="a1"
pos="start">
<BBB id="b1"/>
<BBB id="b2"/>
</AAA>
<AAA id="a2">
<BBB id="b3"/>
<BBB id="b4"/>
<CCC id="c1">
<CCC id="c2"/>
</CCC>
<BBB id="b5">
<CCC id="c3"/>
</BBB>
</AAA>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transf
orm'>
<xsl:template match="/">
<xsl:apply-templates select="//CCC"
mode="red"/>
<xsl:apply-templates select="//CCC"
mode="yellow"/>
</xsl:template>
<xsl:template match="CCC" mode="red">
<div style="color:red">
<xsl:value-of select="name()"/>
<xsl:text> id=</xsl:text>
<xsl:value-of select="@id"/>
</div>
</xsl:template>
<xsl:template match="CCC">
<div style="color:purple">
<xsl:value-of select="name()"/>
<xsl:text> id=</xsl:text>
<xsl:value-of select="@id"/>
</div>
</xsl:template>
</xsl:stylesheet>
<html>
<div
style="color:red">CCC
id=c1</div>
<div
style="color:red">CCC
id=c2</div>
<div
style="color:red">CCC
id=c3</div>
</html>
Brahim ER-RAHA
1-5 Importation des feuilles de styles
Une feuille de styles XSLT peut importer une autre feuille XSLT en utilisant l'élément
xsl:import. L'élément xsl:import possède un attribut href dont la valeur est une adresse
URI identifiant la feuille de styles à importer. La syntaxe d'utilisation est :
<xsl:import href = uri-reference />
L'élément xsl:import n'est permis que comme un élément de haut niveau. Les éléments
xsl:import doivent précéder tous les autres éléments fils de l'élément xsl:stylesheet.
Document XML Document XSL (Doc1.xsl) Document Résultat
<source>
<AAA>red</AAA>
<BBB>blue</BBB>
<CCC>purple</CCC>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="AAA">
<h3 style="color:{.}">
<xsl:value-of select="."/>
</h3>
</xsl:template></xsl:stylesheet>
<h3
style="color:red">red
</h3>
blue
purple
Brahim ER-RAHA
Document XML Document XSL (Doc2.xsl) Document Résultat
<source>
<AAA>red</AAA>
<BBB>blue</BBB>
<CCC>purple</CCC>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:import href="doc1.xsl"/>
<xsl:template match="BBB">
<h2 style="color:{.}">
<xsl:value-of select="."/>
</h2>
</xsl:template></xsl:stylesheet>
<h3
style="color:red">re
d</h3>
<h2
style="color:blue">b
lue</h2>
purple
Document XML Document XSL (Doc2.xsl) Document Résultat
<source>
<AAA>red</AAA>
<BBB>blue</BBB>
<CCC>purple</CCC>
</source>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:include href="Doc2.xsl"/>
<xsl:template match="CCC">
<h1 style="color:{.}">
<xsl:value-of select="."/>
</h1>
</xsl:template></xsl:stylesheet>
<h3
style="color:red">re
d</h3>
<h2
style="color:blue">b
lue</h2>
<h1
style="color:purple"
>purple</h1>
Brahim ER-RAHA
Brahim ER-RAHA
1. Donner le résultat d’application de fichier point.xlst
2. Modifiez points.xslt pour qu'il affiche deux nouvelles lignes:
• l’une contenant la moyenne des totaux hebdomadaires de points
(donc la moyenne de {7, 30, 4}).
• l’autre contenant la moyenne des points journaliers (donc la moyenne
de {1, 3, 2, 1, 2, 8, 20, 1, 3}).
Attention! Faites-le sans utiliser foreach ni sum ni avg! On peut tout faire
comme l'exemple, à coup de template. (il vous faudra quand même un
petit div quelquepart).
3. Ajoutez l'affichage du nombre maximal de points obtenu en un jour.
Et toujours sans foreach ni sum, etc.
Brahim ER-RAHA
Exercice
Considérons le fichier xml suivant : Etoiles.xml
1- présenter les données sous la forme d'une liste donnant pour chaque planète
son nom, sa distance par rapport au Soleil, sa masse et son diamètre. Sol Voir
2- Ajouter à la distance, la masse et le diamètre les unités employées en
récupérant la valeur de l'attribut unit pour chacun de ces éléments. Sol voir
3- Effectuer pour chaque planète un test sur l'élément satellite. S'il existe, afficher le
nombre de satellites. Sol voir
4- Ne plus afficher les informations sur la Terre. Sol voir
5- Classer les planètes sauf la Terre par ordre croissant de leur masse ; Sol voir
6- faire un test sur le type de planète et afficher suivant le cas : Sol voir
 "Planète de type tellurique" si la planète est de type tellurique ;
 "Planète pleine de gaz!" si la planète est de type gazeuse ;
 "Autre type de planète" dans les cas restants.
Brahim ER-RAHA
II- Language XSL-FO
XSL/FO est un langage qui permet de formater l’affichage et/ou l’impression d’un
document XML. Il s’agit de l’équivalent (en plus puissant) des stylesheet CSS.
Principe de formatage d'un document XML
XSL-FO : le formatage
 Permet les mises en
pages sophistiquées
 Objets de mise en forme
applicables aux résultats
avec XSLT
 Distinction
 Formatage des pages
 Formatage des objets à
l'intérieur des pages
• Statiques
• Dynamiques
Principes
 Peut s'appliquer aux résultats des feuilles
XSLT
Les processeurs XSL-FO
 Apache Group : FOP
 Formating Object Processor
 Génère du PDF http://www.apache.org
 JFOR (Open Source)
 Génère du RTF http://www.jfor.org
 Antenna House
 XSL Formatter http://www.antennahouse.com
 RenderX
 Génère du PDF http://www.renderx.com
 Altova
 StyleVision http://www.altova.com/products_xsl.html
 XML Mind FO Converter
 Génère du RTF http://www.xmlmind.com/foconverter
 Autres
 Arbortext, Adobe, Scriptura, XMLPDF, APOC, XSL-FO to TeX
Brahim ER-RAHA
- page-width="14.8cm"
- page-height="21cm"
- margin-top="1cm" tous ces attributs définissent le format de la page
- margin-bottom="1.5cm"
- margin-left="2cm"
- margin-right="2cm"
2-1 Principes de base XSL/FO
La feuille de style XSL-FO est un document XML. Elle contient donc une déclaration
XML et tous ses éléments sont placés dans l’élément racine <fo:root>. D’autre part, les
éléments XSL-FO sont préfixés par fo : qui fait référence à l'espace de nom :
xmlns:fo="http://www.w3.org/1999/XSL/Format"
Un document FO est formé donc d'un élément racine fo:root qui comprend 2 parties
bien distinctes:
 Une description des structures en page (fo:layout-master-set)
 Une description du contenu (fo:page-sequence)
a-1 Modèle de page unique
L'élément fo:simple-page-master permet de spécifier les régions d'une simple page,
les attributs de cet élément sont :
- master-name="..." sert de référence pour la page.
Brahim ER-RAHA
Cet élément contient aussi un autre élément fo:region-body possédant les attributs
suivant :
- region-name="..." sert de référence pour la region.
- margin-top="1cm"
- margin-bottom="1.5cm" tous ces attribus définissent le format de la page
- margin-left="2cm"
- margin-right="2cm“
Le modèle de page comprend en plus de la région centrale, quatre régions
périphériques :
- region-before,
- region-after,
- region-strat,
- region-end
Les dimensions des régions périphériques sont déterminées par :
- l'attribut extend qui détermine sa "largeur" (dans le sens orthogonal au coté
considéré)
- sa "longueur" est déterminée par la région centrale
Brahim ER-RAHA
Exemple :
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-size="16pt">
<fo:layout-master-set>
<fo:simple-page-master
margin-right="15mm" margin-left="15mm"
margin-bottom="15mm" margin-top="15mm"
page-width="210mm" page-height="297mm"
master-name="book">
<fo:region-body region-name="R1"
margin-bottom="5mm" margin-top="5mm"/>
<fo:region-before extent="2mm" region-name="entete"/>
<fo:region-after extent="1.5cm" region-name="pied"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="book">
<fo:title>Hello world example</fo:title>
<fo:flow flow-name=“R1">
<fo:block> Salut XSLFO!</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Brahim ER-RAHA
les marges de la page et de la région centrale
Brahim ER-RAHA
a-2 Structure des modèles de pages
Dans cette paragraphe, nous allons voir comment on peur définir un modèle
représentant une séquence de modèles de page.
Pour définir des pages multiples, il faut déclarer un élément fo:page-sequence-
master contenant un élément fo:repeatable-page-master-reference faisant
référence à l'objet fo:simple-page-master
Exemple :
<fo:layout-master-set>
<fo:simple-page-master master-name="single-page" ...>
...<!-- format de page -->
</fo:simple-page-master>
<fo:page-sequence-master master-name="many-pages">
<fo:repeatable-page-master-reference master-reference="single-page"/>
</fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="many-pages">
...<!-- contenu -->
</fo:page-sequence>
Brahim ER-RAHA
Pour définir des pages alternées (par ex. impaire, paire), il faut définir plusieurs
modèles de page simples puis définir un modèle de pages alternatives de type
fo:repeatable-page-master-alternatives contenant des conditionnelles de type
fo:conditional-page-master-reference avec les propriétés suivantes :
odd-or-even : odd ou even, permet d’associer un modèle différent selon si la page
est impaire ou paire
page-position : first, last, rest ou any, permet d’associer un modèle différent selon
la position de la page
blank-or-not-blank : blank ou not-blank, permet d’associer un modèle différent
selon si la page est vide ou non.
master- reference : détermine le type de page simple a utilisée
La syntaxe totale d'utilisation d'un modèle de séquence de page est :
<fo:page-sequence-master master-name="nomsequence">
( single-page-master-reference |
repeatable-page-master-reference |
repeatable-page-master-alternatives )+
</fo:page-sequence-master>
L'attribut master-name sert comme référence de la séquence de page définit.
Brahim ER-RAHA
<fo:layout-master-set>
<fo:simple-page-master master-name="first-page" ...> ...
<fo:simple-page-master master-name="odd-page" ...> ...
<fo:simple-page-master master-name="even-page" ...> ...
<fo:page-sequence-master master-name="chapter-pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference page-position="first“
master-reference="first-page"/>
<fo:conditional-page-master-reference odd-or-even="odd“
master-reference="odd-page"/>
<fo:conditional-page-master-reference odd-or-even="even“
master-reference="even-page"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
</fo:layout-master-set>
Brahim ER-RAHA
b- génération de continu des pages
Le contenu d'un document se trouve dans un élément fo:page-sequence avec
l'attribut master-reference="..." pour référencer le modèle de page la Syntaxe est :
<fo:page-sequence master-reference="nom modele de page">
(static-content*, flow)
</fo:page-sequence>
Le contenu (paragraphes, d’images, tableaux,…) est placé dans des flux
représentés par deux éléments fo:flow et un élément fo:static-content
 fo:flow (destiné à la région centrale)
 fo:static-content (pour les en-têtes, etc): pour Les informations qui se répètent sur
chaque page
Ces deux éléments ont un attribut obligatoire flow-name qui prendre l'une des
valeurs suivantes:
- xsl-region-afte
- xsl-region-before
- xsl-region-body
- xsl-region-start
- xsl-region-end
L'élément fo flow est un élément obligatoire et unique, la valeur xsl-region-body est
obligatoire pour son attribut flow-name
Brahim ER-RAHA
Génération de continu d'une page
Brahim ER-RAHA
b-1 Les Blocs
La mise en page est décrite à l'aide de boîtes (block). Chaque boîte est formée
d'un contenu, d'un espace interne (padding), d'une bordure (border) et d'un espace
externe (space). Les quatre côtés sont nommés relativement au sens d'écriture
(before, after, start, end)
Représentation d'une boite (bloc)
Brahim ER-RAHA
Les boîtes de blocs sont des éléments récursifs de type fo:block et correspondent
à des sections, titres, paragraphes, listes, tableaux, etc. (cf <div> en HTML).
Les principaux attributs sont (ce sont les même attribut vu dans CSS):
 text-align avec comme valeurs start (ou left), end (ou right), center, justify, ...
 line-height
 text-indent, start-indent
 space-before, space-after, padding-...
 border, border-...
 color, background-color, background-image
 font-family, font-size, font-style, font-weight, font-strech, font-variant, text-
decoration, ...
 letter-spacing, word-spacing, ...
Pour modifier les propriétés graphiques d’une portion de texte au sein d’un élément
de niveau bloc on utilise l'élémént fo:inline, la syntaxe est :
<fo:inline> contenu </fo:inline>
Exemple :
<fo:block font-size="18pt" color="black" font-family="sans-serif">
Il était <fo:inline font-style="italic" color="Red"> une fois </fo:inline>
le langage XML
</fo:block>
Le résultat est : Il était une fois le langage XML
Brahim ER-RAHA
b-2 Les tableaux
La structure globale de tableaux est similaire au modèle de tableau de HTML. Tous
les éléments nécessaires sont représentés sur le schéma suivant :
Avec:
• fo:table-and-caption
• fo:table-caption: La caption d’une table
• fo:table: la table proprement dite. Elle contient header et footer à option et un
body.
• fo:table-column: permet de spécifier notamment la longueur d’une colonne
(éléments vides)
• fo:table-header: Ligne entête, contient des lignes ou cellules (facultatifs)
• fo:table-footer: Ligne "footer", contient des lignes ou cellules (facultatifs)
• fo:table-body: contient des lignes ou cellules
• fo:table-row: les cellules qui contiennent des fo:blocks (le contenus)
On commence par définir les colonnes et leurs largeurs. Puis on définit le continu
(corps) du tableau
Brahim ER-RAHA
Exemple :
<fo:table-column column-number="1" column-width="8cm" />
<fo:table-column column-number="2" column-width="8cm" />
<fo:table-column column-number=“3" column-width="8cm" />
<fo:table-body>
<fo:table-row>
<fo:table-cell column-number="1" border-style="solid">
<fo:block text-align="left">08 – 09</fo:block>
</fo:table-cell>
<fo:table-cell column-number="2" number-columns-spanned="2" border- tyle="solid">
<fo:block text-align="center">plenary session</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell border-style ="solid">
<fo:block text-align="left">09 – 10</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid">
<fo:block text-align="center">Paper 1 - session 1</fo:block>
</fo:table-cell >
<fo:table-cell border-style="solid" number-rows-spanned="2">
<fo:block text-align="center">tutorial</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
Session1 Session2
08-09 plenary session
09-10 Paper1-session1 tutorial
10-11 Paper2-session2
11-12 Paper3-session3
Brahim ER-RAHA
b-3 Les listes
L'organigramme des éléments de liste dans un fichier XSL-FO est :
Avec :
 fo:list-block : contient la liste et contient quelques définitions pour la géométrie
fo:list-item : enfants de fo:list-block, c.a.d. des items qui contiennent un label et un
body (voir ci-dessous)
fo:list-item-label : contient le contenu du label (typiquement un fo:block avec un
nombre, un caractère dingbat, etc.)
fo:list-item-body : contient le corps d’un item, un ou plusieurs fo:block
L'indentation d’une liste est contrôlée via les attributs start-indent et end-indent
associés aux étiquettes et aux corps de liste :
 Comme alternative, on peut utiliser les attributs provisional-label-separation et
provisional-distance-between-starts
 La fonction label-end() retourne la position de la marge droite du label et body-start()
retourne la position de la marge gauche du corps
Brahim ER-RAHA
Différents attributs des éléments liste
Brahim ER-RAHA
Exemple :
<fo:list-block provisional-label-separation="1cm" provisional-distance-between-tarts="1cm">
<fo:list-item>
<fo:list-item-label end-indent="label-end()" start-indent="0.5cm">
<fo:block>1.</fo:block>
</fo:list-item-label>
<fo:list-item-body end-indent="1cm" start-indent="body-start()">
<fo:block> Vive XML ! </fo:block>
</fo:list-item-body>
</fo:list-item>
<fo:list-item>
<fo:list-item-label end-indent="label-end()" start-indent="0.5cm">
<fo:block>&#x2022;</fo:block>
</fo:list-item-label>
<fo:list-item-body end-indent="1cm" start-indent="body-start()">
<fo:block>
Gloire à XSL ! Gloire à XSL ! Gloire à XSL !
Gloire à XSL ! Gloire à XSL ! Gloire à XSL !
</fo:block>
</fo:list-item-body>
</fo:list-item>
</fo:list-block>
le résultat est :
1. Vive XML !
2. Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL !
Brahim ER-RAHA
b-4 Les graphes
Deux éléments peuvent être utilisés pour inclure des éléments de type graphique :
fo:external-graphic pour insérer un graphique dont le format de description n’est
pas XML (par exemple, une image JPEG)
fo:instream-foreign-object pour insérer un graphique dont le format de
description est exprimé dans la syntaxe XML (par
exemple, un graphique SVG ou une formule MathML)
Les attributs de ces éléments sont :
 L’attribut src qui a une valeur de type URI qui désigne l’emplacement du graphique
à insérer
 L’attribut content-type qui permet de spécifier le type de graphique
Soit comme un type MIME : <fo:external-graphic contenttype= «content-
type:image/gif» src=«resultat.gif»>
Soit en termes d’espace de nom <fo:instream-foreign-object
xmlns:svg=«http://www.w3.org/2000/svg» content-
type=«namespace-prefix:svg»>
Les attributs Width, et Height définissent la largeur et la hauteur du graphe.
Un fo:external-graphic est de type inline (il est placé sur une ligne de texte). Pour le
traiter comme un block il suffit de l’imbriquer dans un élément de type fo:block
Brahim ER-RAHA
Exemple
<fo:block>
<fo:external-graphic src="url(D:Bureauwebshots.bmp)" width="20pt"
height="20pt"/>
</fo:block
<fo:block> Exemple de graphe SVG
<fo:instream-foreign-object>
<svg xmlns=http://www.w3.org/2000/svg width="1.5cm" height="1cm">
<polygon style="fill:#FFCCCC" points="0,31 18,0 36,31"/>
</svg>
</fo:instream-foreign-object>
</fo:block>
Brahim ER-RAHA
b-5 Les Liens (Hyperliens)
Deux types de liens peuvent être créer avec l'élément principal fo:basic-link :
 Liens internes à travers l’attribut internal-destination en lui affectant l’ID du
block à atteindre
 Liens externes a travers l’attribut external-destination en lui affectant l’URL
Exemple
<fo:page-sequence master-reference="simple">
<fo:flow flow-name="xsl-region-body">
<fo:block id="A">
<fo:basic-link internal-destination="B">Cliquer-ici
</fo:basic-link> pour aller vers le bloc avec id="B".
</fo:block>
<fo:block id="B">Block with id="B".
<fo:basic-link internal-destination="A"> Cliquer-ici
</fo:basic-link> pour aller vers le bloc avec id="A".
</fo:block>
</fo:flow>
</fo:page-sequence>
Brahim ER-RAHA
b-6 Numérotation des pages
L’élément fo:page-number utilisé dans un contenu statique permet de placer le numéro de page.
La présentation des numéros de page est régie via des attributs associés aux éléments de type
fo:page-sequence, ces attributs sont :
 initial-page-number : force-page-count
 format, letter-value
 grouping-separator
 grouping-size
Exemple :
<fo:page-sequence master-reference="alterning">
<fo:static-content flow-name="evenFooter">
<fo:block font-family="Helvetica" font-size="10pt" text-align="left">
<fo:page-number/>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="oddFooter">
<fo:block font-family="Helvetica" font-size="10pt" text-align="right">
<fo:page-number/>
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates select=".//Recipe"/>
<fo:block break-before="page">
<xsl:apply-templates select=".//Recipe/Title"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
Brahim ER-RAHA
XQUERY
XQuery, langage non XML, permet de
traiter des ressources XML (fichier ou
SGBD-XML) pour obtenir des structures
XML.
C'est un langage fonctionnel typé et
basé sur la manipulation de liste de
noeuds XML.
Brahim ER-RAHA
Brahim ER-RAHA
La place de XQuery dans le monde XML
Brahim ER-RAHA
Comment interroger des documents XML?
Solutions :
 SQL: il faut stocker XML dans une BD relationnel
 XPath : extraction de fragments d’arbres
 XQuery : vrai langage de requêtes pour XML
 XSLT : extraction + transformation (règles)
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
LE BLOC DE BASE EN SQL
Brahim ER-RAHA
LE BLOC DE BASE EN XQUERY
Brahim ER-RAHA
<!ELEMENT bib (book*) >
<!ELEMENT book ((author)+, title,publisher, price) >
<!ATTLIST book year CDATA #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (la, fi )>
<!ELEMENT la (#PCDATA )>
<!ELEMENT fi (#PCDATA )>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
DTD Exemple: bib.dtd
Brahim ER-RAHA
Brahim ER-RAHA
Livres (titre et année) publiés par Addison-Wesley avant 1995, triés par
ordre alphabétique de titre ?
<bib>
{
for $b in doc("bib.xml")//book
where $b/publisher = "Addison-Wesley" and
$b/@year < 1995
order by $b/title
return
<book year="{$b/@year}">
{$b/title}
</book>
}
</bib>
EXEMPLE 1 : ÉNONCÉ
Brahim ER-RAHA
EXEMPLE 1 : RÉPONSE
Brahim ER-RAHA
Brahim ER-RAHA
Une requête XQuery est formée :
 d’un prologue composé d’une suite de déclarations,
 d’un corps composé d’une expression dont la valeur est le résultat
de la requête.
 La valeur d’une requête est la valeur de l’expression qui constitue
son corps, évaluée dans le contexte défini par le prologue.
STRUCTURE D’UNE REQUÊTE XQUERY
Brahim ER-RAHA
Brahim ER-RAHA
EXEMPLE 2
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
 Pas de distinction entre un item et une séquence de
longueur 1 : 47 = (47)
 Une séquence peut contenir des valeurs hétérogènes :
(1, ‘‘toto’’, <toto/>)
 Pas de séquences imbriqués :
(1, (2, 6), "toto", <toto/>) =(1, 2, 6, ‘‘toto’’, <toto/>)
 Une séquence peut être vide : ()
 Les séquences sont triées : (1,2)#(2,1).
VALEURS/SÉQUENCES
Brahim ER-RAHA
Valeurs construites : true(), date(‘‘2002-10-23’’
Noeud XML
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
exp1 + exp2
exp1 - exp2
exp1 * exp2
exp1 div exp2
Attention ! l’opérateur de division est div et non / réservé
aux expressions de chemin.
OPÉRATIONS ARITHMÉTIQUES
Brahim ER-RAHA
Brahim ER-RAHA
L’expression 1 + 5, 4 – 2, 7 * 3
a pour valeur la séquence
6, 2, 10
 L’expression ((9, 1), 5, (8, 2))
a pour valeur la séquence
9, 1, 5, 8, 2
 L’expression 2 to 5
a pour valeur la séquence
2, 3, 4, 5
L’expression 5 to 2
a pour valeur la séquence vide
Opérations sur les séquences
Brahim ER-RAHA
exp1 eq exp2
exp1 ne exp2
exp1 lt exp2
exp1 le exp2
exp1 gt exp2
exp1 ge exp2
La valeur de exp1 op exp2 est obtenue en comparant les
valeurs atomisées de exp1 et exp2.
COMPARAISON DE VALEURS
COMPARAISON DE VALEURS ATOMIQUES
Brahim ER-RAHA
 L’expression 5 gt 7
a la valeur false.
 L’expression <a>8</a> gt <b>9</b>
a la valeur false,
 L’expression nom = "Dupont"
a la valeur : true si le noeud contexte a un noeud fils
<nom>Dupont</nom> false sinon.
COMPARAISON DE VALEURS ATOMIQUES
Brahim ER-RAHA
Requête:
document("bib.xml")//book/author[la eq "Scholl"]
Résultat:
<author><la>Scholl</la><fi>M.</fi></author>
Requête:
document("bib.xml")//book[author/la eq "Scholl"]
Résultat:
ERROR
L’expression author/la dans le prédicat ne retourne pas une
valeur atomique mais une séquence de valeurs.
COMPARAISON DE VALEURS ATOMIQUES
Brahim ER-RAHA
exp1 = exp2
exp1 != exp2
exp1 < exp2
exp1 <= exp2
exp1 > exp2
exp1 >= exp2
Les comparateurs généraux ont une sémantique existentielle :
exp1 op exp2 a la valeur :
true s’il existe un item i1 dans la valeur de exp1 et un item i2
dans la valeur de exp2 tel que
i1 op i2 est vrai,
false sinon.
COMPARAISONS GÉNÉRALES
Brahim ER-RAHA
 L’expression
(1, 2) = (7, 2, 9, 12) a la valeur true
L’expression
5 > (2, 9, 3) a la valeur true
Si l’item contextuel est un noeud élément dont la
valeur est
<auteur>Dupont</auteur><auteur>Durand</auteur>
alors l’expression
auteur = "Dupont"
a la valeur true
COMPARAISONS GÉNÉRALES
Brahim ER-RAHA
exp1 is exp2
exp1 << exp2
exp1 >> exp2
 Les deux opérandes doivent avoir pour valeur, soit une
séquence vide, soit un noeud.
 Si l’un des opérandes a pour valeur la séquence vide, la
valeur de la comparaison est false.
 Si la valeur de exp1 est le noeud n1 et la valeur de exp2 est
le noeud n2 :
 exp1 is exp2 a la valeur true, si les noeuds n1 et n2 sont
les mêmes (même identifiant), sinon elle a la valeur false.
 exp1 << exp2 a la valeur true, si le noeud n1 précède le
nœud n2 dans l’ordre du document, sinon elle a la valeur
false.
 exp1 >> exp2 a la valeur true, si le noeud n1 suit le
nœud n2 dans l’ordre du document, sinon elle a la valeur
false.
Comparaisons de noeuds
Brahim ER-RAHA
Comparaisons de noeuds
L’expression /bib/book[@id="1"] << /bib/book[@id="2"]
a la valeur true
Brahim ER-RAHA
Comparaison de l’identité de deux noeuds : s1 is s2
s1 est identique à s2
Requête:
document("bib.xml")//book[author[2] is author[last()]]
Résultat:
<book title="Comprendre XSLT">
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
<publisher>O’Reilly</publisher>
<price>28.95</price>
</book>
Comparaisons de noeuds
Brahim ER-RAHA
Comparaison de la position de deux noeuds : s1<<s2 (s1>>s2)
s1 apparaît avant (après) s2 dans le document.
Requête:
<livre>
{ document("bib.xml")//book[author[la="Abiteboul"] <<
author[la="Suciu"]]/@title }
</livre>
Résultat:
<livre title="Data on the Web"/>
Comparaisons par la position
Brahim ER-RAHA
exp1 union exp2
exp1 | exp2
exp1 intersect exp2
Dans la séquence résultante :
 les doubles (noeuds de même identifiant) sont éliminés,
 les noeuds sont rangés dans l’ordre du document si le
mode ordered n’est pas spécifié.
Opérations sur les séquences de noeuds
Brahim ER-RAHA
L’expression doc("bib.xml")//(author | editor)
a pour valeur
la séquence des noeuds de type author et editor du document
bib.xml.
Brahim ER-RAHA
Opérations sur les séquences de noeuds
Brahim ER-RAHA
Requête:
<livre>
(:Le prix suivi des auteurs:) 'commentaire
{ document("bib.xml")//book[1]/(price,author) }
</livre>
Résultat:
<livre>
Le prix suivi des auteurs:
<price>28.95</price>
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
</livre>
On a changé l’ordre des noeuds (#union)
CONCATÉNATION DE SÉQUENCES
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Requête:
document("bib.xml")//author
Résultat:
<author><la>Amann</la><fi>B.</fi></author>,
<author><la>Rigaux</la><fi>P.</fi></author>,
<author><la>Rigaux</la><fi>P.</fi></author>,
<author><la>Scholl</la><fi>M.</fi></author>,
<author><la>Voisard</la><fi>A.</fi></author>,
<author><la>Abiteboul</la><fi>S.</fi></author>,
<author><la>Buneman</la><fi>P.</fi></author>,
<author><la>Suciu</la><fi>D.</fi></author>
Expressions de chemins
Brahim ER-RAHA
Expressions de chemins
Chaque étape est une expression XQuery (XPath 2.0) :
doc(“bib.xml”)/bib/book/author
doc(“bib.xml”)/bib//book[1]/publisher
doc(“bib.xml”)//book/(author, publisher) :résultat ?
doc(“bib.xml”)/(descendant::author,descendant::publisher) :
résultat ?
doc(“bib.xml”)//book/(@title union publisher)
doc(“bib.xml”)//book[position() lt last()]
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Le nom et le contenu sont calculés:
element { expr-nom } { expr-contenu }
attribute { expr-nom } { expr-contenu }
Requête:
element { document("bib.xml")//book[1]/name(*[1]) } {
attribute { document("bib.xml")//book[1]/name(*[3]) } {
document("bib.xml")//book[1]/*[3]
}
}
Résultat:
<title publisher="Addison-wesley"/>
Brahim ER-RAHA
Brahim ER-RAHA
La clause for $var in exp affecte la variable $var successivement avec
chaque item dans la séquence retournée par exp.
La clause let $var := exp affecte la variable $var avec la séquence
“entière” retournée par exp.
Requête:
for $b in document("bib.xml")//book[1]
let $al := $b/author
return <livre nb_auteurs="{count($al)}">
{ $al }
</livre>
Résultat:
<livre nb_auteurs="2">
<author><la>Amann</la><fi>B.</fi></author>
<author><la>Rigaux</la><fi>P.</fi></author>
</livre>
Affectation de variables: for et let (FLWOR)
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
La clause where exp permet de filtrer le résultat par rapport au résultat
booléen de l’expression exp (= prédicat dans l’expression de chemin).
Requête:
<livre>
{ for $a in document("bib.xml")//book
where $a/author[1]/la eq "Abiteboul"
return $a/@title
}
</livre>
Résultat:
<?xml version="1.0"?>
<livre title="Data on the Web"/>
SÉLECTION: WHERE
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Requête:
<livres>
{ for $b in document("bib.xml")//book
where $b/author/la = "Rigaux"
return
if ($b/@year > 2000)
then <livre recent="true"> {$b/@title} </livre>
else <livre> {$b/@title} </livre> }
</livres>
Résultat:
<?xml version="1.0"?>
<livres>
<livre title="Comprendre XSLT"/>
<livre recent="true" title="Spatial Databases"/>
</livres>
TESTS: IF-THEN-ELSE
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
some $var in expr1 satisfies expr2 il existe au moins un noeud
retourné par l’expression expr1 qui satisfait l’expression expr2.
every $var in expr1 satisfies expr2 tous les nœuds retournés
par l’expression expr1 satisfont l’expression expr2
Requête:
for $a in document("bib.xml")//author
where every $b
in document("bib.xml")//book[author/la = $a/la]
satisfies $b/publisher="Morgan Kaufmann Publishers"
return string($a/la)
Résultat:
Scholl, Voisard, Abiteboul, Buneman, Suciu
QUANTIFICATION
Brahim ER-RAHA
Brahim ER-RAHA
Expr1 sort by Expr2 (ascending | descending)?
Trier les éléments de la séquence retournée par l’expression Expr1 par
les valeurs retournées par Expr2.
Requête:
<livres>{ for $b in document("bib.xml")//book
return <livre> { $b/@title, $b/@year } </livre>
sort by(@year) }
</livres>
Résultat:
<livres>
<livre title="Data on the Web" year="2000"/>
<livre title="Spatial Databases" year="2001"/>
<livre title="Comprendre XSLT"/>
</livres>
TRIER AVEC SORT BY
Brahim ER-RAHA
Fichier d’adresses:
JOINTURE
Utilisation de plusieurs Document XML
Brahim ER-RAHA
Requête:
for $b in document("bib.xml")//book
return element livre {
attribute titre {$b/@title},
for $a in $b/author
return element auteur {
attribute nom {$a/la},
for $p in document("addr.xml")//person
where $a/la = $p/name
return attribute institut {$p/institution}
} }
JOINTURE: REQUÊTE
Brahim ER-RAHA
<livre titre="Comprendre XSLT">
<auteur nom="Amann" institut="CNAM"/>
<auteur nom="Rigaux"/>
</livre>,
<livre titre="Spatial Databases">
<auteur nom="Rigaux"/>
<auteur nom="Scholl" institut="CNAM"/>
<auteur nom="Voisard" institut="FU Berlin"/>
</livre>,
<livre titre="Data on the Web">
<auteur nom="Abiteboul"/>
<auteur nom="Buneman"/>
<auteur nom="Suciu"/>
</livre>
Résultat:
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
XQuery : Langage de
programmation
XQuery n'est pas seulement un langage de
requête "à la SQL".
C'est aussi un vrai langage de
programmation fonctionnel.
Il possède un certain nombre de
caractéristiques qui, couplées à quelques
extensions, en font un outil intéressant pour
du développement d'applications Web.
Nous allons évoquer ici quelques
caractéristiques de bases.
Déclaration de variables externes
Les variables externes sont déclarées de
la manière suivante :
◦ declare variable $v [as type] external;
◦ Exemple :
◦ declare variable $v as xs:double external;
Les types de variables
Les types, aussi bien pour les variables que
pour les signatures des fonctions, sont ceux
de XSD avec, en plus, des types spécifiques.
La figure(http://www.w3.org/TR/xpath-
functions/type-hierarchy.png ). les rappelle
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Requête:
<books> {
let $bl := document("bib.xml")//book
for $b in $bl
return <book> {
$b/@title,
attribute no {index-of($bl, $b)}}
</book> }
</books>
Résultat:
<?xml version="1.0"?>
<books>
<book title="Comprendre XSLT" no="1"/>
<book title="Spatial Databases" no="2"/>
<book title="Data on the Web" no="3"/>
</books>
EXEMPLE: INDEX-OF
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Pour exemple voir le diapo
présentationXquery
Brahim ER-RAHA
Brahim ER-RAHA
Pour exemple voir le diapo
présentationXquery
Avec base Xbase
dossier testxquery
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
DOM & SAX
Brahim ER-RAHA
Utilisation des Parseurs (DOM et SAX)
Il existe plusieurs types de parseur. Les deux plus répandus sont ceux qui utilisent un
arbre pour représenter et exploiter le document et ceux qui utilisent des événements. Le
parseur peut en plus permettre de valider le document XML.
Ceux qui utilisent un arbre permettent de le parcourir pour obtenir les données et
modifier le document. Ceux qui utilisent des événements associent à des méthodes
particulières pour traiter le document.
SAX (Simple API for XML) est une API libre créée par David Megginson qui utilisent
les événements pour analyser et exploiter les documents au format XML.
Les parseurs qui produisent des objets composant une arborescence pour représenter
le document XML utilisent le modèle DOM (Document Object Model) défini par les
recommandations du W3C.
Le choix d'utiliser SAX ou DOM doit tenir compte de leurs points forts et de leurs
faiblesses :
les avantages les inconvénients
DOM
parcours libre de l'arbre
possibilité de modifier la structure et le
contenu de l'arbre
gourmand en mémoire
doit traiter tout le document avant
d'exploiter les résultats
SAX
peut gourmand en ressources mémoire
rapide
principes faciles à mettre en oeuvre
permet de ne traiter que les données
utiles
traite les données séquentiellement
un peu plus difficile à programmer, il est
souvent nécessaire de sauvegarder des
informations pour les traiter
Brahim ER-RAHA
SAX et DOM ne fournissent que des définitions : ils ne fournissent pas d'implémentation
utilisable. L'implémentation est laissée aux différents éditeurs qui fournissent un parseur
compatible avec SAX et/ou DOM. L'avantage d'utiliser l'un deux est que le code utilisé
sera compatible avec les autres : le code nécessaire à l'instanciation du parseur est
cependant spécifique à chaque fournisseur.
- IBM fourni gratuitement un parseur XML : xml4j. Il est téléchargeable à l'adresse
suivante : http://www.alphaworks.ibm.com/tech/xml4j
- Le groupe Apache développe Xerces à partir de xml4j : il est possible de télécharger la
dernière version à l'URL http://xml.apache.org
- Sun a développé un projet dénommé Project X. Ce projet a été repris par le groupe
Apache sous le nom de Crimson.
Ces trois projets apportent pour la plupart les mêmes fonctionnalités : ils se distinguent
sur des points mineurs : performance, rapidité, facilité d'utilisation etc. ... Ces
fonctionnalités évoluent très vite avec les versions de ces parseurs qui se succèdent
très rapidement.
Pour les utiliser, il suffit de dézipper le fichier et d'ajouter les fichiers .jar dans la variable
définissant le CLASSPATH.
Il existe plusieurs autres parseurs que l'on peut télécharger sur le web:
JDOM (acronyme de l'anglais Java Document Object Model), est une bibliothèque open
source pour manipulation des fichiers XML en Java. Elle intègre DOM et SAX, et
supporte XPath et XSLT
Brahim ER-RAHA
XML: le traitement par programme
DOM
Manipulation
de l'arbre
Mal formé/Invalide
SAX
événements – call back
<ville>Paris</ville>
XML
<ville>Paris</ville>
<pays>France</pays>
<temp
echelle="C">18</temp>
Parser Bien formé
Valide
XSLT
PDF RTF, Word
(X)HTML
<city>Paris</city>
<temp
degree="F">65</t
emp>
WML XML
<ville>Paris</ville>
<pays>France</pays>
<temp
echelle="C">18</temp>
XML
XML
Schema
(ou DTD)
XSLFO
XSL
Stylesheet
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
DOM est l'acronyme de Document Object Model. C'est une spécification du W3C
pour proposer une API qui permet de modéliser, de parcourir et de manipuler un
document XML. Le principal rôle de DOM est de fournir une représentation
mémoire d'un document XML sous la forme d'un arbre d'objets et d'en permettre
la manipulation (parcours, recherche et mise à jour).
A partir de cette représentation (le modèle), DOM propose de parcourir le
document mais aussi de pouvoir le modifier. Ce dernier aspect est l'un des
aspects les plus intéressants de DOM.
DOM est défini pour être indépendant du langage dans lequel il sera
implémenté. DOM n'est qu'une spécification qui pour être utilisée doit être
implémentée par un éditeur tiers.
Il existe deux versions de DOM nommées «niveau» :
DOM Core Level 1 : cette spécification contient les bases pour manipuler un
document XML (document, élément et noeud)
DOM level 2 et 3
Le level 4 est en cours de développement
V-3-1 les objets de DOM
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
org.w3c.dom.Node
 La classe de base
 Tout objet DOM est un Node
 Methodes
 public Node getFirstChild();
 public java.lang.String getNodeName();
 public short getNodeType();
 public Node appendChild(Node newChild) throws
DOMException
 …
Brahim ER-RAHA
org.w3c.dom.NodeList
 Liste ordonnée de Node
 L’index commence à Zéro
 Méthodes
 public int getLength();
 public Node item(int index) ;
Brahim ER-RAHA
org.w3c.dom.NamedNodeMap
 Liste non ordonnée de Node
 Recherche par nom
 Méthodes
 public Node
getNamedItem(java.lang.String name);
 public Node setNamedItem(Node arg) throws
DOMException
 …
Brahim ER-RAHA
org.w3c.dom.Document
 Un objet de type Document représente le
document XML en cours de traitement
 Méthodes :
 public NodeList getElementsByTagName(String tagname)
 public Element getDocumentElement();
 public Attr createAttribute(String name) throws
DOMException
 public Text createTextNode(String data)
 public Comment createComment(String data)
 …
Brahim ER-RAHA
org.w3c.dom.Element
 Un objet de type Element représente un
élément du document XML
 Méthodes :
 public java.lang.String getAttribute(String name);
 public NodeList
getElementsByTagName(String name);
 public java.lang.String getTagName();
 …
Brahim ER-RAHA
org.w3c.dom.Attr
 Un objet de type Attr représente l’attribut d’un
élément du document XML
 Un objet de type Attr n’est pas le fils d’un objet
de type Element représentant l’élément qui
contient l’attribut (voir Node).
 Méthodes :
 public java.lang.String getName();
 public java.lang.String getValue();
 public void setValue(java.lang.String value) throws
DOMException
 …
Brahim ER-RAHA
org.w3c.dom.CharData
 Supertype de tout objet représentant du texte
 Méthodes :
 public String getData() throws DOMException
 public void setData(String data) throws DOMException
 public int getLength()
 public void appendData(String arg) throws
DOMException
 public void insertData(int offset, String arg) throws
DOMException
 …
Brahim ER-RAHA
org.w3c.dom.Text
 Hérite de CharData
 Représente La valeur textuelle
 D’un élément
 D’un attribute
 Deux objets Text consécutif seront uni lors
du prochain parsing
 Méthode :
 public Text splitText(int offset) throws
DOMException
Brahim ER-RAHA
org.w3c.dom.Comment
 Hérite de CharData
 Représente un commentaire XML
 Ne contient pas les balises
 <!- -
 - - >
Brahim ER-RAHA
org.w3c.dom.CDATASection
 Hérite de Text
 Représente une section littérale
 Ne contient pas les balises
 <![CDATA[
 ]]>
Brahim ER-RAHA
org.w3c.dom.DocumentType
 Les documents XML ont un attribut doctype qui
a pour valeur null ou un objet DocumentType
 Représente la liste des entitées définies pour le
document
 Méthodes :
 public NamedNodeMap getEntities()
 public java.lang.String getName()
 …
 Attention un DocumentType ne représente pas
la totalité de la DTD
Brahim ER-RAHA
org.w3c.dom.Entity
 Représente une Entité XML (parsable ou
non parsable)
 Représente l’entité et non pas la
déclaration
 Pas de trace de la valeur
 Méthodes :
 public java.lang.String getNotationName()
 public java.lang.String getSystemId()
 public java.lang.String getPublicId()
Brahim ER-RAHA
org.w3c.dom.EntityReference
 Représente une référence vers une entité
 Méthode :
 Aucune
 Sous-spécifié
Brahim ER-RAHA
Brahim ER-RAHA
Chaque élément qui compose l'arbre possède un type. Selon ce type, l'élément
peut avoir certains éléments fils comme le montre le schéma ci-dessus. Toutes les
classes et interfaces sont regroupées dans le package org.w3c.dom
Voir le projet Eclipse
XML-JDOM-DOM-SAX
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Architecture d'une application utilisant SAX :
Brahim ER-RAHA
l'application récupère un parseur (javax.xml.parsers.SAXParser) à partir
d'une fabrique de parseurs (javax.xml.parsers.SAXParserFactory).
Ce parseur parcourt le document XML grâce à un lecteur
(org.xml.sax.XMLReader). Ce dernier contient plusieurs
gestionnaires (ou handlers). Ce sont ces différents gestionnaires qui sont
chargés du traitement des "événements" lors du parsing.
Voici les quatres principaux types de handlers (interfaces du package
org.xml.sax) :
• Gestionnaire de Contenu : Le ContentHandler est chargé des événements
comme le début ou la fin du document, l'ouverture ou a fermeture de
balises ou encore la lecture de caractères.
• Gestionnaire d'Erreurs : Le ErrorHandler va traiter les trois types d'erreurs
possibles lors du parsing : les erreurs simples, les erreurs fatales et les
warnings.
• Gestionnaire de DTD : Le DTDHandler (Document Type Definition) gère les
événements relatifs aux DTD.
• Gestionnaire d'entités externes : L'EntityResolver est chargé de gérer les
entités externes, en fournissant une InputSource adéquate.
Brahim ER-RAHA
On ne doit pas implémenter les quatre types de handlers, Il faut utiliser
la classe DefaultHandler du package org.xml.sax.helpers. Le fonctionnement
de cette classe peut être comparé à celui des adapters pour les listeners (AWT
et Swing). C'est-à-dire que cette classe propose une implémentation par défaut
des quatres types de gestionnaires.
Voir l’exemple
Voir le projet Eclipse
XML-JDOM-DOM-SAX
Parseur SAX DOM
Pour traiter la totalité d’un document XML au
moment de sa lecture, il faut utiliser un parseur
SAX.
JDK fournit un parseur DOM et un parseur SAX qui
peuvent être utilisé sans passer par JDOM
Interpréter un fichier XML
SAX
import javax.xml.parsers.*;import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class SaxParser extends DefaultHandler {
public SaxParser() {
try {
SAXParserFactory parserFactory=SAXParserFactory.newInstance();
SAXParser saxParser=parserFactory.newSAXParser();
saxParser.parse("EX3.xml",this);
} catch (Exception e) { e.printStackTrace(); }
}
Interpréter un fichier XML
@Override
public void startDocument() throws SAXException {
System.out.println("Début Document");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// Début de chaque élément
System.out.println("Elément :"+qName);
System.out.println("t Attributs:");
for(int i=0;i<attributes.getLength();i++){
System.out.println("tt"+attributes.getQName(i)
+"="+attributes.getValue(i));
}
}
Interpréter un fichier XML
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// Fin de chaque élément
}
@Override
public void endDocument() throws SAXException {
// Fin du document
}
public static void main(String[] args) {
new SaxParser();
}
}
JDOM ?
JDOM est une API du langage Java développée
indépendamment de Sun Microsystems.
Elle permet de manipuler des donnés XML plus
simplement qu'avec les API classiques.
Son utilisation est pratique pour tout développeur Java et
repose sur les API XML de Sun.
JDOM permet donc de construire des documents, XML,
de naviguer dans leur structure, s'ajouter, de modifier, ou
de supprimer leur contenu.
Voir le projet Eclipse
XML-JDOM-DOM-SAX
Origines de JDOM
Les Parseurs SAX
◦ SAX est l'acronyme de Simple API for XML.
◦ Ce type de parseur utilise des événements pour piloter le traitement d'un
fichier XML.
◦ JDOM utilise des collections SAX pour parser les fichiers XML.
Les Parseurs DOM :
◦ DOM est l'acronyme de Document Object Model. C'est une spécification du W3C
pour proposer une API qui permet de modéliser, de parcourir et de manipuler
un document XML.
◦ Le principal rôle de DOM est de fournir une représentation mémoire d'un
document XML sous la forme d'un arbre d'objets et d'en permettre la
manipulation (parcours, recherche et mise à jour).
◦ A partir de cette représentation (le modèle), DOM propose de parcourir le
document mais aussi de pouvoir le modifier.
◦ Ce dernier aspect est l'un des aspect les plus intéressant de DOM.
◦ DOM est défini pour être indépendant du langage dans lequel il sera
implémenté.
◦ JDOM utilise DOM pour manipuler les éléments d'un Document Object Model
spécifique (créé grâce à un constructeur basé sur SAX).
Créer un document XML avec JDOM
L’API JDOM :
◦ Il vous faut dans un premier temps télécharger la dernière version de JDOM
disponible à cette adresse : http://www.jdom.org/dist/binary/.
◦ Il suffit ensuite de rendre accessible le fichier /build/jdom.jar, en le plaçant dans votre
classpath.
Création d’un document XML avec JDOM:
◦ La création d'un fichier XML en partant de zéro est des plus simple.
◦ Il suffit de construire chaque élément puis de les ajouter les uns aux autres de façon
logique.
◦ Un noeud est une instance de org.jdom.Element.
◦ Nous commençons donc par créer une classe JDOM1 qui va se charger de créer
l'arborescence suivante :
<personnes>
<etudiant classe="P2">
<nom>Katib</nom>
</etudiant>
</personnes>
Exemple d’application pour la création d’un document XML avec JDOM
import java.io.*;import org.jdom.*;
import org.jdom.output.*;
public class App1 {
public static void main(String[] args) throws IOException {
/*Créer l’élément racine */
Element racine = new Element("personnes");
/*Créer un document JDOM basé sur l’élément racine*/
Document document = new Document(racine);
/*Créer un nouveau Element xml etudiant */
Element etudiant = new Element("etudiant");
/* Ajouter cet élément à la racine */
racine.addContent(etudiant);
/*Créer un nouveau attribut classe dont la valeur est P2 */
Attribute classe = new Attribute("classe","P2");
/* Ajouter cet attrubut à l’élément etudiant */
etudiant.setAttribute(classe);
Element nom = new Element("nom"); /* Créer l’élément nom */
nom.setText("Katib"); /* Définir le texte de nom */
etudiant.addContent(nom); /* ajouter nom à etudiant */
/* Afficher et enregistrer le fichier XML */
XMLOutputter sortie=new XMLOutputter(Format.getPrettyFormat());
sortie.output(document, System.out);
sortie.output(document, new FileOutputStream("EX1.xml"));
}}
Parcourir un document XML avec JDOM
Parser un fichier XML revient à transformer un fichier XML en une arborescence
JDOM.
Nous utiliserons pour cela le constructeur SAXBuilder, basé, comme son nom
l'indique, sur l'API SAX.
Créez tout d'abord le fichier suivant dans le répertoire contenant votre future
classe JDOM2 :
<?xml version="1.0" encoding="UTF-8"?>
<personnes>
<etudiant classe="P2">
<nom>katib</nom>
<prenoms>
<prenom>mohamed</prenom>
<prenom>amine</prenom>
</prenoms>
</etudiant>
<etudiant classe="P1">
<nom>talbi</nom>
</etudiant>
<etudiant classe="P1">
<nom>santel</nom>
</etudiant>
</personnes>
Afficher les noms des étudiants du fichier XML
import java.io.*;import java.util.List;
import org.jdom.*;import org.jdom.input.SAXBuilder;
public class App2 {
public static void main(String[] args) throws Exception {
/* On crée une instance de SAXBuilder */
SAXBuilder sb=new SAXBuilder();
/* On crée un nouveau document JDOM avec en argument le fichier XML */
Document document=sb.build(new File("EX2.xml"));
/*On initialise un nouvel élément racine avec l'élément racine du
document.*/
Element racine=document.getRootElement();
/* On crée une List contenant tous les noeuds "etudiant" de l'Element
racine */
List<Element> etds=racine.getChildren("etudiant");
/* Pour chaque Element de la liste etds*/
for(Element e:etds){
/*Afficher la valeur de l'élément nom */
System.out.println(e.getChild("nom").getText());
}
}
}
Modifier une arborescence avec JDOM
Quelques méthodes de JDOM:
◦ addContent : Ajoute le contenu de l'argument à la fin du contenu d'un Element. On
peut spécifier un index pour l'inserer à la position voulu.
◦ clone : Retourne un clone parfait de l'Element.
◦ cloneContent : on ne copie que le contenu.
◦ removeAttribute : Supprime un attribut d'un Element
◦ removeChild : Supprime le premier enfant portant ce nom.
◦ removeChildren : Supprime tous les enfants ayant ce nom.
◦ removeContent : Supprime l'intégralité d'un noeud donné en argument ou par sa
position. removeContent accept aussi les filtres, tout comme getContent vu
précédement.
◦ setAttribute : permet à la fois de créer un attribut et d'en modifier sa valeur.
◦ setContent : Remplace le contenu d'un Element. On peut spécifier un index si l'on
ne veut pas tout remplacer.
◦ setName : Change le nom de l'Element.
◦ setText : Change le text contenu par l'Element. <element>TEXT</element>
◦ toString : Retourne une représentation de l'Element sous forme de chaine.
JDOM et XSLT
Grâce à l'API JAXP et TraX il est très
facile de faire des transformation XSLT
sur un document JDOM.
Dans l'exemple suivant nous allons créer
une méthode qui prend en entrée un
document JDOM et le nom d'un fichier
XSL et qui crée en sortie un fichier XML
transformé.
Fichier XML
<?xml version="1.0" encoding="UTF-8"?>
<personnes>
<etudiant classe="P2">
<nom>katib</nom>
<prenoms>
<prenom>mohamed</prenom>
<prenom>amine</prenom>
</prenoms>
</etudiant>
<etudiant classe="P1">
<nom>talbi</nom>
</etudiant>
<etudiant classe="P1">
<nom>santel</nom>
</etudiant>
</personnes>
Fichier XSL pour générer une sortie HTML
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head></head>
<body>
<table border="1" width="80%">
<tr>
<th>Nom</th><th>Prénoms</th>
</tr>
<xsl:for-each select="personnes/etudiant">
<tr>
<td><xsl:value-of select="nom"/></td>
<td><xsl:value-of select="prenoms/prenom[1]"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Exemple de transformation XSL avec
JDOM
import java.io.*; import org.jdom.*;
import org.jdom.input.SAXBuilder;
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamSource;
public class JDOM4{
public static void main(String[] args) {
SAXBuilder sb=new SAXBuilder();
try {
Document jDomDoc=sb.build(new
File("Exercice2.xml"));
outputXSLT(jDomDoc, "classe.xsl");
} catch (Exception e) {
e.printStackTrace();
}
}
Exemple de transformation XSL avec JDOM
public static void outputXSLT(org.jdom.Document documentJDOMEntree,String
fichierXSL){
/*Document JDOMResult, résultat de la transformation TraX */
JDOMResult documentJDOMSortie = new JDOMResult();
/* Document JDOM après transformation */
org.jdom.Document resultat = null;
try{
/* On définit un transformer avec la source XSL qui va permettre la
transformation */
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new
StreamSource(fichierXSL));
/* On transforme le document JDOMEntree grâce à notre transformer. La
méthoded transform() prend en argument le document d'entree associé au
transformer et un document JDOMResult, résultat de la transformation
TraX */
transformer.transform(new org.jdom.transform.JDOMSource
(documentJDOMEntree), documentJDOMSortie);
/* Pour récupérer le document JDOM issu de cette transformation, il faut
utiliser la méthode getDocument() */
resultat = documentJDOMSortie.getDocument();
/* On crée un fichier xml corespondant au résultat */
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
outputter.output(resultat, new FileOutputStream("resultat.htm"));
} catch(Exception e){}
}}
Fichier HTML généré : resultat.htm
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head />
<body>
<table border="1" width="80%">
<tr>
<th>Nom</th>
<th>Prénoms</th>
</tr>
<tr>
<td>CynO</td>
<td>Nicolas</td>
</tr>
<tr>
<td>Superwoman</td>
<td />
</tr>
<tr>
<td>Don Corleone</td>
<td />
</tr>
</table>
</body>
</html>
Application
1- Créer une application java qui permet
de créer le fichier XML suivant :
meteo.xml
<?xml version="1.0" encoding="UTF-8"?>
<meteo>
<mesure date="2006-1-1">
<ville nom="casa" temp="25" />
<ville nom="rabat" temp="28" />
</mesure>
</meteo>
Application
4 - Créer une feuille de style XSL qui permet de transformer le
document XML meteo2.xml en document HTML suivant :
5 - Créer une application java qui permet d’afficher la transformation du
fichier XML meteo2.xml par la feuille de style XSL que vous venez de créer.
Enregistrer la sortie dans un fichier m.htm
Brahim ER-RAHA
Brahim ER-RAHA
Voir les video projet eclipse : XML_JDOM_DOM_SAX
Brahim ER-RAHA
Brahim ER-RAHA
XML ET LES BASES DE DONNÉES
XML est devenu dans peu de temps le format standard de structuration et
d’échange de données le plus populaire. Ce métalangage est capable d’être le
format du stockage, du transport et d’affichage des données. Parallèlement, les
bases de données relationnelles constituaient depuis un bon moment et
constituent toujours le moyen le plus utilisé pour le stockage des données dans la
plupart des entreprises, et ce pour leur capacité de mettre à disposition d’un grand
nombre d’utilisateurs des données avec un accès rapide et un bon niveau de
sécurité.
Pour ces raisons et pour les avantages qu’offrent ces deux moyens, à savoir XML
et les SGBDs, plusieurs auteurs pensent que « l’utilisation combinée de ces deux
méthodes offre également au programmeur un grand nombre de possibilités.
D’une part, les bases de données relationnelles apportent une gestion et des
fonctionnalités de sécurité fiables…
d’autre part, dans la mesure où le langage XML est composé uniquement de
texte, il peut facilement être transmis sur un réseau, et d’une plate-forme à
l’autre… de plus, il peut facilement être traduit d’un langage à l’autre»
1 INTRODUCTION
Brahim ER-RAHA
Plusieurs raisons donc nous poussent à associer XML et les bases de données :
stocker des documents XML dans une base de données ou utiliser un contenu
d’une base de données au format XML :
- XML fournit une méthode de représentation des données structurées sans
ajout d’informations,
- XML permet la réutilisation des données par des systèmes d’héritage,
- XML peut être utilisé par des outils déjà disponibles (Feuilles de style : XSLT et
serveurs XML : ex : Biztalk…),
- XML, en contenant les données et la structure, permet facilement la
transmission et la représentation des données,
- Les bases de données sont plus adaptées que XML pour des utilisations
internes de recherche.
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
2- TRANSFORMATION BASÉE SUR LES TABLES
La correspondance basée sur des tables est utilisée par de nombreux logiciels qui
transfèrent les données entre une base relationnelle et un document XML. Elle modélise
les documents sous la forme d’une table unique ou comme un ensemble de tables. Cela
signifie que la structure d’un document XML doit être comme suit :
Selon le logiciel, il peut être possible de spécifier si la colonne de données est stockée
en tant qu’éléments fils ou comme attributs, ainsi que les noms à utiliser pour chaque
élément ou attribut. La correspondance basée sur des tables est utile pour sérialiser des
données relationnelles, comme par exemple pour transférer des données entre deux
bases de données relationnelles. Son inconvénient évident est qu’elle ne peut pas être
utilisée par les autres SGBD. (voir exemple pg :61)
<database>
<table>
<row>
<column1>...</column1>
<column2>...</column2>
...
</row>
...
</table>
<table>
...
</table>
...
</database>
Brahim ER-RAHA
Dans une base de données, il y a des différentes tables qui stockent chacune un
ensemble de données liées à une entité déterminée. Une table représentant une
adresse postale d’une personne par exemple peut être schématisée comme suit :
Cette table est créée, par le biais du langage SQL, comme suit :
Prénom Nom Rue Ville Code postale Pays
Omar Ramki Rue des Far Agadir 80000 Maroc
Create table PERSONNE (Prenom VARCHAR(35), Nom VARCHAR (35), Rue
VARCHAR (35), Ville VARCHAR (35), Code_postal VARCHAR (9), Pays
VARCHAR (35)) ;
XML permet deux moyens de représenter ces données : en utilisant des éléments
ou des attributs
Brahim ER-RAHA
En utilisant des éléments, nous pouvons présenter l’élément « Personne » comme
suit :
En utilisant des attributs, l’élément « Personne » peut être présenté comme suit :
<Personne>
<Prénom>Omar</Prénom>
<Nom>Ramki</Nom>
<Rue>Rue des FAR</Rue>
<Ville>Agadir</Ville>
<Code_postal>80 000</Code_postal>
<Pays>Maroc</Pays>
</Personne>
<Personne
Prénom="Omar"
Nom="Ramki"
Rue="Rue des FAR"
Ville="Agadir"
Code_postal="80 000"
Pays="Maroc"/>
Brahim ER-RAHA
Considérons le cas d'une base de données relationnelle qui contient deux tables en
relation à travers l'exemple suivant :
Le script qui permet de créer ces deux tables est le suivant :
CREATE TABLE PROPRIETAIRE (ID_Proprietaire BIGINT(100) NOT NULL,
Prenom_Owner VARCHAR(255) NOT NULL,Nom_Owner VARCHAR(255) NOT NULL,
Tel_Owner VARCHAR (25) NOT NULL, Email_Owner VARCHAR (255), Ville_Owner
VARCHAR (35) PRIMARY KEY (ID_Proprietaire));
CREATE TABLE MODELEXML (ID_Modele BIGINT(100) NOT NULL ,
Designation_Modele VARCHAR(255) NOT NULL, Version VARCHAR(255) NOT NULL,
Date_Version DATE NOT NULL, Mots_Cles TEXT, ID_Proprietaire BIGINT (100),
PRIMARY KEY (ID_Modele), FOREIGN KEY (ID_Proprietaire) REFERENCES
PROPRIETAIRE (ID_Proprietaire));
Brahim ER-RAHA
En XML, cette association des deux tables peut être illustrée par une imbrication en
éléments fils de la table référence.
< !ELEMENT PROPRIETE_MODELE (MODELEXML+)>
< !ATTLIST PROPRIETE_MODELE
Prenom_Owner CDATA #REQUIRED
Nom_Owner CDATA #REQUIRED
Tel_Owner CDATA #REQUIRED
Email_Owner CDATA #REQUIRED
Ville_Owner CDATA #REQUIRED>
<!ELEMENT MODELEXML EMPTY>
<!ATTLIST MODELEXML
Designation_Modele CDATA #REQUIRED
Version CDATA #REQUIRED
Date_Version CDATA #REQUIRED
Mots_Cles CDATA #REQUIRED>
Brahim ER-RAHA
Considérons le cas :
Brahim ER-RAHA
Le script qui permet de créer cette troisième table est le suivant :
CREATE TABLE PROPRIETAIRE (ID_Proprietaire BIGINT(100) NOT NULL,
Prenom_Owner VARCHAR(255) NOT NULL, Nom_Owner VARCHAR(255) NOT NULL,
Tel_Owner VARCHAR (25) NOT NULL, Email_Owner VARCHAR (255), Ville_Owner
VARCHAR (35), PRIMARY KEY (ID_Proprietaire));
CREATE TABLE ORGANISATION (ID-Organisation BIGINT (100) NOT NULL, om_Org
VARCHAR (35), Acronyme_Org VARCHAR (35), Tel_Org VARCHAR (25),
Site_Web_Org VARCHAR (255), Ville_Org VARCHAR (255), PRIMARY KEY
(ID_Organisation));
CREATE TABLE MODELEXML (ID_Modele BIGINT(100) NOT NULL,
Designation_Modele VARCHAR(255) NOT NULL, Version VARCHAR(255) NOT NULL,
Date_Version DATE NOT NULL, Mots_Cles TEXT, ID_Proprietaire BIGINT (100),
PRIMARY KEY (ID_Modele), FOREIGN KEY (ID_Proprietaire) REFERENCES
PROPRIETAIRE (ID_Proprietaire), FOREIGN KEY (ID_Organisation) REFRENCES
ORGANISATION (ID_Organisation));
Brahim ER-RAHA
< !ELEMENT DONNEES_MODELE (PROPRIETE_MODELE, ORGANISATION+)>
<!ELEMENT PROPRIETE_MODELE (MODELEXML+)>
< !ATTLIST PROPRIETE_MODELE Prenom_Owner CDATA #REQUIRED
Nom_Owner CDATA #REQUIRED Tel_Owner CDATA #REQUIRED
Email_Owner CDATA #REQUIRED Ville_Owner CDATA #REQUIRED>
<!ELEMENT MODELEXML EMPTY>
<!ATTLIST MODELEXML IDREFORGANISATION IDREF #REQUIRED
Designation_Modele CDATA #REQUIRED Version CDATA #REQUIRED
Date_Version CDATA #REQUIRED Mots_Cles CDATA #REQUIRED>
<!ELEMENT ORGANISATION EMPTY>
<!ATTLIST ORGANISATION ID_Organisation ID #RQUIRED
Nom_Org CDATA #REQUIRED Acronyme_Org CDATA #REQUIRED
Tel_Org CDATA #REQUIRED Site_Web_Org CDATA #REQUIRED
Ville_Org CDATA #REQUIRED>
Pour présenter cette relation plus complexe en XML, nous pouvons créer le
modèle de données suivant
Brahim ER-RAHA
Dans cette méthode, nous écrivons un modèle XML, qui va décrir exactement le modèle
cible, les données extraites de SGBD étant insérées dans cette structure. Nous utilisant
pour cela une API ODBC2XML qui est typique dans ce modèle (cette API est de type
Shareware).
Le modèle XML est un document XML bien formé dans le quel les requêtes SQL
apparaissent dans des instructions de traitement. Les données reçues de la connexion
ODBC en réponse à ces requêtes sont utilisées pour générer les éléments qui suivent
immédiatement l'instruction de traitement
2 EXTRACTION CONTROLÉE PAR UN MODÈLE XML
Exemple :
Supposons qu'on a la table "produits" suivante :
ProduitRef Nom Poids
R1 Oxava212 255
R2 Siripi314 300
R3 Siripi433 433
R4 Slim633 236
R5 Remoc500 652
Brahim ER-RAHA
Le modèle XML d'extraction de données est :
<?xml version="1.0"?>
<Catalogue>
<Titre> Voici le poids de chacun de nos produits : </Titre>
<Liste>
<?odbc2xml q1: select * from produits?>
<Produit id=" odbc2xml q1.ProduitRef ">
<Nom> <?odbc2xml q1.Nom?> <Nom>
<Poids> <?odbc2xml q1.Poids?> <Poids>
</Produit>
</Liste>
</Catalogue> <Catalogue>
<Titre> Voici le poids de chacun de nos produits :</Titre>
<Liste>
<Produit id=" R1 ">
<Nom> Oxava212<Nom>
<Poids>255 <Poids>
</Produit>
<Produit id=" R2 ">
<Nom> Siripi314<Nom>
<Poids>300 <Poids>
</Produit>
<Produit id=" R3 ">
<Nom> Siripi433<Nom>
<Poids>433 <Poids>
</Produit>
...</Liste></Catalogue>
Après avoir exécuter l'api ODBC2XML
, on obtiendra comme résultat :
Brahim ER-RAHA
Le modèle XML d'extraction de données est :
<?xml version="1.0"?>
<Catalogue>
<Titre> Voici le poids de chacun de nos produits : </Titre>
<ListeParFournisseur>
<?odbc2xml q1: select * from Fournisseur where ville="Casa"?>
<Fournisseur id=" odbc2xml q1.CodeFournisseur ">
<Nom> <?odbc2xml q1.NomFournisseur?> </Nom>
</Fournisseur>
<ListProduit>
<?odbc2xml q2: select * from Produit where CodeFournisseur = :
q1.CodeFournisseur ?>
<Produit id=" odbc2xml q1.ProduitRef ">
<Nom> <?odbc2xml q1.Nom?> <Nom>
<Poids> <?odbc2xml q1.Poids?> <Poids>
</Produit>
</ListeProduit>
</ListeParFournisseur></Catalogue>
Considérons la requête suivante : Select * from produit, fournisseurs
Where fournisseurs.ville="Casa"
And
Fournisseurs.CodeFournisseur=Produit.Co
deFournisseur

Cours XML_2019_final (1).ppt

  • 1.
  • 2.
    Brahim ER-RAHA Mr BrahimER-RAHA ENSA-Département Informatique 135 avenue des FAR 80 000 Agadir Maroc bureau 028-55-55-24 fax 061-55-55-55 Je veux envoyer ma carte de visite par courrier électronique On peut l'envoyer tel quel, dans le texte du courrier
  • 3.
    Brahim ER-RAHA Autre possibilité: A la réception, le lecteur humain saura décoder les différents champs de l'adresse Mr ER-RAHA Brahim ENSA-Département Informatique 135 avenue des FAR 80 000 Agadir Maroc bureau 028-55-55-24 fax 061-55-55-55
  • 4.
    Brahim ER-RAHA • ilfaut l'extraire du reste du texte => identification • il faut l'analyser FACILEMENT => moteur de recherche • il faut le vérifier FACILEMENT => validation • on doit pouvoir l'utiliser dans d'autres applications => portabilité • on doit pouvoir la transformer pour d'autres applications => format du numéro de téléphone. Plus difficile par un logiciel!
  • 5.
    Brahim ER-RAHA <carte> <!-- macarte de visite --> <nom préfixe="Mr">ER-RAHA</nom> <prénom>Brahim</prénom> <adresse> <site>ENSA-Département Informatique</site> <rue>135 avenue des FAR</rue> <ville>Agadir</ville> <code-postal>80 000</code-postal> <pays>Maroc</pays> </adresse> <téléphone type="bureau">028-55-55-24</téléphone> <téléphone type="fax">061-55-55-55</téléphone> </carte>
  • 6.
    Brahim ER-RAHA HTML estun langage pour présenter des informations à l’écran. 1. il ne permet pas d’échanger des données 2. il ne permet pas un traitement des données autre que l’affichage On ne sait pas interpréter des données fournies en HTM Le principal langage du Web est HTML Commerce électronique : les entreprises veulent échanger des informations (pas pour les afficher !) Moteur de recherche : si je sais interpréter les données transmises, je peux les indexer efficacement Services en ligne : je peux envoyer mes données à un serveur pour leur appliquer un traitement donné (ex : publication) Nouvelles utilisations du Web Quelques applications :
  • 7.
    Brahim ER-RAHA Le réseauest hétérogène : les données doivent être représentées indépendamment d’une machine donnée. Les applications sont variées : les données doivent être représentées indépendamment d’une application. Une application = un format de données : il faut pouvoir transformer facilement les données d’un format à un autre. Nouveaux besoins : échange et publication de données. Un document XML est au format ASCII : il voyage (relativement) facilement XML n’est pas lié à un mode d’utilisation : chacun peut se définir son propre « langage », (SMIL, SVG, WML, etc) Beaucoup d’outils de manipulation : DOM, SAX, XSLT, XPath, XQuery, etc Le langage XML est une réponse à ces besoins :
  • 8.
  • 9.
    Origine de XML StandardGeneralized Markup Language SGML HTML XML ( Sépare les données la structure des données et la mise en forme ) Hyper Text Markup Language ( Mélange les données et la mise en forme ) eXtensible Markup Language ( Sépare les données la structure des données et la mise en forme )
  • 10.
    Brahim ER-RAHA I- INTRODUCTION I-1Définition XML (eXtensible Markup Language et traduisez Langage à balises étendu, ou Langage à balises extensibles) est en quelque sorte un langage HTML amélioré permettant de définir de nouvelles balises. Il s'agit effectivement d'un langage permettant de mettre en forme des documents grâce à des balises (markup). En réalité les balises XML décrivent le contenu plutôt que la présentation (contrairement À HTML). Ainsi, XML permet de séparer le contenu de la présentation ce qui permet par exemple d'afficher un même document sur des applications ou des périphériques différents sans pour autant nécessiter de créer autant de versions du document que l'on nécessite de représentations XML a été mis au point par le XML Working Group sous l'égide du World Wide Web Consortium (W3C) dès 1996. Depuis le 10 fevrier 1998, les spécifications XML 1.0 ont été reconnues comme recommandations par le W3C, ce qui en fait un langage reconnu. (Tous les documents liés à la norme XML sont consultables et téléchargeables sur le site web du W3C, http://www.w3c.org/XML/)
  • 11.
    XML ? XML estun langage d’échange de données structurés entre applications de différents systèmes d’informations. Les données d’un fichier XML sont organisée d’une manière hiérarchique Les données d’un fichier XML peuvent provenir des bases de données relationnelles. (Documents XML Dynamiques) Les fichiers XML sont également utilisés en tant que fichiers de configuration d’une application. ( Documents XML Statiques ) Pour lire un fichier XML, une application doit utiliser un parseur XML. Un parseur XML est une API qui permet de parcourir un fichier XML en vue d’en extraire des données précises.
  • 12.
    XML est aucœur des systèmes d’informations Serveur d’application IIS Application .net Fichiers XML dont le contenu est généré Dynamiquement et povient d’une source De donnée comme une BD relationnelle Serveur d’application J2EE Application JEE XML SGBD SGBD XML Parser SQL Server Fichier.xml Client Leger Ajax Flash XML XML Parser Oracle Fichier.xml Fichier.xml Fichiers XML dont le contenu Est créés manuellement Pour configurer l’application
  • 13.
    Publication multi-supports XML Base de Données Applicationde publication (XSL) TV Numérique Pourquoi XML ? Middleware XMLizer Projet GIE Cartes Bancaires: publication des spécifications de protocoles pour réseau Carte Bancaires vers les fournisseurs et prestataires du GIE
  • 14.
    Échange de données:ETL Extractor JDBC JDBC Mapper BD relationnelle Datawarehouse Datamining Pourquoi XML ? Projet MEN : Echange de données avec les académies (remontée et descente)
  • 15.
    Gestion documents semistructurés Feuille de style XSL Feuille de style XSL Requêtes HTTP GET HTTP POST Requêtes Mapping XML-SQL Processeur XSL Feuille de style XSL HTML généré Serveur d’Applications Projet AMELI : Une application de serveur XML pour la saisie et la consultation de documents semi-structurés par internet/intranet Interface avec les applications bureautiques Amendemen t SGBDR Pourquoi XML ?
  • 16.
    XML EDI Échange B2BXML EDI XMLizer Internet (SOAP) Donneur d’ordre Fournisseur Pourquoi XML ? Projet EDIXML : Expérimentation de la chaîne pour un grand donneur d'ordres
  • 17.
    Forces et faiblessesde XML  Une technologie structurante  Clarifie tous les échanges  Des standards internes et externes  Transversale à l'entreprise  Échanges de données  Bureautique  GED  Sites Web  EDI  Bases de données  Intégration e-business  …  Une syntaxe bavarde  Un méta-langage, mais de nombreux langages  Coûteux en CPU  Parsing  Coûteux en mémoire  Instanciation  Format compressé à l’étude  XML Binaire Pourquoi XML ?
  • 18.
    Brahim ER-RAHA  Lalisibilité : aucune connaissance ne doit théoriquement être nécessaire pour comprendre un contenu d'un document XML  Autodescriptif et extensible  Une structure arborescente : permettant de modéliser la majorité des problèmes informatiques  Universalité et portabilité : les différents jeux de caractères sont pris en compte  Déployable : il peut être facilement distribué par n'importe quels protocoles à de transporter du texte, comme HTTP  Intégrabilité : un document XML est utilisable par toute application pourvue d'un parser (c'est-à-dire un logiciel permettant d'analyser un code XML)  Exensibilité : un document XML doit pouvoir être utilisable dans tous les domaines I-2 Avantages de XML Voici les principaux atouts de XML :
  • 19.
    Brahim ER-RAHA XML estparticulièrement adapté à l'échange de données et de documents. L'intérêt de disposer d'un format commun d'échange d'information dépend du contexte professionnel dans lequel les utilisateurs interviennent. C'est pourquoi, de nombreux formats de données issus de XML apparaissent (il en existe plus d'une centaine) : AML Astronomical Markup Language langage décrivant les différents types de données utilisées en astronomie. MathML Mathematical Markup Language notation mathématique sur le web CML Chemical Markup Language pour la publication Internet des formules chimiques, de molécules, des équations VML Vector Markup Language langage de balisage d’information graphique vectorielle. PGML Precision Graphics Markup Language décrit les structures de données graphiques complexes avec les primitives du langage Postscript. Il permet la conversion de documents aux formats ps et pdf en XML. SMIL Synchronized Multimedia Integration Language pour la création multimédia, il spécifie comment et quand des éléments multimédia peuvent apparaître dans une page web.
  • 20.
    Brahim ER-RAHA CDF ChannelDefinition Format utilisé par Microsoft pour décrire le contenu Active Channel. Une chaîne délivre des informations directement à l’utilisateur en utilisant la technologie push d’un serveur (envoi de contenus web à des utilisateurs sans que ceux-ci aient besoin d’accéder spécifiquement au site). Les chaînes fournissent des informations récentes aux utilisateurs qui peuvent sélectionner le contenu Web qu’ils souhaitent recevoir. RDF les applications traitant les données RDF peuvent récupérer les informations (auteur, URL, titre, description) et créer des bases de données permettant la recherche d’information. WML Wireless Markup Language le langage de balisage pour l’internet mobile
  • 21.
    Brahim ER-RAHA XML estun format de description des données et non de leur représentation, comme c'est le cas avec HTML. La mise en page des données est assurée par un langage de mise en page tiers. A l'heure actuelle (fin de l'année 2000) il existe trois solutions pour mettre en forme un document XML : CSS (Cascading StyleSheet), la solution la plus utilisée actuellement, étant donné qu'il s'agit d'un standard qui a déjà fait ses preuves avec HTML XSL (eXtensible StyleSheet Language), un langage de feuilles de style extensible développé spécialement pour XML. Toutefois, ce nouveau langage n'est pas reconnu pour l'instant comme un standard officiel XSLT (eXtensible StyleSheet Language Transformation). Il s'agit d'une recommandation W3C du 16 novembre 1999, permettant de transformer un document XML en document HTML accompagné de feuilles de style I-3 Mise en page de XML
  • 22.
    Brahim ER-RAHA XML fournitun moyen de vérifier la syntaxe d'un document grâce aux DTD (Document Type Definition). Il s'agit d'un fichier décrivant la structure des documents y faisant référence grâce à un langage adapté. Ainsi un document XML doit suivre scrupuleusement les conventions de notation XML et peut éventuellement faire référence à une DTD décrivant l'imbrication des éléments possibles. Un document suivant les règles de XML est appelé document bien formé. Un document XML possédant une DTD et étant conforme à celle-ci est appelé document valide. I-4 Structure des documents XML
  • 23.
    Brahim ER-RAHA XML permetdonc de définir un format d'échange selon les besoins de l'utilisateur et offre des mécanismes pour vérifier la validité du document produit. Il est donc essentiel pour le receveur d'un document XML de pouvoir extraire les données du document. Cette opération est possible à l'aide d'un outil appelé analyseur (en anglais parser, parfois francisé en parseur). Le parseur permet d'une part d'extraire les données d'un document XML (on parle d'analyse du document ou de parsing) ainsi que de vérifier éventuellement la validité du document. I-5 Décodage d'un document XML
  • 24.
    Structure d’un documentXML Un document XML se compose de 3 fichiers : Document XML Fichier XML DTD Qui contient Ou Les données Schémas XML Pour déclarer La structure Du fichier XML Feuille de style XSL Pour la présentation Des données du Fichier XML Le fichier XML stocke les données du document sous forme d’un arbre DTD ( Data Type Definition ) ou Schémas XML définit la structure du fichier XML La feuille de style définit la mise en forme des données de la feuille xml
  • 25.
    XML? Le parseur XMLpermet de créer une structure hiérarchique contenant les données contenues dans le document XML. Il existe deux types de parseurs XML: ◦ DOM (Document Object Model) : permet d’accéder et d’agir d’une manière directe sur le contenu et la structure de l’arbre XML. ◦ SAX (Simple API for XML) : permet de réagir sur le contenu et la structure d’une document XML pendant une lecture séquentielle.
  • 26.
    Brahim ER-RAHA Tout documentXML se compose :  d’un prologue, dont la présence est facultative mais conseillée. Il contiendra un certain nombre de déclarations. Le prologue peut contenir une déclaration XML, des instructions de traitement et une déclaration de type de document. Syntaxe : <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> Elle indique au programme qui va traiter le document : • la version du langage XML utilisée • le codage de caractères utilisé dans le document ; par défaut ISO 10646 mais le programme doit pouvoir traiter aussi l’UTF-8 et l’UTF-16. • l’existence ou non de déclarations extérieures au document qui doivent être prise en compte pour le traitement de celui-ci. La déclaration est facultative mais fortement conseillée. Chacune des trois informations est elle aussi facultative mais si elles apparaissent c’est obligatoirement dans cet ordre.  d’un arbre d’éléments. Il forme le contenu du document.  de commentaires et d’instructions de traitement, dont la présence est facultative. Ils pourront, moyennant certaines restrictions, apparaître aussi bien dans le prologue que dans l’arbre d’éléments. II DOCUMENT XML
  • 27.
  • 28.
    Quelques outils detravail DTD, Schéma, XSL, XPath XMLMind Editor XML Mind DTD, Schéma, XSL, XPath XMLMate Insight Soft. Schéma XML Junction Data Junction DTD, Schéma XSL, XQuery Oxygen SyncRO Ltd. DTD, Schéma XSL, XQuery XMLSpy Altova DTD, XSL, XQuery Schéma Turbo XML Tibco Support Outil Editeur IDE
  • 29.
    Exemple de documentXML <?xml version="1.0" encoding="UTF-8"?> <biblio> <etudiant code="1" nom="A" prenom="B" age="23"> <livre id="534" titre="java" datePret="2006-11-12" rendu="oui"/> <livre id="634" titre="XML" datePret="2006-11-13" rendu="non"/> </etudiant> <etudiant code="2" nom="C" prenom="D" age="22"> <livre id="33" titre="E-Commerce" datePret="2006-1-12" rendu="non"/> </etudiant> </biblio> biblio + etudiant @code @nom @prenom @age + livre @id @titre @datePret @rendu Biblio Etudiant Etudiant Etudiant livre livre livre Représentation graphique de l’arbre XML
  • 30.
    Brahim ER-RAHA Un documentXML est bien formé (l’analyseur XML peut construire son arborescence) si il suit les règles suivantes : a- Choisir le nom de nos propre balise Il y a quelques règles pour la composition des noms des balises : - Les noms peuvent contenir des lettres, des chiffres ou d'autres caractères. - Les noms ne peuvent débuter par un nombre ou un signe de ponctuation. - Les noms ne peuvent commencer par les lettres xml (ou XML ou Xml...). - Les noms ne peuvent contenir des espaces. - La longueur des noms est libre. - On évitera certains signes qui pourraient selon les logiciels, prêter à confusion comme "-", ";", ".", "<", ">", etc. On profitera de cette liberté dans les noms pour les rendre le plus descriptif possible comme par exemple <gras_et_italique>. II-1 Documents bien formés b- Les balises sont sensibles au majuscules et minuscules Ainsi, la balise <Message> est différente de la balise <message>. La balise d'ouverture et la balise de fermeture doivent donc être identiques. Ainsi par exemple ; <Message> ... </message> est incorrect et <message> ... </message> est correct. Une tendance se dégage pour n'écrire les balises qu'en minuscules, limitant ainsi les erreurs possibles.
  • 31.
    Brahim ER-RAHA Fini lesécritures bâclées du Html où l'on pouvait dans certains cas omettre la balise de fin comme pour le paragraphe <p> ou l'élément de liste <li>. Les éventuelles balises uniques ou appelées aussi balises vides, comme <br>, <meta> ou <img> en Html, doivent également comporter un signe de fermeture soit <balise/>. Ainsi une balise <meta/> est correcte en XML. c- Toute balise ouverte doit impérativement être fermée Le XML étant très préoccupé par la structure des données, des balises mal imbriquées sont des fautes graves de sens. Ainsi l'écriture suivante est incorrecte car les balises ne sont pas bien imbriquées : <parent><enfant>Omar</parent></enfant> L'écriture correcte avec une bonne imbrication des éléments est : <parent><enfant>Omar</enfant></parent> d- Les balises doivent être correctement imbriquées.
  • 32.
    Brahim ER-RAHA En fait,la première paire de balises d'un document XML sera considéré comme la balise de racine [root]. Par exemple : <racine> suite du document XML ... </racine> Par exemple : <parents> <enfants> <petits_enfants> ... </petits_enfants> </enfants> </parents> e- Tout document XML doit comporter une racine. Le XML peut avoir (comme le Html) des attributs avec des valeurs. En XML, les valeurs des attributs doivent obligatoirement être entre des guillemets, au contraire du Html où leur absence n'a plus beaucoup d'importance. Ainsi, l'écriture suivante est incorrecte car il manque les guillemets. <date anniversaire=071185> La bonne écriture est : <date anniversaire="071185"> f- Les attributs des éléments
  • 33.
    Brahim ER-RAHA <test> <code xml:space="preserve">Iciles espaces ainsi que les sauts de ligne sont préservés </code> <code xml:space="default"> les espaces ainsi que les sauts de ligne sont traités suivant le mode par défaut de l'application XML. </code> </test> g- Attributs prédéfinis Exemple1 : Exemple2 : <test> <code xml:lang="fr">Ici, du français</code> <code xml:lang="fr-FR">Ici, il n'y a pas une seule bogue</code> <code xml:lang="fr-CA">Ici, il n'y a pas un seul bogue</code> <code xml:lang="en-GB">Watercolour</code> <code xml:lang="en-US">Watercolor</code> </test>
  • 34.
    Brahim ER-RAHA Un élémentpeut contenir d’autres éléments, des données, des références à des entités, des sections littérales et des instructions de traitement. Un élément peut avoir un contenu récursif, c’est à dire qu’il peut contenir une instance du même type d’élément que lui-même. Les données des éléments peuvent contenir tous les caractères autorisés sauf le et commercial & et le inférieur <. Mais on peut toujours utilisé la section CDATA, Par exemple : <test> <code><![CDATA[Ici on peut mettre ce que l'on veut, < ou &, sans problèmes, sauf la chaîne ]]>, bien sûr </code> </test> h- Contenu d’un élément
  • 35.
    Brahim ER-RAHA Un auteurpeut vouloir insérer un caractère non disponible sur sa plate-forme ou son clavier. Il utilise pour cela le numéro du caractère dans les tables ISO 10646 ou Unicode. Ce numéro sera précédé des caractères &# puis suivi d’un point virgule ;. Le numéro peut être donné en décimal ou en hexadécimal (dans ce cas on le préfixe par &#x). Par exemple &#38; ou &#x2267; correspond au caractère et commercial & j- Référence à des caractères ou à des idéogrammes k- Référence à des entités prédéfinies Il existe quelques entités prédéfinies afin de faciliter leur insertion dans un document XML. Il s’agit notamment des caractères <, >, &, ‘ et « &lt; < &gt; > &amp; & &apos; ‘ &quot; "
  • 36.
    Brahim ER-RAHA Des commentairespeuvent être insérés dans les documents. Ils sont encadrés pas les marques de début <!-- et de fin --> de commentaire. Syntaxe : <!-- commentaire --> Le corps du commentaire peut contenir n’importe quel caractère à l’exception de la chaîne --. On ne peut donc pas inclure un commentaire dans un autre. Le commentaire ne peut pas non plus être inclus à l’intérieur d’une balise. l- Les commentaires
  • 37.
    Brahim ER-RAHA XML permetd'utiliser un fichier afin de vérifier qu'un document XML est conforme à une syntaxe donnée. La norme XML définit ainsi une définition de document type appelée DTD (Document Type Definition), c'est-à-dire une grammaire permettant de vérifier la conformité du document XML. La norme XML n'impose pas l'utilisation d'une DTD pour un document XML, mais elle impose par contre le respect exact des règles de base de la norme XML. Document Valide : pour un document XML bien formé, fait référence a une DTD et il se conforme à elle. Document Bien Formé : pour un document XML ne comportant pas de DTD mais répondant aux règles de base du XML Une DTD peut être définie de 2 façons: sous forme interne : c'est-à-dire en incluant la grammaire au sein même du document sous forme externe : soit en appelant un fichier contenant la grammaire à partir d'un fichier local ou bien en y accédant par son URL II-2 Document XML validé
  • 38.
    Brahim ER-RAHA a- DTDinterne Un document valide peut inclure directement sa DTD dans sa déclaration de type. L'attribut standalone doit prendre la valeur yes, indiquant ainsi que le document est complet et qu'aucune déclaration externe ne doit être recherchée. Exemple : <?xml version="1.0" standalone="yes" ?> <!DOCTYPE carte [ <!ELEMENT carte (#PCDATA)> ]> <carte>As de pique</carte> b- DTD externe Le document peut aussi faire référence à une DTD stockée dans une entité externe. L'avantage est alors la réutilisation possible de la DTD. Exemple : Fichier jeu.xml <?xml version="1.0" standalone="no" ?> <!DOCTYPE carte SYSTEM "carte.dtd"> Fichier carte.dtd <carte>As de pique</carte> II-3 Utilisation des DTD
  • 39.
    Brahim ER-RAHA La déclarationde type de document indique, le cas échéant, la DTD à laquelle se conforme le document. Elle permet aussi de spécifier certaines déclarations propres au document. La syntaxe de déclarations est : Syntaxe : <!DOCTYPE Racine [ déclarations ]> Racin : est le nom de l’élément racine de document XML. Déclarations : ils contient la définition de tous les éléments constituant le document XML. Il s’agit de :  les éléments types, i.e. elle donne les noms de tous les éléments et leur modèle de contenu ;  les attributs pour chaque élément (nom, type et valeur par défaut) ;  les entités et les notations qui servent à identifier les types spécifiques de données externes. 1- Syntaxe d’utilisation d’une DTD
  • 40.
    Brahim ER-RAHA La syntaxede déclaration d’un élément est la suivante : <!ELEMENT nom_element modele_de_contenu> Élément vide Un élément vide ne contient aucun texte, aucun autre élément, comme les éléments IMG, HR, BR de HTML. <!ELEMENT nom_element EMPTY> Par exemple, dans la DTD de XHTML 1.0 l’élément img est déclaré : <!ELEMENT img EMPTY> 2 Déclaration des éléments Élément non vide Un élément non vide est formé d’une balise ouvrante, d’un contenu et d’une balise fermante. Pour décrire ce contenu dans la DTD on utilise un modèle de contenu dans la déclaration d’éléments
  • 41.
    Brahim ER-RAHA Données Si l’élémentcontient uniquement des données (autrement dit, s’il n’y a aucun autre élément inclus dans cet élément) on utilise le type #PCDATA qui signifie Parsed Character DATA i.e. données caractères analysées : <!ELEMENT nom_element (#PCDATA)> Conteneur d’éléments Si l’élément contient uniquement d’autres éléments, le modèle de contenu définit les éléments pouvant être inclus dans un élément donné et spécifie également les éléments devant apparaître obligatoirement, leur ordre et leur fréquence. Les parenthèses dans la déclaration d’élément introduisent les éléments enfants de l’élément défini. L’ordre dans lequel les éléments sont précisés est l’ordre dans lequel ils doivent apparaître dans l’élément en cours de définition. Pour indiquer des choix, il est possible d’utiliser le |. Les indicateurs d’occurrences sont les suivants : ? = 0 ou 1 fois * = 0 ou n fois + = au moins une fois
  • 42.
    Brahim ER-RAHA Mixte Si l’élémenta un contenu mixte (données + éléments) il est possible d’utiliser PCDATA et les éléments imbriqués. Dans le cas d'un modèle mixte (Données textuelles et balises) • #PCDATA est toujours en première position • le modèle se termine par le caractère de répétition '*‘ <!ELEMENT mixedElement (#PCDATA | inlineElement1 | inlineElement2 )*> Élément libre Élément qui peut contenir tout élément déclaré dans la DTD et du texte. <!ELEMENT nom_element ANY> O p é r a t e u r S i g n i f i c a t i o n E x e m p l e + L ' é l é m e n td o i tê t r ep r é s e n ta u m i n i m u m u n ef o i s A + * L ' é l é m e n tp e u tê t r ep r é s e n tp l u s i e u r sf o i s( o u a u c u n e ) A * ? L ' é l é m e n tp e u tê t r eo p t i o n n e l l e m e n tp r é s e n t A ? | L ' é l é m e n tA o u B p e u v e n tê t r ep r é s e n t s( p a sl e sd e u x ) A | B , L ' é l é m e n tA d o i tê t r ep r é s e n te ts u i v id el ' é l é m e n tB A , B ( ) L e sp a r e n t h è s e sp e r m e t t e n td er e g r o u p e rd e sé l é m e n t sa f i n d el e u ra p p l i q u e rl e s a u t r e so p é r a t e u r s ( A , B ) +
  • 43.
    Brahim ER-RAHA <bibliothèque> <livre> <titre>N ouM</titre> <auteur>Agatha Christie</auteur> <ref>Policier-C-15</ref> </livre> <livre> <titre>Le chien des Baskerville</titre> <auteur>Sir Arthur Conan Doyle</auteur> <ref>Policier-D-3</ref> </livre> <livre> <titre>Dune</titre> <auteur>Franck Heckbert</auteur> <ref>Fiction-H-1</ref> </livre> </bibliothèque> Proposer une DTD qui valide ce document ?
  • 44.
    Brahim ER-RAHA Le rôlede la déclaration d’attributs est de donner pour un élément cible :  les noms d’attributs permis ;  le type de chaque attribut ;  la valeur par défaut de l’attribut. <!ATTLIST element_cible nom_attribut type_attribut valeur_par_défaut> 3- Déclaration d’attribut Valeur par défaut La valeur par défaut est la valeur prise par l’attribut si aucune valeur n’est précisée dans l’élément. Cette valeur doit être du même type que celui donné à l’attribut.  "une simple chaîne de caractères"  #REQUIRED = obligatoire, i.e. la valeur d’attribut doit être spécifiée lorsque l’élément est utilisé dans le document  #IMPLIED = facultatif, i.e. la valeur d’attribut peut rester non spécifiée  #FIXED ‘val’ = fixée à ‘val’ i.e. la valeur de l’attribut est fixe et ne peut pas être modifiée par l’utilisateur
  • 45.
    Brahim ER-RAHA Types dedonnées - chaînes de caractères CDATA Le type d'attribut CDATA indique que la valeur de l'attribut sera une chaîne de caractères prise littéralement, c'est à dire sans reconnaissance et traitement des caractères spéciaux de la syntaxe XML. <!ATTLIST element_cible nom_attribut CDATA valeur_par_défaut> - Énumérations <!ATTLIST element_cible nom_attribut (val1 | val2 | ... | valN) « valdefaut »> Ce type d'attribut permet de spécifier la liste des valeurs qu'il peut prendre dans un document. Il est également possible d'indiquer une valeur par défaut. -Identificateurs <!ATTLIST element_cible nom_attribut ID> <!ATTLIST element_cible nom_attribut IDREF> Un attribut de type ID représente un identificateur unique d’élément, i.e. un attribut dont la valeur distingue l’élément de tous les autres dans le document XML courant Notons que cet attribut prend généralement le nom id Un attribut ID ne peut être que du type REQUIRED
  • 46.
    Brahim ER-RAHA <?xml version="1.0"encoding="UTF-8"?> <!--DOCTYPE operateur SYSTEM "abonnementVrai.dtd"--> <operateur> <client code="1" nom="hassouni"> <abonnement num="123" type="GSM" dateAb="2006-1-11"> <facture numFact="432" dateFact="2006-2-11" montant="350.44" reglee="oui"/> <facture numFact="5342" dateFact="2006-3-11" montant="450" reglee="oui"/> <facture numFact="5362" dateFact="2006-4-13" montant="800.54" reglee="non"/> </abonnement> <abonnement num="2345" type="FIXE" dateAb="2006-12-1"> <facture numFact="5643" dateFact="2007-1-12" montant="299" reglee="oui"/> <facture numFact="6432" dateFact="2007-2-12" montant="555" reglee="non"/> </abonnement> </client> <client code="2" nom="abbassi"> <abonnement num="7543" dateAb="2006-12-1" type="GSM"> <facture numFact="7658" dateFact="2007-2-12" montant="350.44" reglee="oui"/> <facture numFact="7846" dateFact="2007-3-12" montant="770" reglee="non"/> </abonnement> </client> </operateur> Un opérateur Télécom fournit périodiquement, à l’opérateur de réglementation des télécoms ANRT un fichier XML qui contient les clients de cet opérateur. Chaque client possède plusieurs abonnements et chaque abonnement reçoit plusieurs factures. Un exemple de fichier XML correspondant à ce problème est le suivant :
  • 47.
    Travail demandé 1. 2. 3. 4. Faire unereprésentation graphique de l’arbre XML. Ecrire une DTD qui permet de valider ce document XML Créer le fichier XML Ecrire une feuille de style XSL qui permet de transformer le document XML en une page HTML qui permet d’afficher pour chaque client la liste de ses abonnement en affichant le montant total des factures de chaque abonnement
  • 48.
    Corrigé : DTDoperateur +client @code @nom +abonnement @num @type @dateAb +facture @numFact @dateFact @montant @reglee <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT operateur (client+) > <!ELEMENT client (abonnement+) > <!ELEMENT abonnement (facture+) > <!ELEMENT facture EMPTY > <!ATTLIST client code NMTOKEN #REQUIRED nom CDATA #REQUIRED> <!ATTLIST abonnement num NMTOKEN #REQUIRED type (GSM|FIXE) 'FIXE' dateAb CDATA #REQUIRED> <!ATTLIST facture numFact NMTOKEN #REQUIRED dateFact CDATA #REQUIRED montant CDATA #REQUIRED reglee (oui|non) 'non'>
  • 49.
    <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head></head> <body> <xsl:for-each select="operateur/client"> <h3> Nom Client : <xsl:value-of select="@nom"/> </h3> <table border="1" width="80%"> <tr> <th>Num</th><th>Type</th><th>Date</th><th>Total Factures</th> </tr> <xsl:for-each select="abonnement"> <tr> <td><xsl:value-of select="@num"/></td> <td><xsl:value-of select="@type"/></td> <td><xsl:value-of select="@dateAb"/></td> <td><xsl:value-of select="sum(facture/@montant)"/></td> </tr> </xsl:for-each> </table> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
  • 50.
    Brahim ER-RAHA -Attribut ENTITYou ENTITIES Les types ENTITY et ENTITIES représentent un nom / une liste de noms d’entités séparées par des blancs, non-XML précédemment déclarées dans la DTD. C’est utilisé par exemple pour établir un lien avec une image. Exemple : <!ATTLIST image source ENTITY #REQUIRED> <!ENTITY vacances SYSTEM " plage.gif"> qui sera utilisé dans le document XML : <image source="vacances"/> -Attributs NMTOKEN ou NMTOKENS Le type d'attribut NMTOKEN permet d'indiquer que l'attribut de l'élément peut prendre comme valeur un nom symbolique composé uniquement de caractères alphanumériques. Exemple : <-- Dans une DTD --> <!ELEMENT livre EMPTY> <!ATTLIST livre code_editeur NMTOKEN #REQUIRED> <-- Dans le corps du document --> <livre code_editeur="G09052" />
  • 51.
    Brahim ER-RAHA -Attribut NOTATION NOTATIONsignifie que l’attribut attend une notation qui apparaît dans la DTD dans une déclaration NOTATION Si une liste de valeurs est préfixée par le mot NOTATION les notations listées comme des valeurs possibles doivent toutes avoir déjà été déclarées : Exemple : <!ATTLIST image type NOTATION(GIF | JPEG | PNG) " GIF "> 4- Déclaration d’entité Chaque entité XML est définie dans une DTD. Les entités spécifiques au document sont présentes dans sa DTD interne (images, autres documents non XML, caractères spécifiques). Une entité est un alias associant un nom à un groupe de données. Ces données peuvent prendre un ou plusieurs formats
  • 52.
    Brahim ER-RAHA - Entitésparamètres <!ENTITY % nom « chaîne_de_remplacement »> Ces entités apparaissent uniquement dans les DTD. Ce sont des raccourcis vers des parties de déclarations de la DTD. Exemple : <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE article [ <!ENTITY % fich-dtd-1 SYSTEM "fichier-1.dtd"> <!ENTITY % fich-dtd-2 SYSTEM "fichier-2.dtd"> %fich-dtd-1; %fich-dtd-2; <!ENTITY % texte "#PCDATA"> <!ELEMENT nom (%texte;)> <!ELEMENT prénom (%texte;)> .. ]>
  • 53.
    Brahim ER-RAHA - Entitéscaractères la syntaxe de déclaration est :<!ENTITY nom "&#code;"> Les entités caractères sont des caractères réservés du XML représentés sous forme d'entités générales afin de pouvoir les insérer dans le document XML. Voici la liste des entités caractères principales : Entité caractère Représentation &amp; & &lt; < &gt; > &apos; ' &quot; " Il est également possible de définir des entités caractères pour n'importe quel caractère en utilisant le code hexadécimal du caractère : <! ENTITY nome "&#xCODEHEXA;"> Par exemple <! ENTITY ccedille "&#x00E7;"> <!ENTITY CopieRight "&#169;"> <!ENTITY Delta "&#948;" > Dans le document l’appel s’effectue avec &nom; <code> le petit Delta est : &Delta;</code>
  • 54.
    Brahim ER-RAHA -Entités générales Lesentités générales permettent de définir des éléments pouvant être substitués dans le corps du document XML (bien qu'ils soient définis au sein de la DTD et non du document XML lui-même). La syntaxe d'une entité générale est la suivante : <! ENTITY nom_de_l_entite "Contenu de l'entite"> Il est par exemple possible de déclarer l'entité générale suivante dans la DTD : <! ENTITY site "commentcamarche.net"> Les entités définies dans la DTD peuvent ainsi être utilisées dans le code XML en les appelant avec la syntaxe suivante : &nom_de_l_entite; La déclaration précédente pourra donc donner un document XML du style: <personne> <nom>Pillou</nom> <prenom>Jean-Francois</prenom> <site>&site;</site> <email>webmaster@&site;</email> </personne>
  • 55.
    Brahim ER-RAHA Entités externes Lesentités générales peuvent aussi être contenues dans un fichier extérieur (afin d'être utilisé par plusieurs DTD par exemple), on parle alors d'entité externe. La syntaxe d'une entité externe est la suivante : <! ENTITY nom_de_l_entite SYSTEM "nom_du_fichier"> Dans l'exemple suivant, le contenu du fichier ccm.txt (situé dans le même répertoire que la DTD) sera inséré dans le fichier XML à chaque fois que l'entité &ccm; sera rencontrée : <! ENTITY ccm SYSTEM "ccm.txt"> Les entités externes représentent des données contenues dans des fichiers séparés par rapport au document XML.  Analysées <!ENTITY nom SYSTEM « URL »>
  • 56.
    Brahim ER-RAHA <!DOCTYPE bookSYSTEM « book.dtd » [ <!ENTITY toc SYSTEM « toc.xml »> <!ENTITY chap1 SYSTEM « chapters/c1.xml »> <!ENTITY chap2 SYSTEM « chapters/c2.xml »> <!ENTITY index SYSTEM « index.xml »> ]> <book> <head>&toc;</head> <body> &chap1; &chap2; &index; </body> </book> Exemple :
  • 57.
    Brahim ER-RAHA Non analysées Lasyntaxe de déclaration est : <!ENTITY nom SYSTEM « URI » NDATA type_notation> Les entités externes non analysées permettent de déclarer un contenu non XML dans le document XML (fichiers binaires images, sons...). Ces entités requièrent en particulier une notation. Une notation identifie le format, ou type, des ressources auxquelles se réfère l’entité. Voici un exemple : <!ENTITY Image SYSTEM « Image02.Gif » NDATA GIF> Cette déclaration d’entité signifie littéralement, l’entité Image est un fichier binaire dans la notation GIF. Le mot clé NDATA (Notation DATA) précise le type d’entité non analysée que le processeur XML doit traiter. < !NOTATION GIF SYSTEM « /utils/Gifview.exe »> indique au processeur XML
  • 58.
    Brahim ER-RAHA III MODELESCHAMA XML Dans le paragraphe précédent nous avons vu la syntaxe et la déclaration d'une DTD au ceint d'un document XML. Néanmoins, les DTD présentent des inconvénients : - Ce n'est pas une application XML: il utilise une syntaxe dédiée - Les types de données sont limités - Le contrôle du nombre d'occurrences est limité par les opérateurs ?,+,* - Ils ne tiennent pas compte des espaces de noms (namespaces) - La modularisation est limitée à la notion d'entité En remplacement, le consortium W3 a défini la notion de schéma, qui utilise la notation XML. (2 mai 2001). Un schéma doit permettre de spécifier le même genre d'information qu'une DTD, c'est-à-dire la syntaxe d'une classe de documents XML, en définissant les éléments et attributs ainsi que les contraintes sur les valeurs de ceux-ci. La validation d'un document XML au moyen d'un schéma englobe : - La validité du modèle de contenu (structure) - La validité des types de données
  • 59.
    Brahim ER-RAHA Les schémaspeuvent être utilisés avec ou sans espace de nom. Sans espace de nom associé, l'élément racine d'un schéma a la forme suivant : <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> </xs:schema> l'assignation de ce type de document Schema dans un documnet XMLde racine Root afin de le valider se fait comme suit : <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="modele.xsd"> </Root> où modele est le nom du fichier contenant le schéma. III-1 Syntaxe de Déclaration d'un Schema 1- Sans espace de nom
  • 60.
    Brahim ER-RAHA Si unschéma définit un espace de nom, son élément racine définit les attributs suivants : -targetNamespace="URI", pour définir l'espace de nom dans lequel le schéma définit ses éléments -xmlns="URI", l'espace de nom par défaut (souvent identique à targetNamespace) -elementFormDefault et attributeFormDefault pour déterminés si les éléments (resp. les attributs), par défaut, sont qualifiés l'assignation de ce type de document Schema dans un document XML de racine Root afin de le valider se fait comme suit : <Root xmlns="URI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance“ xsi:schemaLocation="URI Modele.xsd"> </Root> 2- Schéma avec espace de nom
  • 61.
    Brahim ER-RAHA Voir ledossier Exemple cours XML
  • 62.
    Brahim ER-RAHA Les élémentssont les principaux composant d'un document schema.  Un élément ne contenant pas de sous-élément ni d'attribut est considéré comme étant de type simple (p.ex. <auteur>Bertrand Ibrahim</auteur>).  Un élément contenant soit des sous-éléments (p.ex. <titre> Un journaliste <souligne> accuse </souligne>, ...</titre>), soit des attributs, ou même les deux à la fois est considéré de type complexe. Il y a trois formes de déclaration d'élément - <xs:element name=" LeNomDeMonElement "> ... simple or complex type definition </xs:element> - <xs:element name="LeNomDeMonElement" type="LeTypeDeContenuDeCetElement "/> -<xs:element ref=" LeNomDeMonElement "/> Avec name représente le nom de l'élément et type détermine le type de son contenue III-1 Déclaration des éléments dans un Schema
  • 63.
    Brahim ER-RAHA Les élémentspeuvent avoir un continue simple de l'un des tes types prédéfinis suivants : string, boolean, byte, int, integer, long, float, double, date, time, Name (un nom conforme à XML), anyURI Exemple : <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="Prix" type="xs:decimal"/> </xs:schema> <Prix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:Untitled2.xsd">192.25</Prix> ---------------------------------------------------------------------------------------------------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="DateNaissance" type="xs:date"/> </xs:schema> <DateNaissance xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:Untitled3.xsd">1923-12-05</DateNaissance> a- Définition des types simples a-1 Type simple prédéfini
  • 64.
    Les types simples(1)  string  Confirm this is electric  normalizedString  Confirm this is electric  token  Confirm this is electric  byte  -1, 126  unsignedByte  0, 126  base64Binary  GpM7  hexBinary  0FB7  integer  -126789, -1, 0, 1, 126789  positiveInteger  1, 126789  negativeInteger  -126789, -1  nonNegativeInteger  0, 1, 126789  nonPositiveInteger  -126789, -1, 0  int  -1, 126789675  unsignedInt  0, 1267896754 Schema
  • 65.
    Les types simples(2)  long  -1, 12678967543233  unsignedLong  0, 12678967543233  short  -1, 12678  unsignedShort  0, 12678  decimal  -1.23, 0, 123.4, 1000.00  float  -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN  double  -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN  boolean  true, false 1, 0  time  13:20:00.000, 13:20:00.000- 05:00  dateTime  1999-05-31T13:20:00.000- 05:00  duration  P1Y2M3DT10H30M12.3S  date  1999-05-31  gMonth  --05--  gYear  1999 Schema
  • 66.
    Les types simples(3)  gYearMonth  1999-02  gDay  ---31  gMonthDay  --05-31  Name  shipTo  QName  po:USAddress  NCName  USAddress  anyURI  http://www.example.com/,  http://www.example.com/doc.html#ID 5  language  en-GB, en-US, fr  ID  "A212"  IDREF  "A212"  IDREFS  "A212" "B213"  ENTITY  ENTITIES  NOTATION  NMTOKEN, NMTOKENS  US  Brésil Canada Mexique Schema
  • 67.
    Brahim ER-RAHA Les typessimples personnalisés peuvent être utilisés soit :  Localement <xs:element name="myelt"> <xs:simpleType> definition de type </xs:simpleType> </xs:element> Globalement et réutilisés <xs:simpleType name="mytype"> definition de type </xs:simpleType> La dérivation de ces types à partir des types prédéfinis se fait soit par : - Restriction (en utilisant des facettes de contrainte) - List - Union - Extension a-2 Type simple personnalisé (dérivé) et le déclaration de type dans l'élément se fait par: <xs:element name="myelt" type="mytype"/>
  • 68.
    Brahim ER-RAHA 1- Restriction Unerestriction limite les valeurs possibles d'un type donné (appelé type de base) et est définie sur certaines propriétés du type de base, appelées facettes de contraintes dont les valeurs les plus utilisés sont : -length (longueur de chaîne) ou minLength et maxLength (bornes inf. et sup. de la langueur) - pattern (expression régulière) - enumeration (ens. de valeurs) - minInclusive, maxInclusive , minExclusive, maxExclusive (bornes des valeurs) - totalDigits (nombre de chiffres d'un nb. entier) -fractionalDigits (nombre de chiffres significatifs pour la partie décimale) la facette pattern permet de contraindre la forme lexicale à l'aide d'une expression régulière (en perl) - [abc] désigne les lettres a, b, c - [a-z] désigne les lettres allant de a à z - ^[abc] signifie toutes les lettres sauf a, b, c - E? signifie 0 ou 1 fois - E* signifie 0 ou plusieurs fois - E+ signifie 1 ou plusieurs fois - E{n,m} signifie entre n et m fois - E{n} signifie exactement n fois - E|F signifie soit E soit F - sert de caractère d'échappement
  • 69.
    Brahim ER-RAHA <xsd:simpleType name="Code"> <xsd:restrictionbase="xsd:integer"> <xsd:minInclusive value="1000" /> <xsd:maxInclusive value="9999" /> </xsd:restriction> </xsd:simpleType> <xsd:element name="AA" type="Code"/> <AA> 9999 </AA> <xsd:simpleType name="JourDeSemaine"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="lundi" /> <xsd:enumeration value="mardi" /> <xsd:enumeration value="mercredi" /> <xsd:enumeration value="jeudi" /> <xsd:enumeration value="vendredi" /> <xsd:enumeration value="samedi" /> <xsd:enumeration value="dimanche" /> </xsd:restriction> </xsd:simpleType> <xsd:element name="AA" type="JourDeSemaine"/> <AA> lundi </AA> <xsd:simpleType name="Date"> <xsd:restriction base="xsd:string"><xsd:pattern value="d{2}- d{2}-d{4}"/> </xsd:restriction></xsd:simpleType> <xsd:element name="AA" type="Date"/> <AA> 23-05-1998 </AA> <xsd:simpleType name="code"> <xsd:restriction base="xsd:string"><xsd:pattern value="[A-Za-z]{6}- d{2}"/> </xsd:restriction></xsd:simpleType> <xsd:element name="AA" type="code"/> <AA> Agadir-25 </AA> <xs:simpleType name="type-no-tel"> <xs:restriction base="xs:string"> <xs:pattern value="0[1-9]{1,2} [0-9]{3} [0-9]{3}" /> </xs:restriction> </xs:simpleType> <xsd:element name="AA" type="type-no-yel"/> <AA> 066 000 000 </AA> <xs:simpleType name="AS"> <xs:restriction base="xs:float"> <xs:totalDigits value="4"/> <xs:fractionDigits value="2"/> </xs:restriction> </xs:simpleType> <xs:element name="AA" type="AS"/> <AA> 12.56 </AA>
  • 70.
    Brahim ER-RAHA 2- List Laliste permet de définir un nouveau type à partir d'un type de base, où une valeur du nouveau type correspond à plusieurs valeurs du type de base séparées par un espace. Exemple : <xsd:simpleType name="Ville"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Agadir"/> <xsd:enumeration value="Fes"/> <xsd:enumeration value="Casa"/> <xsd:enumeration value="Rabat"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="ListeVille"> <xsd:list itemType="Ville"/></xsd:simpleType> <xsd:element name="villes" type="ListeVille"/> <villes>Agadir </villes> 3- Union L'union permet de définir un nouveau type incluant toutes les valeurs possibles d'un certain nombre d'autres types. Par exemple : <xsd:simpleType name="JourDeSemaine"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="lundi" /> <xsd:enumeration value="mardi" /> <xsd:enumeration value="mercredi" /> <xsd:enumeration value="jeudi" /> <xsd:enumeration value="vendredi" /> <xsd:enumeration value="samedi" /> <xsd:enumeration value="dimanche" /> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="AbregeSemaine"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="lu" /> <xsd:enumeration value="ma" /> <xsd:enumeration value="me" /> <xsd:enumeration value="je" /> <xsd:enumeration value="ve" /> <xsd:enumeration value="sa" /> <xsd:enumeration value="di" /> </xsd:restriction> </xsd:simpleType
  • 71.
    Brahim ER-RAHA <xsd:simpleType name="JrSemaine"> <xsd:unionmemberTypes="JourDeSemaine AbregeSemaine" /> </xsd:simpleType> <xsd:element name="AA" type="JrSemaine"/> <AA> Lundi lu </AA> le type JrSemaine ci-dessous est défini à partir des types JourDeSemaine et AbregeSemaine définis précédemment et correspond à une chaîne de caractères indiquant un jour de la semaine ou un abrégé de jour de la semaine 4- Extension Une extension consiste à définir un nouveau type à partir d'un type existant en lui ajoutant éventuellement des sous-éléments et/ou des attributs. Une extension produit donc toujours un type complexe. On en verra des exemples plus loin
  • 72.
    Brahim ER-RAHA Un typecomplexe est défini à l'aide de l'élément <xsd:complexType name="..."> qui pourra contenir, entre autres, une séquence d'éléments, une série d'attributs, etc. On définit d'abord les sous-éléments, puis les attributs. Comme les types simples, les types complexe peuvent être utilisés soit:  localement <xs:element name="myelt"> <xs:complexType> definition de type </xs:complexType> </xs:element> Un type complexe est définit à l'aide de compositeurs (règles de composition), il existe trois sortes de compositeurs : -<xs:sequence> : les sous-éléments énumérés doivent être tous présents dans l'ordre indiqué -<xs:choice> : un seul des sous-éléments énumérés doit être présent (exclusion mutuelle) -<xs:all> : les sous-éléments énumérés doivent être tous présents au plus une fois, dans n'importe quel ordre. Les attributs minOccurs et maxOccurs doivent valoir 0 ou 1. b- Définition de types complexes  globalement et réutilisés <xs:complexType name="mytype"> definition de type </xs:complexType> <xs:element name="myelt" type="mytype"/>
  • 73.
    Brahim ER-RAHA Les attributsminOccurs et maxOccurs contrôlent les occurrences d'apparition d'un élément, par défaut, minOccurs="1" et maxOccurs="1" et en particulier minOccurs="0" signifie qu'il est optionnel et maxOccurs="unbouded" signifie qu'il est répétitif. Ces attributs peuvent être utilisés dans une définition d'élément <element ...> et aussi dans les compositeurs (sequence, choice, all) b-1 contenu composé uniquement de sous-éléments Compositeur déclaration du type document XML valide sequence <xsd:complexType name="EnteteType" > <xsd:sequence> <xsd:element name="titre" type="xsd:string" /> <xsd:element name="auteur" type="xsd:string" /> <xsd:element name="date" type="xsd:string" /> <xsd:element name="lieu" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="entete" type="EnteteType" /> <entete> <titre>...</titre> <auteur>...</auteur> <date> …</date> <lieu>…</lieu> </entete>
  • 74.
    Brahim ER-RAHA <xsd:complexType name="EnteteType"> <xsd:sequence minOccurs=2> <xsd:element name="titre" type="xsd:string" /> <xsd:element name="auteur" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="entete" type="EnteteType" /> <entete> <titre>...</titre> <auteur>...</auteur> <titre> …</titre> <auteur>…</auteur> </entete> sequence
  • 75.
    Brahim ER-RAHA <xsd:complexType name="EnteteType"> <xsd:sequence minOccurs=2> <xsd:element name="titre" type="xsd:string" minOccurs=2/> <xsd:element name="auteur" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:element name="entete" type="EnteteType" /> <entete> <titre>...</titre> <titre>….</titre> <auteur>...</auteur> <titre> …</titre> <titre>….</titre> <auteur>…</auteur> </entete>
  • 76.
    Brahim ER-RAHA <xsd:complexType name="EnteteType"> <xsd:choice minOccurs=2> <xsd:element name="titre" type="xsd:string" /> <xsd:element name="auteur" type="xsd:string" /> </xsd:choice> </xsd:complexType> <xsd:element name="entete" type="EnteteType" /> <entete> <titre>...</titre> <auteur>…</auteur> </entete> Choice
  • 77.
    Brahim ER-RAHA <xsd:complexType name="EnteteType"> <xsd:choice minOccurs="2"> <xsd:element name="titre" type="xsd:string" minOccurse="2" /> <xsd:element name="auteur" type="xsd:string" /> </xsd:choice> </xsd:complexType> <xsd:element name="entete" type="EnteteType" /> <entete> <titre>...</titre> <titre>….</titre> <auteur>...</auteur> </entete>
  • 78.
    Brahim ER-RAHA <xsd:complexType name="EnteteType"> <xsd:all minOccurs="1"> <xsd:element name="titre" type="xsd:string" minOccurse="1" /> <xsd:element name="auteur" type="xsd:string" /> </xsd:choice> </xsd:complexType> <xsd:element name="entete" type="EnteteType" /> <entete> <titre>...</titre> <auteur>...</auteur> <auteur> …</auteur> <titre>….</titre> <auteur>…</auteur> </entete> minOccurs ou maxOccurs de et de ses elements n’accepte que 0 ou 1 all
  • 79.
    Brahim ER-RAHA b-2 contenucomposé uniquement d'attributs (Element vide) On commence par déclaration du type: <xsd:complexType name="ImageType"> <xsd:attribute name="src" type="xsd:anyURI" /> </xsd:complexType> b-3 Exemple de contenu composé d'un contenu simple et d'attributs Pour indiquer qu'un élément est composé d'un continu simple on utilise l'élément s:simpleContent avec l'élément de dérivation xs:extension comme il est monté sur les exemples suivants:
  • 80.
    Brahim ER-RAHA  Déclarationde type : <xsd:element name="price"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name="currency" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>  déclaration d'un élément de ce type: <xsd:element name="prix" type="PrixType" />  utilisation de l'élément dans un document XML: <prix currency="EUR">423.46</prix>
  • 81.
    Brahim ER-RAHA  déclarationdu type : <xsd:simpleType name="NombreDeuxDecimales"> <xsd:restriction base="xsd:decimal"> <xsd:fractionDigits value="2"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="PrixType"> <xsd:simpleContent> <xsd:extension base="NombreDeuxDecimales"> <xsd:attribute name="monaie" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType>  déclaration d'un élément de ce type: <xsd:element name="prix" type="PrixType" />  utilisation de l'élément dans un document XML: <prix monaie="CHF">3.50</prix>
  • 82.
    Brahim ER-RAHA b-4 Exemplede contenu composé de caractères et de sous-éléments (utilisation de l'attribut mixed="true") Pour indiquer qu'un élément est d'un continu composé on utilise l'attribut mixed="true" de l' élément xs:complexType.  déclaration du type : <xsd:complexType name="TexteType" mixed="true"> <xsd:sequence> <xsd:element name="grand" type="xsd:string" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType>  déclaration d'un élément de ce type : <xsd:element name="texte" type="TexteType" /> De par l'attribut mixed de l'élément xsd:complexType, l'élément texte pourra contenir du texte aussi bien qu'un nombre indéterminé de sous-éléments grand. De par sa déclaration, l'élément grand ne peut contenir que du texte simple.
  • 83.
    Brahim ER-RAHA Pour illustrerla définition d'attributs, reprenons l'exemple suivant : <article titre="Un journaliste accuse, un policier dément" auteur="Alain Connu" date="14 juin 1972" lieu="banquise">...</article> Le schéma correspondant serait : <xsd:element name="article" > <xsd:complexType> ... <!-- les attributs doivent être déclaré après les sous-éléments --> <xsd:attribute name="titre" type="xsd:string" /> <xsd:attribute name="auteur" type="xsd:string" use="required" /> <xsd:attribute name="date" type="xsd:date" use="required" /> <xsd:attribute name="lieu" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> Dans une déclaration d'attribut, l'attribut use peut prendre les valeurs suivantes c-Définitions d'attributs dans un type complexe valeur de l'attribut use signification prohibited l'attribut ainsi défini ne doit pas apparaître optional l'attribut peut apparaître au plus une fois required l'attribut doit apparaître
  • 84.
    Brahim ER-RAHA Si l'attributuse n'est pas utilisé, la valeur par défaut est optional. fixed et default ne peuvent pas être utilisés simultanément d- Définition de groupes d'attributs Les groupes d'attributs permettent de regrouper plusieurs déclarations d'attributs, la syntaxe d'utilisation est : <xs:attributeGroup name="N1" ...> définition des attributs </xs:attributeGroup> Ensuite, ils peuvent être utilisés ensemble <xs:attributeGroup ref="N1"/> Exemple: groupe d'attributs <xs:attributeGroup name="books"> <xs:attribute name="pubisher" type="xs:string"> <xs:attribute name="isbn" type="xs:string"> </xs:attributeGroup> autres attributs signification fixed si l'attribut ainsi défini est présent dans la balise, il ne peut prendre que la valeur associée à fixed. Exemple: <xsd:attribute name="..." type="xsd:decimal" fixed="0" /> default l'attribut peut ne pas être défini, auquel cas il prendra une valeur par défaut. Exemple: <xsd:attribute name="..." type="xsd:decimal" default="10" /> <xs:element ...> <xs:attributeGroup ref="books"> </xs:element>
  • 85.
    Brahim ER-RAHA e- Annotations Lesannotations <xs:annotation> permettent d'ajouter des informations pour : - l'utilisateur (humain) <xs:documentation> - une application (machine) <xs:appInfo> f- Définition de groupes modèles Les groupes modèles permettent de définir des composants de schéma, la syntaxe d'utilisation est : <xs:group name="myGroup"> ... composition </xs:group> et de les réutiliser comme suis : <xs:complexType> <xs:group ref="myGroup"> </xs:complexType>
  • 86.
    Application Un service d’envoides mandats établit mensuellement un rapport qui contient les mandats envoyés. Chaque mandat concerne un expéditeur et un destinataire. L’expéditeur est défini par son cin, son nom, son prénom et sa ville. Le destinataire est défini également par son cin, son nom, son prénom et sa ville.
  • 87.
    Application Un exemple defichier XML correspondant à ce problème est le suivant : <?xml version="1.0" encoding="UTF-8"?> <rapport> <mandat num="7124536" date="2007-1-1" montant="1000" etat="reçu"> <expediteur cin="A123245" nom="slimani" prenom="youssef" ville="casa"/> <destinataire cin="P98654" nom="hassouni" prenom="laila" ville="fes"/> </mandat> <mandat num="7124537" date="2007-1-1" montant="3200" etat="non reçu"> <expediteur cin="M123245" nom="alaoui" prenom="mohamed" ville="marra <destinataire cin="M92654" nom="alaoui" prenom="imane" ville="casa"/> </mandat> <mandat num="7124538" date="2007-1-2" montant="500" etat="reçu"> <expediteur cin="H123222" nom="qasmi" prenom="slim" ville="oujda"/> <destinataire cin="B91154" nom="qasmi" prenom="hassan" ville="rabat"/> </mandat> </rapport>
  • 88.
    Travail à faire Faireune représentation graphique de l’arbre XML Ecrire une DTD qui permet de déclarer la structure du document XML Ecrire le schéma XML qui permet de déclarer la structure du document XML Créer le fichier XML valide respectant ce schéma. Ecrire une feuille de style XSL qui permet de transformer le document XML en document HTML suivant :
  • 89.
  • 90.
  • 91.
  • 92.
    Brahim ER-RAHA L’utilisation d’unefeuille de style est obligatoire en XML pour contrôler la mise en page du document, en effet un document XML ne contient que des informations sur la structure, aucune information relative à la mise en page n’apparaît dans le document. Il est possible d’utiliser pour présenter un document XML les feuilles de style CSS ou les feuilles de style XSL (eXtensible StylesheetLanguage). Ces dernières sont issues de DSSSL (Document Style Semantics and Specification Language) la norme internationale ISO 10179 de feuilles de style pour les documents SGML A l'heure actuelle il existe trois solutions pour mettre en forme un document XML : CSS (Cascading StyleSheet), la solution la plus utilisée actuellement, étant donné qu'il s'agit d'un standard qui a déjà fait ses preuves avec HTML XSL (eXtensible StyleSheet Language), un langage de feuilles de style extensible développé spécialement pour XML. Toutefois, ce nouveau langage n'est pas reconnu pour l'instant comme un standard officiel XSLT (eXtensible StyleSheet Language Transformation). Il s'agit d'une recommandation W3C du 16 novembre 1999, permettant de transformer un document XML en document HTML accompagné de feuilles de style IV- Mise en page d'un document XML
  • 93.
    Brahim ER-RAHA Les cascadingstyle sheets ont été initialement conçues pour le langage HTML. La première version du standard, dite CSS niveau 1, a été publiée en 1996. En mai 1998, le consortium W3 a publié une nouvelle version dite CSS niveau 2 qui introduit des possibilités nouvelles par rapport a CSS-1. CSS est un mécanisme puissant et relativement complexe et on a plusieurs manières de procéder : 1- En incluant en-tête de page HTML les styles que l'on souhaite employer dans la page en question. 2- En écrivant une feuille de style dans un fichier séparé. Et Cette seconde solution est celle qui a été retenue pour l'utilisation avec XML IV-1 feuilles de style CSS. Cela s'écrit de la façon suivante : <?xml version='1.0'?> <?xml-stylesheet href="FeuilleDeStyle.css" type="text/css" ?>
  • 94.
    Brahim ER-RAHA Une feuillede style CSS se compose de règles de style qui s'appliquent à un ou plusieurs éléments du document traité, voire à une partie seulement d'un élément (première ligne ou première lettre). Chaque règle est composée d'un sélecteur qui indique quels sont les éléments auxquels elle s'applique, et d'une ou plusieurs propriétés qui décrivent les conditions de rendu physique de cet élément. Syntaxiquement, une règle se présente ainsi : Sélecteur {propriété:valeur; propriété:valeur} Le nombre de couples "proriété-valeur" contenus dans la régle n'est pas limité. Une règle très simple pour définir le formatage des éléments titre peut s'écrire : Titre { font-weight:bold; Font-size:14pt; Font-family:Garamond; Font-style: normal} Des règles de style alternatives peuvent être définies pour un même élément en fonction *de type de média visé. Par exemple, une feuille de style spécifiera que le contenu des éléments titre doit être réalisé en police Garmond 10 points pour le type média Print, et en police Arial 12 points pour le type de media Screen. Toutes les feuilles de style CSS sont insensibles à la casse 1- Principe de base
  • 95.
    Brahim ER-RAHA Pour chaquepropriété définie pour un élément, il est possible d’indiquer si sa valeur doit être héritée par les éléments descendants du premier. Soit par exemple un document dont l’élément racine est article, la règle suivante : Article {background : yellow} Réalisera tous les éléments du document sur fond jaune, sauf ceux pour les quels une règles plus spécifique serait indiquée dans la suite de la feuille de style. Exemple, cette feuille de style : Article { font-size: 10pt } titre { font-size: 120% } et cet extrait d'un document : <Article> <Titre>Un <EM>grand</EM> titre</Titre></Article> Ici, la propriété 'font-size' de l'élément Titre aura une valeur calculée de '12pt' (120% de la valeur de son parent). Et, comme la valeur de la propriété 'font-size' est héritée, la valeur calculée pour l'élément EM sera aussi '12pt'. Quelque fois, on utilise la valeur Inherit qui signifie que pour un élément donné, la propriété de cet élément prend la même valeur calculée que pour celle de son parent. La valeur héritée qui est normalement utilisée comme une valeur refuge, peut être renforcée par une valeur 'inherit' explicite. 2-Héritage
  • 96.
    Brahim ER-RAHA La règle'@import', placée impérativement en tête de la feuille de style avant toute règle de formatage, permet aux utilisateurs l'importation de règles de style à partir d'une autre feuille de style. Le mot-clé '@import' doit être suivi de l'URI de la feuille de style à intégrer. Les lignes suivantes ont une signification équivalente et illustrent les deux syntaxes (celle avec "url()" et celle avec une simple chaîne) : @import "mystyle.css"; ou @import url("mystyle.css"); @import “http://foo.bar.org/somestyle.css”; Les feuilles de styles importées et enveloppées dans une règle @media produiraient les mêmes effets, avec ce média, que les feuilles de style suivantes, @import url("fineprint.css") print; @import url("bluish.css") screen, tv; Si le type de média n'est pas précisé, l'import est inconditionnel. De même, si on spécifie le type de média 'all' 3- Importation des règles
  • 97.
    Brahim ER-RAHA Toute règlepeut se voir affecter un niveau de priorité parmi deux valeurs possibles. Par défaut, elles ont toutes le niveau « normale ». Une règle dont on souhaite quelle ait priorité sur une autre règle concurrente peut avoir le niveau important. Cela s’indique de la façon suivante : Sélecteur {propriété : valeur !important} Lorsque plusieurs règles s’appliquent à un élément si l’une d’entre elle est spécifiée avec l’indicateur !important elle a priorité sur une règle normale. En fin, les règles importées par @import participent aussi à la cascade des propriétés : à niveau d’importance égale, les règles locales définies dans la feuille de style ont la priorité sur les règles importés. 4- La cascade
  • 98.
    Brahim ER-RAHA Exemple : <?xmlversion="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/css" href="css.css"?> <ARTICLE> voila un exemple d’article <HEADLINE>La rencontre de Frédéric le Grand et de Bach</HEADLINE> <AUTHOR>Johann Nikolaus Forkel</AUTHOR> <PARA> Un soir, alors qu'il préparait sa <INSTRUMENT>flûte</INSTRUMENT> et que ses musiciens étaient réunis, un officier lui apporta la liste des étrangers qui venaient d'arriver. </PARA> </ARTICLE> Fichier css.css @import url("im.css"); article { color: #ff45ee; background: green !important; } Fichier im.css article { color: red !important; background: yellow ; }
  • 99.
    Brahim ER-RAHA 4- TypesMédias Une des fonctions primordiales des feuilles de style repose sur le fait de pouvoir spécifier comment représenter un document (réalisation physique d’un document) pour différents médias : un écran, une feuille de papier, un synthétiseur de parole, un appareil (TV). Pour spécifier les règles propres à chaque type de media, trois méthodes complémentaires sont possibles.  La première consiste à réaliser une feuille de style différente par type de média visé.  La seconde méthode consiste à déclarer les différentes règles dans une même feuille en les regroupant dans des sections spécifiques @media print { article { font-size: 10pt } @media screen { article { font-size: 12pt } } @media screen, print { article { line-height: 1.2 } }  La troisième méthode consiste à réaliser une feuille de style différente contenant les déclarations propres à chaque style, et à réaliser en outre une feuille de style contenant les règles communes à l’ensemble des médias visés. Plus des règles d’importation des feuilles spécifiques ; en indiquant à quels types de médias elles correspondent.
  • 100.
    Brahim ER-RAHA Les typesde médias reconnus sont : All : convient pour tous les appareils ; Aural : destiné aux synthétiseurs de parole. Handheld : destiné aux appareils portatifs (typiquement ceux avec petits écrans, monochromes et à bande passante limitée). Print : destiné à un support paginé opaque et aux documents vus sur écran en mode aperçu avant impression. Projection : destiné aux présentations en projection, par exemple avec des projecteurs ou des impressions pour des transparents screen : destiné principalement aux moniteurs couleurs. tv : destiné aux appareils du type télévision (avec ces caractéristiques : basse résolution, couleur, défilement des pages limité, sonorisé). @import “style-papier.css” print; @import “style-papier.css” screen ; @media screen, print { ici les régles valides pour les deux types }
  • 101.
    Brahim ER-RAHA 5- Lescommentaires Dans les feuilles de style les commentaires sont de la même façons que dans les langages de programmation C ou Java. Syntaxe est /* Ecrire Commentaire */ Exemple : @media print {titre { color:red;font-size: 10pt } /*la couleur de contenu est rouge ici*/ @media screen {titre{ color:green;font-size:12pt }/* la couleur de contenu est vert ici*/
  • 102.
    Brahim ER-RAHA Motif SignificationDécrit au chapitre... * Correspond à tout élément. Sélecteur universel E Correspond à tout élément E (c.à.d., un élément de type E). Sélecteurs de type E F Correspond à tout élément F qui est un descendant de l'élément E. Sélecteurs descendants E > F Correspond à tout élément F aussi un enfant de l'élément E. Sélecteurs d'enfant E:first-child Correspond à un élément E aussi le premier enfant de son élément parent. La pseudo-classe :first- child E,F,G Groupement des éléments F, E et G Sélecteurs de type E:lang(c) Correspond à l'élément de type E qui emploie une langue c (la détermination de cette langue est spécifique au langage du document). La pseudo-classe :lang() E + F Correspond à tout élément F immédiatement précédé par un élément E. Les sélecteurs adjacents E[foo] Correspond à tout élément E avec l'attribut "foo" (quelles qu'en soient les valeurs). Sélecteurs d'attribut E[foo="warni ng"] Correspond à tout élément E dont l'attribut "foo" a exactement la valeur "warning". Sélecteurs d'attribut E[foo~="warn ing"] Correspond à tout élément E dont l'attribut "foo" a pour valeur une liste de valeurs séparées par des blancs et dont une de celles-ci est "warning". Sélecteurs d'attribut E[lang|="en"] Correspond à tout élément E dont l'attribut "lang" a pour valeur une liste de valeurs séparées par des tirets, cette liste commençant (à gauche) par "en". Sélecteurs d'attribut 6- Sélecteurs d’éléments : Les sélecteurs d’éléments disponibles en CSS sont :
  • 103.
    Brahim ER-RAHA -Pa >el [att= "foo "] {propriété : valeur} sélectionne tout élément el ayant l’attribut att= "foo ", et fils d’un élément pa. - pa [att="bar"]>* {propriété : valeur}sélectionne n'importe quel élément (*), fils d'un élément pa, et doté de l'attribut att="bar". Exemple : 7- Propriétés 7-1 Dimension Lorsque on exprime la dimension (hauteur, largeur, épaisseur, distance) d'une propriété, celle-ci est généralement indiquer à l'aide d'une unités absolues ou relatives: Les unités absolues sont : - in : pouce, soit 2,54 cm - cm : centimètre - mm : millimètre - pt : point typographique - pc : pica (=12 points) Les unités relatives sont : - em : égale à la taille de la police courante. - ex : égale à la hauteur de glyphe dans la police courante
  • 104.
    Brahim ER-RAHA 7-2 Couleur Lespropriétés CSS permettent aux auteurs la spécification d'une couleur d'avant- plan et d'arrière-plan pour un élément.  La couleur d'avant-plan : la propriété ‘color’ Cette propriété décrit la couleur d'avant-plan du contenu de texte d'un élément. Voici plusieurs façons d'indiquer la couleur rouge : EM { color: red } /* nom de couleur prédéfini */ EM { color: rgb(255,0,0) } /* couleurs en RGB allant de 0 à 255 */ EM { color: #FF0000 } /* couleurs en code héxadécimal */  L'arrière-plan Les propriétés d'arrière-plan : 'background-color', : mettre une couleur en arrière plan 'background-image' : ajouter une image en arrière plan
  • 105.
    Brahim ER-RAHA 'background-repeat' :Quand on spécifie une image d'arrière-plan, cette propriété indique si l'image est répétée (apposée) et la manière de la répétition. Les significations des valeurs sont : repeat : L'image se répète à la fois horizontalement et verticalement ; repeat-x : L'image ne se répète qu'horizontalement ; repeat-y : L'image ne se répète que verticalement ; no-repeat : L'image ne se répète pas : un seul exemplaire de celle-ci est dessiné 'background-attachment' : Quand on spécifie une image d'arrière-plan, cette propriété indique si l'image est fixe par rapport à la zone de visualisation (pour la valeur 'fixed'), ou si celle-ci défile en même temps que le document (pour la valeur 'scroll') 'background-position' : Quand on spécifie une image d'arrière-plan, cette propriété indique la position initiale de celle-ci. Les valeurs de cette propriété sont : top left et left top Identique à '0% 0%' ; top, top center et center top Identique à '50% 0%'; right top et top right Identique à '100% 0%' ; bottom left et left bottom Identique à '0% 100%' ; bottom, bottom center et center bottom Identique à '50% 100%' left, left center et center left Identique à '0% 50%' ; center et center center Identique à '50% 50%' ; right, right center et center right Identique à '100% 50%' ;
  • 106.
    Brahim ER-RAHA 7-3 Police Lespropriétés de police de CSS décrivent l'apparence souhaitée pour le texte dans le document, on distingue :  famille de polices : la propriété 'font-family' : cette propriété donne une liste, par ordre de priorité, de noms de familles de polices, exemple : BODY { font-family: Baskerville, "Heisi Mincho W3", Symbol, serif } La police "Baskerville" va fournir les glyphes pour les caractères latins, la police "Heisi Mincho W3", ceux pour les caractères japonais, la police "Symbol", ceux pour les symboles mathématiques, et la famille de polices générique 'serif', ceux éventuels d'autres caractères.  style de police : pour déterminer le style de police, on utilise 3 propriétés : font-style : La propriété 'font-style' sélectionne, parmi les polices d'une famille de polices, celles avec un dessin normal, italique et oblique. font-variant : qui prend deux valeurs normal ou small-caps (lettre en petit majiscule) font-weight : La propriété 'font-weight' spécifie la graisse de la police. Les significations des valeurs sont : Normal et bold taille de police : la propriété utilisé et font-size ces valeurs sont : xx-small | x- small | small | medium | large | x-large | xx-large ou directemet par une valeur réelle comme 12 pt.
  • 107.
    Brahim ER-RAHA 7-4 Formatagede texte word-spacing : espacement entre les mots (en pt) letter- spacing:espacement entre les lettres (en pt) text-decoration: {none, underline, overline, blink} blink : le text clignote vertical-align: ajuster l'alignement vertical d'un élément text-transform : {u uppercase, l lowercase} text-align : { left, right, center, j justify} text-indent : fixe l'indentation de la première ligne d'un bloc de texte 7-5 modèle de boite La mise en boite de continue d'un élément se fait par la propriété Display, ces valeurs sont : Block : boite de type bloc Inline : boite en ligne - width : la largeur de bloc - height : la hauteur de bloc -margin-top, margin-right, margin-left, margin-bottom : définissent les largeurs des quatre marges. -padding, padding-top,…, padding-bottom : déterminent les épaisseurs des quatres cotés de la boite. - Border-width, border-top-width,.. : définissent l'épaisseur de la bordure. - Border-color, Border-top-color,… : définissent la couleur de la bordure -Border-style, Border-top-style,... : none, hidden, dotted, deshed, solid, double, ridge (effet de relief)
  • 108.
    Brahim ER-RAHA eXtensible StylesheetLanguage est un langage construit sur des principes profondément différents de ceux de CSS et il offre par rapport à ce formalisme des possibilités nouvelles très puissantes. XSL procède par reconstruction d'un arbre à partir de l'arbre XML. Ce nouvel arbre peut avoir un ordre différent de l'arbre source et de nouveaux éléments peuvent y être introduit. Des traitements spécifiques peuvent même être mis en place au moment de sa construction. XSL est donc un langage de feuille de style avec des possibilités de traitement assez puissantes. Le langage XSL se divise en deux parties : 1- XSLT (eXtensible Stylesheet Language Transformation) il permet de transformer un document XML en un autre document XML (HTML, xHTML, WML, SVG, SMIL,…), par défault, cette transformation produit un document HTML bien formés. 2- XSL FO (Formatting Objects) c'est un langage de mise en page, il permet de transformer un document XML en document non XML par exemple : PDF, PostScript, RTF, Doc, text,… IV-1 feuilles de style XSL
  • 109.
    Brahim ER-RAHA 1-1 Associationd'une feuille XSL à un document XML Une feuille de style XSL (enregistré dans un fichier dont l'extension est .xsl) peut être liée à un document XML (de telle manière à ce que le document XML utilise la feuille XSL) en insérant la balise suivante au début du document XML : <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet href="fichier.xsl" type="text/xsl"?> Cette dernière instruction de traitement indique le type de la feuille de style et son emplacement. 1- Langage XSLT Voir le dossier TestXSLT…
  • 110.
    Brahim ER-RAHA XSLT estune application XML, une feuille de style XSL est donc un document XML. La feuille de style contient donc une déclaration XML et tous ses éléments sont placés dans l’élément racine <xsl:stylesheet>. D’autre part, les éléments XSL sont préfixés par xsl : qui fait référence à deux types de domaines de nom : - http://www.w3.org/TR/WD-xsl -http://www.w3.org/1999/XSL/Transform Exemple : <?xml version="1.0" encoding="ISO-8859-1"> <xsl:stylesheet> <xsl:template ... > <!-- traitements à effectuer --> </xsl:template > </xsl:stylesheet> L’élément racine contient principalement des balises xsl:template (modèle de transformation) définissant les transformations à faire subir à certains éléments du document XML 1-2 Structure d’une feuille de style XSLT
  • 111.
    Brahim ER-RAHA Une feuillede styles XSL contient un ou plusieurs modèles (templates), chaque modèle contient des informations sur l’affichage d’une branche des éléments du document. I-3 Modèle unique pour un document XML <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="biblio.xsl" ?> <bibliotheque> <livre> <titre>N ou M</titre> <auteur>Agatha Christie</auteur> <ref>Policier-C-15</ref> </livre> <livre> <titre>Le chien des Baskerville</titre> <auteur>Sir Arthur Conan Doyle</auteur> <ref>Policier-D-3</ref> </livre> <livre> <titre>Dune</titre> <auteur>Franck Heckbert</auteur> <ref>Fiction-H-1</ref> </livre> </bibliotheque> <?xml version= “1.0 “?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XS L/Transform"> <xsl:template match="/"> <H2>Bibliotheque</H2> <xsl:for-each select="bibliotheque/livre"> <P style="font-style:italic"> <xsl:value-of select="titre"/> </P> <P style="color:red"> <xsl:value-of select="auteur"/> </P> <P style="color:blue"> <xsl:value-of select="ref"/> </P> </xsl:for-each> </xsl:template> </xsl:stylesheet>
  • 112.
    Brahim ER-RAHA Le modèleest appliqué à la branche spécifiée par l’attribut match de l’élément template. La transformation d’un document XML par une feuille de style XSL s’effectue donc par un modèle traitant un nœud donné. Chaque modèle est divisé en deux parties : un nœud cible indiqué par l’attribut match et une action sur le nœud : <xsl:template match="noed_cible"> action </xsl:template> L'attribut "match" de la balise <xsl:template> permet de définir (grâce à la notation XPath) le ou les éléments du document XML sur lesquels s'applique la transformation. La notation Xpath permet de définir des patterns, c'est-à-dire des chaînes de caractères permettant de repérer un nœud dans le document XML.
  • 113.
  • 114.
  • 115.
    Brahim ER-RAHA Le langageXPath est un standard du W3C pour décrire des "patterns" (localisation de nœud) et extraire des valeurs de l'arbre du document XML. Il sert en fait 2 autres "standards" XML : XSLT : partie de XSL, ensemble de règles de transformation d'un document XML vers un autre document. XPointer : mécanisme de pointage pour les liens XLink de XML. Un sélecteur de nœud (XPATH) est formée de trois parties : <xsl:template match="//nom[position()=1]"> • un axe : il permet de se déplacer dans l'arbre du document • un test : il permet de sélectionner un nœud • un prédicat (entre crochets [xx]): il effectue une opération booléenne sur le nœud sélectionné. Considérons l'exemple suivant: (Fichier atome.xml) a- Langage Xpath
  • 116.
    Brahim ER-RAHA <?xml version="1.0"encoding="iso-8859-1" ?> <classification_atomique> <famille type="gaz rare"> <atome> <nom>hélium</nom> <symbole>He</symbole> <numero>2</numero> <masse>4</masse> </atome> <atome> <nom>néon</nom> <symbole>Ne</symbole> <numero>10</numero> <masse>20</masse> </atome> <atome> <nom>argon</nom> <symbole>Ar</symbole> <numero>18</numero> <masse>40</masse> </atome> </famille>….. < /classification_atomique>
  • 117.
    Brahim ER-RAHA Axes Les axesdécrivent les directions des chemins dans une arborescence, ils ont deux allure identique : 1- Syntaxe Xpath (notation étendue) : racine, parent, nœud courant, descendant, les axes s'utilisent ainsi : axe :: test Supposons que le nœud courant soit <famille type="gaz rare"> • ancestor:: tous les nœuds parent de la branche du nœud courant • ancestor-or-self:: tous les nœuds parent de la branche du nœud courant et la branche en cours • child:: les nœuds fils • descendant:: les descendant du nœud courant • descendant-or-self:: les descendant du nœud courant et le nœud courant • following:: tous les nœuds suivant le nœud courant dans le document • following-sibling:: sélectionne les nœuds frères du nœud courant se trouvant après ce nœud courant • parent:: parent de noeud courant • preceding:: tous les nœuds précédent le nœud courant dans le document. • preceding-sibling:: sélectionne les nœuds frères du nœud courant se trouvant avant ce nœud courant • self:: le nœud courant • following :: parent :: tous les nœuds suivants le nœud parent du nœud courant
  • 118.
    Brahim ER-RAHA Figure1 :Exemple de syntaxe Xpath sur un document
  • 119.
    Brahim ER-RAHA 2- SyntaxeSimple Supposons que le nœud courant soit <famille type="gaz rare"> / ou /classification_atomique sélectionne l'élément racine du document, donc <classification_atomique> / classification_atomique /famille sélectionne les éléments famille fils de l'élément racine ./atome ou atome sélectionne les éléments atome fils du nœud courant. atome/nom sélectionne les éléments nom fils d'un élément atome fils du nœud courant .. sélectionne l'élément père, donc <classification_atomique> ../famille sélectionne les éléments famille fils du père du nœud courant //atome sélectionne les éléments atome descendant de l'élément racine .//nom sélectionne les éléments nom descendant du nœud courant * sélectionne tous les éléments fils du nœud courant atome/* sélectionne tous les éléments fils d'un élément atome fils du nœud courant @type sélectionne l'attribut type du nœud courant /famille/@type sélectionne l'attribut type des éléments famille fils de l'élément racine @* sélectionne tous les attributs du nœud courant ./atome | .//nom union des 2 sélections atome/node() sélectionne tous les nœuds (pas uniquement les nœuds éléments) fils d'un élément atome fils du nœud courant comment() tous les nœuds commentaire du nœud courant
  • 120.
    Brahim ER-RAHA Test Il permetde déterminer dans un chemin Xpath le nom ou et le type de nœud sélectionné. Exemple :  nom d’élément: film  nom d’attribut: @titre  type de nœud: – nœuds: node() (pas de sélection). – éléments: *, – attributs: @*, – nœuds de type texte (PCDATA): texte():  commentaires: comment()
  • 121.
    Brahim ER-RAHA Prédicat Les prédicatssont utilisés dans les tests de XSLT. De plus, l'ensemble des nœuds obtenus par un chemin XPtah peut être filtré à l'aide de prédicats entre crochets []. Supposons que le nœud courant soit <famille type="gaz rare"> ./atome[3] sélectionne le 3ème élément atome fils du nœud courant ./atome[position()=3] sélectionne l'élément atome fils du nœud courant dont le position est en 3ème place. atome[last()] sélectionne le dernier élément atome fils du nœud courant atome[numero!=4] sélectionne les éléments atome fils du nœud courant dont le numéro est différent de 4 atome[numero &gt;= 4] Remarquons qu'il faut utiliser &lt; (respectivement &gt;) à la place de < (resp. >) dans les documents XML following-sibling :: .[@type="non métal"] sélectionne les nœuds frère (suivant dans le document) du nœud courant dont l'attribut type vaut "non métal" atome[masse mod 2 =1] sélectionne les éléments atome fils du nœud courant dont la masse est impair.
  • 122.
    Brahim ER-RAHA ../famille[(@type="non métal")and (atome/masse &gt; 34)] sélectionne les nœuds famille fils du père du nœud courant dont l'attribut type vaut "non métal" et dont l'un des fils atome a un fils masse dont le contenu est > à 34. ../famille[@type="non métal"]/atome[masse &gt; 34] sélectionne les nœuds atome, ayant un fils masse dont le contenu est > à 34, et qui sont fils de nœud famille fils du nœud racine dont l'attribut type vaut "non métal". /famille/atome[3] [masse &gt; 34] sélectionne parmi les 3ème éléments atome des fils famille du nœud racine ceux dont la masse est > à 34 /famille/atome[masse &gt; 34] [3] sélectionne le 3ème élément parmi les atomes, dont la masse est > à 34, des fils famille du nœud racine /famille[count(atome[masse &gt; 34]) != 0] sélectionne les nœuds famille du nœud racine ayant au moins un fils atome de masse > à 34 /famille[not(contains(@type, 'gaz'))] sélectionne les nœuds famille du nœud racine ayant un attribut type qui ne comporte pas la chaine 'gaz' opérateurs : and, or, *, +, -, /, mod fonctions numériques : number, sum, floor, ceiling, round fonctions booléennes : not, lang
  • 123.
    Brahim ER-RAHA Correspondance entresyntaxe Xpath simple et étendu Syntaxe Etendu Syntaxe Simple /child::film/child::acteur /film/acteur /child::cinéma/descendant::acteur /cinéma//acteur /descendant::* //* /descendant::film[@année=’2000’] //film[@année=’2000’] Self . Parent ..
  • 124.
    Brahim ER-RAHA 1- AAA: Sélectionne l'élément racine AAA <AAA> <BBB/> <CCC/> <xsl:template match="/"> <BBB/> <xsl:value-of select="AAA"/> <BBB/> </xsl:template> <DDD> <BBB/> </DDD> <CCC/> </AAA> 2- /AAA/CCC : Sélectionne tous les éléments CCC qui sont enfants de l'élément racine AAA <AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA>> I- Syntaxe Simple
  • 125.
    Brahim ER-RAHA 3- /AAA/DDD/BBB: Sélectionne tous les éléments BBB qui sont enfants de DDD, qui sont enfants de l'élément racine AAA <AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA> 4- //BBB : Sélectionne tous les éléments BBB <AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC> </AAA>
  • 126.
    Brahim ER-RAHA 5- //DDD/BBB:Sélectionne tous les éléments BBB qui sont enfants de DDD <AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC> </AAA> 6- /AAA/CCC/DDD/* : Sélectionne tous les éléments inclus dans les éléments /AAA/CCC/DDD
  • 127.
    Brahim ER-RAHA 6- /*/*/*/BBB Sélectionnetous les éléments BBB qui ont trois ancêtres
  • 128.
    Brahim ER-RAHA 7- /AAA/BBB[1]: Sélectionne le premier élément BBB, fils de l'élément racine AAA <AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA> 8- /AAA/BBB[last()] : Sélectionne le dernier élément :BBB, fils de l'élément racine AAA <AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA> 9- //@id : Sélectionne tous les attributs id <AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>
  • 129.
    Brahim ER-RAHA 10- //BBB[@id]: Sélectionne tous les BBB qui ont un attribut id <AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA> 10- //BBB[@name] Sélectionne tous BBB qui ont un attribut name <AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA> 11- //BBB[@*] Sélectionne tous BBB qui ont un attribut <AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA> 12- //BBB[not(@*)] :Sélectionne Tous les BBB qui n'ont pas d'attribut <AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>
  • 130.
    Brahim ER-RAHA 13- //BBB[@id='b1']:Sélectionne tous les éléments BBB ayant un attribut id dont la valeur est b1 <AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA> 14- //BBB[@name='bbb'] : Sélectionne tous les éléments BBB ayant un attribut name dont la valeur est bbb <AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA> 15- //BBB[normalize-space(@name)='bbb'] :Sélectionne tous les éléments BBB ayant un attribut name dont la valeur est bbb. Les espaces de début et de fin sont supprimés avant la comparaison <AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA>
  • 131.
    Brahim ER-RAHA 16- //*[count(BBB)=2] Sélectionneles éléments ayant deux enfants BBB <AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> 17- //*[count(*)=2] : Sélectionne les éléments ayant deux enfants <AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA>
  • 132.
    Brahim ER-RAHA 18- //*[count(*)=3]: Sélectionne les éléments ayant trois enfants
  • 133.
    Brahim ER-RAHA 19- //*[name()='BBB'] Lafonction name() retourne le nom de l'élément
  • 134.
    Brahim ER-RAHA 21- //*[starts-with(name(),'B')]: la fonction start-with retourne vrai si la chaîne du premier argument commence par celle du deuxième <AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA> 22- //*[contains(name(),'C')] <AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA>
  • 135.
    Brahim ER-RAHA 23- //*[string-length(name())= 3] <AAA> <Q/> <SSSS/> <BB/> <CCC/> <DDDDDDDD/> <EEEE/> </AAA> 24- //*[string-length(name()) &lt; 3] <AAA> <Q/> <SSSS/> <BB/> <CCC/> <DDDDDDDD/> <EEEE/> </AAA> 26- //CCC | //BBB : Sélectionne tous les éléments CCC et BBB <AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA>
  • 136.
    Brahim ER-RAHA 27- /AAA/EEE| //BBB : Sélectionne tous les éléments BBB et EEE qui sont enfants de l'élément racine AAA <AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA> Plusieurs chemins peuvent être combinés avec le séparateur | 28- /AAA/EEE | //DDD/CCC | /AAA | //BBB : Le nombre de combinaisons n'est pas restreint <AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA>
  • 137.
    Brahim ER-RAHA 1- /AAA: Équivalent à /child::AAA <AAA> <BBB/> <CCC/> </AAA> 2- /AAA/BBB : Equivalent à /child::AAA/child::BBB <AAA> <BBB/> <CCC/> </AAA> 3- /child::AAA/BBB Les deux possibilités peuvent être combinées <AAA> <BBB/> <CCC/> </AAA> 4- /descendant::* Sélectionne tous les descendants de l'élément racine et donc tous les éléments II- Noms d'axes
  • 138.
    Brahim ER-RAHA 6- /AAA/BBB/descendant::*:Sélectionne tous les descendants de /AAA/BBB 7- //CCC/descendant::* : Sélectionne tous les éléments qui ont CCC comme ancêtre
  • 139.
    Brahim ER-RAHA 8- //CCC/descendant::DDD: Sélectionne les descendants de CCC dont au moins un est un DDD 9- //DDD/parent::*
  • 140.
    Brahim ER-RAHA 10- /AAA/BBB/DDD/CCC/EEE/ancestor::*:Sélectionne tous les éléments donnés dans ce chemin absolu 11- //FFF/ancestor::* Sélectionne tous les ancêtres de l'élément FFF
  • 141.
  • 142.
  • 143.
  • 144.
    Brahim ER-RAHA L'axe suivant(following) tous les nœuds du même document que le nœud contextuel qui sont après le nœud contextuel dans l'ordre du document, à l'exclusion de tout descendant, des attributs et des espaces de noms 13- /AAA/XXX/following::*
  • 145.
  • 146.
    Brahim ER-RAHA L'axe cibleprécédente (preceding) contient tous les prédécesseurs du nœud contextuel; si le nœud contextuel est un attribut ou un espace de noms, la cible précédente est vide 16- /AAA/XXX/preceding::*
  • 147.
  • 148.
    Brahim ER-RAHA L'axe 'descendant-or-self'contient le nœud contextuel et ses descendants 18- /AAA/XXX/descendant-or-self::*
  • 149.
  • 150.
    Brahim ER-RAHA L'axe ancestor-or-selfcontient le nœud contextuel et ses ancêtres; ainsi l'axe ancestor-or-self contient toujours le nœud racine 20- /AAA/XXX/DDD/EEE/ancestor-or-self::*
  • 151.
  • 152.
  • 153.
  • 154.
    Brahim ER-RAHA 26- //GGG/self::* 27-//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*
  • 155.
    Brahim ER-RAHA III- lesopérateurs L'opérateur div réalise une division à virgule flottante, l'opérateur mod retourne le reste d'une division. La fonction floor() retourne le plus grand nombre (le plus près de l'infini positif) qui n'est pas plus grand que l'argument et qui est un entier. La fonction ceiling() retourne le plus petit nombre (le plus près de l'infini négatif) qui n'est pas plus petit que l'argument et qui est un entier 1- //BBB[position() mod 2 = 0 ] <AAA> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/> </AAA>
  • 156.
    Brahim ER-RAHA 2- //BBB[position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ] <AAA> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/> </AAA> 3- //CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ] <AAA> <BBB/><BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/></AAA>
  • 157.
    Brahim ER-RAHA <?xml version="1.0"encoding="iso-8859-1" ?> <classification_atomique> <atome ligne="1" colone="8"> <nom>hélium</nom> <symbole>He</symbole> <numero>2</numero> <masse>4</masse> <type>gaz rare</type> </atome> <atome ligne="2" colone="8"> <nom>néon</nom> <symbole>Ne</symbole> <numero>10</numero> <masse>20</masse> <type>gaz rare</type> </atome> <atome ligne="3" colone="8"> <nom>argon</nom> <symbole>Ar</symbole> <numero>18</numero> <masse>40</masse> <type>gaz rare</type> </atome>….. < /classification_atomique>
  • 158.
    Brahim ER-RAHA b- Actionpossible par le langages XSLT b-1 Extraction de contenue d'un élément Pour insérer le contenu des éléments sélectionnés par la règle de gabarit (template) dans le fichier résultat, il suffit d'utiliser l'élément value-of, qui permet d'insérer le contenu de la balise sélectionnée par l’attribut obligatoir select. Exemple : <xsl:output method="html"/> <xsl:template match="/classification_atomique"> <html> <body> <P style="color:red"> <xsl:value-of select="atome/symbole"/> </p></body></html> </xsl:template> Fichier Résultat <html> <body> <p style="color:red">H</p> </body> </html>
  • 159.
    Brahim ER-RAHA Grâce àl'élément <xsl:for-each>, il est possible de sélectionner un ensemble des éléments enfants et de leur appliquer une règle de transformation. L'instruction de boucle for-each sélectionne tous les nœuds correspondants au pattern atome/symbole à partir du nœud courant classification_atomique, et leur applique les transformations spécifiées. b-2 Réalisation des boucles Fichier XSL appliquée sur atomes.xml --> résultat <xsl:template match="/classification_atomique"> <html> <body> <xsl:for-each select="atome/symbole"> <xsl:value-of select="."/> <br/> </xsl:for-each> </body></html> </xsl:template> <html> <body> H<br> He<br> Li<br> Be<br> B<br> C<br>N<br>O<br>F<br>Ne<br>Na<br>Mg<br>A l<br>Si<br>Ar<br> </body></html>
  • 160.
    Brahim ER-RAHA b-3 Utilisationdes structure de condition XSLT propose deux instructions qui pemettent le traitement conditionnel dans un modèle : xsl:if et xsl:choose . L'instruction xsl:if sert à exprimer la condition simple si- alors ; L'instruction xsl:choose permet quant à elle un choix parmi plusieurs possibilités Traitement conditionnel par xsl:if la syntaxe d'utilisation est : <xsl:if test = boolean-expression> traitement…. </xsl:if> L'élément xsl:if a un attribut test qui spécifie une expression. Le contenu est un modèle.
  • 161.
    Brahim ER-RAHA Fichier XSLRésultat HTML <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl=http://www.w3.org/1999/XSL/Transform> <xsl:template match="/classification_atomique"> <html><body> <table border="1"> <tr> <th>symbole</th> <th>numero</th> </tr> <xsl:for-each select="atome"> <xsl:if test="type='gaz rare'"> <tr> <td> <xsl:value-of select="nom"/> </td> <td> <xsl:value-of select="numero"/> </td> </tr> </xsl:if> </xsl:for-each> </table></body></html> </xsl:template> </xsl:stylesheet> <html> <body> <table> <tr> <th>symbole</th> <th>numero</th> </tr> <tr> <td>h&eacute;lium</td> <td>2</td> </tr> <tr> <td>n&eacute;on</td> <td>10</td> </tr> <tr> <td>argon</td> <td>18</td> </tr> </table> </body> </html>
  • 162.
    Brahim ER-RAHA la syntaxed'utilisation est : L'élément xsl:choose permet de faire un choix parmi plusieurs alternatives. Il consiste en une séquence d'éléments xsl:when suivis par un élément xsl:otherwise optionnel. Chacun des éléments xsl:when possède un attribut test unique qui spécifie une expression. Le contenu des éléments xsl:when et xsl:otherwise est un modèle de traitement  Traitement conditionnel par xsl:choose <xsl:choose> (xsl:when+, xsl:otherwise?)> </xsl:choose> <xsl:when test = boolean- expression> <!--Content: template --> </xsl:when> <xsl:otherwise> <!-- Content: template --> </xsl:otherwise>
  • 163.
    Brahim ER-RAHA Fichier XSLRésultat HTML <xsl:template match="/classification_atomique"> <html><body><table border="1"> <tr> <th>type</th> <th>symbole</th> <th>numero</th> </tr> <xsl:for-each select="atome"> <tr> <td> <xsl:choose> <xsl:when test="contains(type,'métal')"> métal </xsl:when> <xsl:when test="contains(type,'gaz')"> gaz </xsl:when> <xsl:otherwise>Rien</xsl:otherwise> </xsl:choose> </td> <td> <xsl:value-of select="nom"/> </td> <td> <xsl:value-of select="numero"/> </td> </tr> </xsl:for-each> </table></body></html> </xsl:template> </xsl:stylesheet> <html> <body> <table> <tr> <th>type</th> <th>symbole</th> <th>numero</th> </tr> <tr> <td></td> <td>hydrog&egrave;ne</t d> <td>1</td> </tr> <tr> <td>gaz</td> <td>h&eacute;lium</td> <td>2</td> </tr> <tr> <td>m&eacute;tal</td> <td>lithium</td> <td>3</td> </tr> <tr>....
  • 164.
  • 165.
  • 166.
  • 167.
    Exemple 1 Un opérateurTélécom fournit périodiquement, à l’opérateur de réglementation des télécoms ANRT un fichier XML qui contient les clients de cet opérateur. Chaque client possède plusieurs abonnements et chaque abonnement reçoit plusieurs factures. Un exemple de fichier XML correspondant à ce problème est le suivant : <?xml version="1.0" encoding="UTF-8"?> <operateur> <client code="1" nom="hassouni"> <abonnement num="123" type="GSM" dateAb="2006-1-11"> <facture numFact="432" dateFact="2006-2-11" montant="350.44" reglee="oui"/> <facture numFact="5342" dateFact="2006-3-11" montant="450" reglee="oui"/> <facture numFact="5362" dateFact="2006-4-13" montant="800.54" reglee="non"/> </abonnement> <abonnement num="2345" type="FIXE" dateAb="2006-12-1"> <facture numFact="5643" dateFact="2007-1-12" montant="299" reglee="oui"/> <facture numFact="6432" dateFact="2007-2-12" montant="555" reglee="non"/> </abonnement> </client> <client code="2" nom="abbassi"> <abonnement num="7543" dateAb="2006-12-1" type="GSM"> <facture numFact="7658" dateFact="2007-2-12" montant="350.44" reglee="oui"/> <facture numFact="7846" dateFact="2007-3-12" montant="770" reglee="non"/> </abonnement> </client> </operateur>
  • 168.
    Travail demandé 1. 2. 3. 4. Faire unereprésentation graphique de l’arbre XML. Ecrire une DTD qui permet de valider ce document XML Créer le fichier XML Ecrire une feuille de style XSL qui permet de transformer le document XML en une page HTML qui permet d’afficher pour chaque client la liste de ses abonnement en affichant le montant total des factures de chaque abonnement
  • 169.
    Corrigé : DTD <?xmlversion="1.0" encoding="UTF-8"?> <!ELEMENT operateur (client+) > <!ELEMENT client (abonnement+) > <!ELEMENT abonnement (facture+) > <!ELEMENT facture EMPTY > <!ATTLIST client code NMTOKEN #REQUIRED nom CDATA #REQUIRED> <!ATTLIST abonnement num NMTOKEN #REQUIRED type (GSM|FIXE) 'FIXE' dateAb CDATA #REQUIRED> <!ATTLIST facture numFact NMTOKEN #REQUIRED dateFact CDATA #REQUIRED montant CDATA #REQUIRED reglee (oui|non) 'non'> operateur +client @code @nom +abonnement @num @type @dateAb +facture @numFact @dateFact @montant @reglee
  • 170.
    <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head></head> <body> <xsl:for-each select="operateur/client"> <h3> Nom Client : <xsl:value-of select="@nom"/> </h3> <table border="1" width="80%"> <tr> <th>Num</th><th>Type</th><th>Date</th><th>Total Factures</th> </tr> <xsl:for-each select="abonnement"> <tr> <td><xsl:value-of select="@num"/></td> <td><xsl:value-of select="@type"/></td> <td><xsl:value-of select="@dateAb"/></td> <td><xsl:value-of select="sum(facture/@montant)"/></td> </tr> </xsl:for-each> </table> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
  • 171.
    Application Un exemple defichier XML correspondant à ce problème est le suivant : <?xml version="1.0" encoding="UTF-8"?> <rapport> <mandat num="7124536" date="2007-1-1" montant="1000" etat="reçu"> <expediteur cin="A123245" nom="slimani" prenom="youssef" ville="casa"/> <destinataire cin="P98654" nom="hassouni" prenom="laila" ville="fes"/> </mandat> <mandat num="7124537" date="2007-1-1" montant="3200" etat="non reçu"> <expediteur cin="M123245" nom="alaoui" prenom="mohamed" ville="marrakech"/> <destinataire cin="M92654" nom="alaoui" prenom="imane" ville="casa"/> </mandat> <mandat num="7124538" date="2007-1-2" montant="500" etat="reçu"> <expediteur cin="H123222" nom="qasmi" prenom="slim" ville="oujda"/> <destinataire cin="B91154" nom="qasmi" prenom="hassan" ville="rabat"/> </mandat> </rapport>
  • 172.
    Travail à faire Faireune représentation graphique de l’arbre XML Ecrire une DTD qui permet de déclarer la structure du document XML Ecrire le schéma XML qui permet de déclarer la structure du document XML Créer le fichier XML valide respectant ce schéma. Ecrire une feuille de style XSL qui permet de transformer le document XML en document HTML suivant :
  • 173.
    Brahim ER-RAHA b-4 Triagedes données Le triage des données est spécifié en ajoutant des éléments xsl:sort comme fils d'un élément xsl:apply-templates ou d'un élément xsl:for-each. Le premier fils xsl:sort spécifie la clé primaire de tri, le deuxième fils xsl:sort spécifie la clé de tri secondaire et ainsi de suite. xsl:sort possède un attribut select dont la valeur est une expression représentant la nœud courante sur le quelle on effectue le tri et un autre attribut order indique si les chaînes de caractères devraient être triées dans un ordre ascendant ou descendant; par défaut, l'ordre est ascending
  • 174.
    Brahim ER-RAHA b-5 Créationde l'arbre résultat  Créer des éléments avec xsl:element L'élément xsl:element permet la création d'un élément ayant un nom déterminé. Le nom étendu de l'élément à créer est spécifié par l'attribut obligatoire name. Le contenu de l'élément xsl:element est le modèle des attributs et enfants de l'élément créé. La syntaxe d'utilisation est : <xsl:element name = { qname } use-attribute-sets = qnames> <!-- Content: template --> </xsl:element> Créer des attributs avec xsl:attribute L'élément xsl:attribute peut être utilisé pour ajouter des attributs aux éléments résultats qui sont créés par un xsl:element. Le nom étendu de l'attribut à créer est spécifié par l'attribut obligatoire name. le contenu de l'élément xsl:attribute est un modèle de la valeur de l'attribut créé. La syntaxe d'utilisation est: <xsl:attribute name = { qname }}> <!-- Content: template --> </xsl:attribute>
  • 175.
    Brahim ER-RAHA  Créerde texte dans l'arbre résultat l'élément xsl:text permet de créer des nœuds textuels dans le document résultat, la syntaxe d'utilisation est : <xsl:text > <!-- Content: #PCDATA--> </xsl:text>  Créer des commentaires L'élément commentaire xsl:comment sert à créer un nœud commentaire dans l'arbre résultant. la syntaxe d'utilisation est : <xsl:comment> Contenu de commentaire </xsl:comment>  Créer des instructions de traitement L'élément xsl:processing-instruction sert à créer un nœud instruction de traitement. L'élément xsl:processing-instruction possède un attribut obligatoire name qui spécifie le nom du nœud instruction de traitement La syntaxe d'utilisation est: <xsl:processing-instruction name = { nom de l'instruction }> <!-- Content: template --> </xsl:processing-instruction>
  • 176.
    Brahim ER-RAHA Document XSLDocument Résultat <xsl:processing-instruction name="xml- stylesheet">href="book.css" type="text/css“ </xsl:processing-instruction> <?xml-stylesheet href="book.css"type="text/css"?> Exemple
  • 177.
    Brahim ER-RAHA Exemple :Xsl:element: Fichier XML Fichier XSL Arbre générée <source> <text size="H1">Header1</text> <text size="H3">Header3</text> <text size="b">Bold text</text> <text size="sub">Subscript</text> <text size="sup">Superscript</text > </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/X SL/Transform'> <xsl:template match="/"> <xsl:for-each select="//text"> <xsl:element name="{@size}"> <xsl:value-of select="."/> </xsl:element> </xsl:for-each> </xsl:template></xsl:stylesheet> <H1>Header1</H1> <H3>Header3</H3> <b>Bold text</b> <sub>Subscript</sub> <sup>Superscript</sup>
  • 178.
    Brahim ER-RAHA Xsl:attribute Fichier XML FichierXSL Arbre généré <source> <color>blue</color> <color>navy</color> <color>green</color> <color>lime</color> <color>red</color> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/ XSL/Transform'> <xsl:template match="color"> <TABLE> <TR> <TD> <xsl:attribute name="style"> <xsl:text>color:</xsl:text> <xsl:value-of select="."/> </xsl:attribute> <xsl:value-of select="."/> </TD> </TR> </TABLE> </xsl:template></xsl:stylesheet> <TABLE> <TR> <TD style="color:blue">blue</TD> </TR> </TABLE> <TABLE> <TR> <TD style="color:navy">navy</TD> </TR> </TABLE> <TABLE> <TR> <TD style="color:green">green</TD> </TR> </TABLE> <TABLE> <TR> <TD style="color:lime">lime</TD> </TR> </TABLE> <TABLE> <TR> <TD style="color:red">red</TD> </TR> </TABLE>
  • 179.
    Brahim ER-RAHA Xsl: attribute-set: Avec l'élément xsl:attribute-set on ne peut pas utiliser l'élément value of Fichier XML Fichier XSL Arbre généré <source> <h1>GREETING</h1> <p>Hello, world!</p> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="/"> <xsl:apply-templates select="/source/*"/> </xsl:template> <xsl:template match="h1"> <xsl:copy use-attribute-sets="H1"> <xsl:value-of select="."/> </xsl:copy> </xsl:template> <xsl:template match="p"> <xsl:copy use-attribute-sets="P "> <xsl:value-of select="."/> </xsl:copy> </xsl:template> <xsl:attribute-set name="H1"> <xsl:attribute name="align">center</xsl:attribute> <xsl:attribute name="style">color:red</xsl:attribute> </xsl:attribute-set> <xsl:attribute-set name="P"> <xsl:attribute name="align">left</xsl:attribute> <xsl:attribute name="style">color:blue</xsl:attribute> </xsl:attribute-set> </xsl:stylesheet> <h1 align="center" style="color:red">GREETING </h1> <p align="left" style="color:blue">Hello, world!</p>
  • 180.
    Brahim ER-RAHA  copierdes nœuds vers le document résultat : XSl:Copy et XSl:Copy-of : L'élément copy permet de copier uniquement le nœud courant (sans contenus, ni attribues). L'élément copy-of permet de copier le nœud courant, sont contenu, ces attribues et ces enfants Fichier XML Fichier XSL Arbre générée <source> <p id="a12"> Compare <B>these constructs</B>. </p> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="p"> <DIV> <B> <xsl:text>copy-of : </xsl:text> </B> <xsl:copy-of select="."/> </DIV> <DIV> <B> <xsl:text>copy : </xsl:text> </B> <xsl:copy/> </DIV> <DIV> <B> <xsl:text>value-of : </xsl:text> </B> <xsl:value-of select="."/> </DIV> </xsl:template> </xsl:stylesheet> <DIV> <B> copy-of : </B> <p id="a12"> Compare <B>these constructs</B>. </p> </DIV> <DIV> <B>copy : </B> <p/> </DIV> <DIV> <B>value-of : </B> Compare these constructs. </DIV>
  • 181.
    Brahim ER-RAHA number Cetélément permet d'insérer un nombre formaté pouvant servir de compteur. L'utilisation de cet élément est de la forme : <xsl:number level="single"|"multiple" count="noeud" value="expression" format="chaine" /> avec: level : indique quels niveaux doivent être sélectionnés pour le comptage. count : indique quels nœuds doivent être comptés dans les niveaux sélectionnés ; dans le cas où cet attribut n'est pas défini, les nœuds comptés sont ceux ayant le même type que celui du nœud courant. Value : indique l'expression correspondant à la valeur du compteur ; si cet attribut n'est pas défini, le nombre inséré correspond à la position du nœud (position()). Format : spécifie le format de l'affichage du nombre ; cela peut être un chiffre, un caractère (a-z, A-Z) et comprendre un caractère de séparation tel que le point (.), le trait d'union (-) ou autre. Les formats possibles sont "1", "01", "a", "A", "i", "I"  Création des listes
  • 182.
    Brahim ER-RAHA Exemple 1 FichierXML Fichier XSL Arbre généré <source> <n>one</n> <n>two</n> <n>three</n> <n>four</n> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="/"> <TABLE> <xsl:for-each select="//n"> <TR> <TD> <xsl:number value="position()" format="1. "/> <xsl:value-of select="."/> </TD> </TR> </xsl:for-each> </TABLE> </xsl:template> </xsl:stylesheet> 1. one 2. two 3. three 4. four
  • 183.
    Brahim ER-RAHA Exemple 2: FichierXML Fichier XSL Arbre généré <source> <chapter>First Chapter</chapter> <chapter>Second Chapter <chapter>Subchapter 1</chapter> <chapter>Subchapter 2</chapter> </chapter> <chapter>Third Chapter <chapter>Subchapter A</chapter> <chapter>Subchapter B <chapter>sub a</chapter> <chapter>sub b</chapter> </chapter> <chapter>Subchapter C</chapter> </chapter> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/199 9/XSL/Transform'> <xsl:template match="/"> <TABLE BORDER="1"> <TR> <TH>Number</TH> <TH>text</TH> </TR> <xsl:for-each select="//chapter"> <TR> <TD> <xsl:number level="multiple"/> </TD> <TD> <xsl:value-of select="./text()"/> </TD> </TR> </xsl:for-each> </TABLE> </xsl:template> </xsl:stylesheet> Number text 1 First Chapter 2 Second Chapter 2.1 Subchapter 1 2.2 Subchapter 2 3 Third Chapter 3.1 Subchapter A 3.2 Subchapter B 3.2.1 sub a 3.2.2 sub b 3.3 Subchapter C
  • 184.
    Brahim ER-RAHA L'élément <xsl:variable>sert à créer les variables dans XSLT. Il possède les attributs suivants : name : cet attribut est obligatoire. Il spécifie le nom de la variable. select : expression XPath qui spécifie la valeur de la variable. Par exemple : <xsl:variable name="nombre_livres" select="255"/> <xsl:variable name="Auteur" select="'Victor Hugo'"/> <xsl:variable name="nombre_pages" select="livre/tome/@page"/> On notera la présence des guillemets imbriqués quand il s'agit d'affecter une chaîne de caractères à une variable. La valeur de la variable peut aussi être donnée de cette façon : <xsl:variable name="Auteur">Victor Hugo </xsl:variable> La portée d'une variable est limitée aux éléments-frères et à leurs descendants. Par conséquent, si une variable est déclarée dans une boucle xsl:for-each ou un élément xsl:choose ou xsl:if, on ne peut s'en servir en-dehors de cet élément. Une variable est appelée en étant précédée du caractère $ : <xsl:value-of select="$nombre_pages" />.  Utilisation des variables
  • 185.
    Eléments de XSLT <xsl:variable> ◦L'élément <xsl:variable> sert à créer les variables dans XSLT. Il possède les attributs suivants : name : cet attribut est obligatoire. Il spécifie le nom de la variable. select : expression XPath qui spécifie la valeur de la variable. Par exemple : <xsl:variable name="nombre_livres" select="255" /> <xsl:variable name="auteur" select="'Victor Hugo'" /> <xsl:variable name="nb" select="livre/tome/@page" /> On notera la présence des guillemets imbriqués quand il s'agit d'affecter une chaîne de caractères à une variable. La portée d'une variable est limitée aux éléments-frères et à leurs descendants. Par conséquent, si une variable est déclarée dans une boucle xsl:for-each ou un élément xsl:choose ou xsl:if, on ne peut s'en servir en- dehors de cet élément. Une variable est appelée en étant précédée du caractère $ : <xsl:value-of select="$nb" />. ◦ On peut utiliser une variable pour éviter la frappe répétitive d'une chaîne de caractères, et pour faciliter la mise à jour de la feuille de style.
  • 186.
    Brahim ER-RAHA Fichier XMLFichier XSL Arbre généré <source> <chapter>Chapter A</chapter> <chapter>Chapter B</chapter> <chapter>Chapter C</chapter> <chapter>Chapter D</chapter> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:variable name="text">Chapter</xsl:variable> <xsl:template match="/"> <TABLE> <xsl:for-each select="//chapter"> <TR> <TD> <xsl:choose> <xsl:when test="position() = 1"> <xsl:variable name="text">First chapter</xsl:variable> </xsl:when> <xsl:when test="position()=last()"> <xsl:variable name="text">Last chapter</xsl:variable> </xsl:when> <xsl:otherwise> <xsl:variable name="text"> <xsl:value-of select="$text"/> </xsl:variable> </xsl:otherwise> </xsl:choose> <xsl:value-of select="$text"/> <xsl:text> : </xsl:text> <xsl:value-of select="."/> </TD> </TR> </xsl:for-each> </TABLE> </xsl:template> </xsl:stylesheet> First Chapter : Chapter A Chapter : Chapter B Chapter : Chapter C Last Chapter : Chapter D
  • 187.
    Brahim ER-RAHA I-4 Utilisationde plusieurs modèles dans le document XSL Un document XSL peut contenir plusieurs modèles. il est possible d’appeler un modèle a partir d'un autre en utilisant l'élément xsl:apply-templates la syntaxe d'utilisation est < xsl:apply-templates select="Xpath"/> Document XML Document XSL Document Résultat <source> <AAA id="a1" pos="start"> <BBB id="b1"/> <BBB id="b2"/> </AAA> <AAA id="a2"> <BBB id="b3"/> <BBB id="b4"/> <CCC id="c1"> <CCC id="c2"/> </CCC> <BBB id="b5"> <CCC id="c3"/> </BBB> </AAA> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="/"> <html> <xsl:apply-templates select="//CCC"/> </html> </xsl:template> <xsl:template match="CCC" priority="1"> <h3 style="color:blue"> <xsl:value-of select="name()"/> <xsl:text> (id=</xsl:text> <xsl:value-of select="@id"/> <xsl:text>)</xsl:text> </h3> </xsl:template> <xsl:template match="CCC/CCC" priority="2"> <h2 style="color:red"> <xsl:value-of select="name()"/> <xsl:text> (id=</xsl:text> <xsl:value-of select="@id"/> <xsl:text>)</xsl:text> </h2> </xsl:template></xsl:stylesheet> <html> <h3 style="color:blue">CCC (id=c1)</h3> <h2 style="color:red">CCC (id=c2)</h2> <h3 style="color:blue">CCC (id=c3)</h3> </html>
  • 188.
    Eléments de XSLT <xsl:call-template> ◦L'élément <xsl:template> peut être appelé indépendamment d'une sélection d'un nœud. ◦ Pour cela, il faut renseigner l'attribut name, et l'appeler à l'aide de l'élément <xsl:call-template>. ◦ Par exemple <xsl:template name="separateur"> <hr /> <img src="ligne.gif" alt="séparation“height="2" width="150“ /> <hr /> </xsl:template> Il suffit alors de l'appeler avec <xsl:call-template name="separateur"/>
  • 189.
    Eléments de XSLT <xsl:param>et <xsl:with-param> ◦ Un paramètre est créé avec l'élément <xsl:param>, et passé à un modèle avec l'élément <xsl:with-param>. ◦ Les deux ont deux attributs : name, obligatoire, qui donne un nom au paramètre ; select, une expression XPath facultative permettant de donner une valeur par défaut au paramètre. ◦ Par exemple, on peut imaginer un template permettant d'évaluer le résultat d'une expression polynômiale : ◦ <xsl:template name="polynome"> <xsl:param name="x"></xsl:param> <xsl:value-of select="2*$x*$x+(-5)*$x+2" /> </xsl:template> ◦ Ce template peut être appelé comme suit: ◦ <xsl:call-template name="polynome"> <xsl:with-param name="x" select="3.4"></xsl:with-param> </xsl:call-template> ◦ permet d'afficher le résultat de 2*3.4^2-5*3.4+2.
  • 190.
    Brahim ER-RAHA Fichier XMLFichier XSL Arbre généré <source> <number>1</number> <number>3</number> <number>4</number> <number>17</number> <number>8</number> </source> <xsl:template match="/"> <TABLE> <xsl:for-each select="//number"> <TR> <TH> <xsl:choose> <xsl:when test="text() mod 2"> <xsl:apply-templates select="."> <xsl:with-param name="type">odd</xsl:with-param> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="."/> </xsl:otherwise> </xsl:choose> </TH> </TR> </xsl:for-each> </TABLE> </xsl:template> <xsl:template match="number"> <xsl:param name="type">even</xsl:param> <xsl:value-of select="."/> <xsl:text> (</xsl:text> <xsl:value-of select="$type"/> <xsl:text>)</xsl:text> </xsl:template> 1 (odd) 3 (odd) 4 (even) 17 (odd) 8 (even) param et with param
  • 191.
    Brahim ER-RAHA Fichier XMLFichier XSL Arbre généré <source> <AAA> <BBB> <CCC>C1</CCC> </BBB> <CCC>C2</CCC> <CCC>C3</CCC> </AAA> <AAA> <CCC> <DDD>D1</DDD> <DDD>D2</DDD> </CCC> </AAA> </source> <xsl:variable name="var1" select="//AAA/CCC/text()"/> <xsl:variable name="var2">//AAA/CCC/text()</xsl:variable> <xsl:template match="/"> <xsl:call-template name="function"> <xsl:with-param name="path1“ select="//AAA/CCC/DDD"/> <xsl:with-param name="path2">//AAA/CCC/DDD</xsl:with-param> </xsl:call-template> </xsl:template> <xsl:template name="function"> <xsl:param name="path1"/> <xsl:param name="path2"/> <P> <xsl:value-of select="$path2"/> <xsl:text> : </xsl:text> <xsl:value-of select="$path1"/> </P> <P> <xsl:value-of select="$var2"/> <xsl:text> : </xsl:text> <xsl:for-each select="$var1"> <xsl:value-of select="."/> <xsl:text/> </xsl:for-each> </P> </xsl:template> //AAA/CCC/DDD : D1 //AAA/CCC/text() : C2C3
  • 192.
    Brahim ER-RAHA Document XMLDocument XSL Document Résultat <source> <AAA id="a1" pos="start"> <BBB id="b1"/> <BBB id="b2"/> </AAA> <AAA id="a2"> <BBB id="b3"/> <BBB id="b4"/> <CCC id="c1"> <CCC id="c2"/> </CCC> <BBB id="b5"> <CCC id="c3"/> </BBB> </AAA> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transf orm'> <xsl:template match="/"> <xsl:apply-templates select="//CCC" mode="red"/> <xsl:apply-templates select="//CCC" mode="yellow"/> </xsl:template> <xsl:template match="CCC" mode="red"> <div style="color:red"> <xsl:value-of select="name()"/> <xsl:text> id=</xsl:text> <xsl:value-of select="@id"/> </div> </xsl:template> <xsl:template match="CCC"> <div style="color:purple"> <xsl:value-of select="name()"/> <xsl:text> id=</xsl:text> <xsl:value-of select="@id"/> </div> </xsl:template> </xsl:stylesheet> <html> <div style="color:red">CCC id=c1</div> <div style="color:red">CCC id=c2</div> <div style="color:red">CCC id=c3</div> </html>
  • 193.
    Brahim ER-RAHA 1-5 Importationdes feuilles de styles Une feuille de styles XSLT peut importer une autre feuille XSLT en utilisant l'élément xsl:import. L'élément xsl:import possède un attribut href dont la valeur est une adresse URI identifiant la feuille de styles à importer. La syntaxe d'utilisation est : <xsl:import href = uri-reference /> L'élément xsl:import n'est permis que comme un élément de haut niveau. Les éléments xsl:import doivent précéder tous les autres éléments fils de l'élément xsl:stylesheet. Document XML Document XSL (Doc1.xsl) Document Résultat <source> <AAA>red</AAA> <BBB>blue</BBB> <CCC>purple</CCC> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="AAA"> <h3 style="color:{.}"> <xsl:value-of select="."/> </h3> </xsl:template></xsl:stylesheet> <h3 style="color:red">red </h3> blue purple
  • 194.
    Brahim ER-RAHA Document XMLDocument XSL (Doc2.xsl) Document Résultat <source> <AAA>red</AAA> <BBB>blue</BBB> <CCC>purple</CCC> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:import href="doc1.xsl"/> <xsl:template match="BBB"> <h2 style="color:{.}"> <xsl:value-of select="."/> </h2> </xsl:template></xsl:stylesheet> <h3 style="color:red">re d</h3> <h2 style="color:blue">b lue</h2> purple Document XML Document XSL (Doc2.xsl) Document Résultat <source> <AAA>red</AAA> <BBB>blue</BBB> <CCC>purple</CCC> </source> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:include href="Doc2.xsl"/> <xsl:template match="CCC"> <h1 style="color:{.}"> <xsl:value-of select="."/> </h1> </xsl:template></xsl:stylesheet> <h3 style="color:red">re d</h3> <h2 style="color:blue">b lue</h2> <h1 style="color:purple" >purple</h1>
  • 195.
  • 196.
    Brahim ER-RAHA 1. Donnerle résultat d’application de fichier point.xlst 2. Modifiez points.xslt pour qu'il affiche deux nouvelles lignes: • l’une contenant la moyenne des totaux hebdomadaires de points (donc la moyenne de {7, 30, 4}). • l’autre contenant la moyenne des points journaliers (donc la moyenne de {1, 3, 2, 1, 2, 8, 20, 1, 3}). Attention! Faites-le sans utiliser foreach ni sum ni avg! On peut tout faire comme l'exemple, à coup de template. (il vous faudra quand même un petit div quelquepart). 3. Ajoutez l'affichage du nombre maximal de points obtenu en un jour. Et toujours sans foreach ni sum, etc.
  • 197.
    Brahim ER-RAHA Exercice Considérons lefichier xml suivant : Etoiles.xml 1- présenter les données sous la forme d'une liste donnant pour chaque planète son nom, sa distance par rapport au Soleil, sa masse et son diamètre. Sol Voir 2- Ajouter à la distance, la masse et le diamètre les unités employées en récupérant la valeur de l'attribut unit pour chacun de ces éléments. Sol voir 3- Effectuer pour chaque planète un test sur l'élément satellite. S'il existe, afficher le nombre de satellites. Sol voir 4- Ne plus afficher les informations sur la Terre. Sol voir 5- Classer les planètes sauf la Terre par ordre croissant de leur masse ; Sol voir 6- faire un test sur le type de planète et afficher suivant le cas : Sol voir  "Planète de type tellurique" si la planète est de type tellurique ;  "Planète pleine de gaz!" si la planète est de type gazeuse ;  "Autre type de planète" dans les cas restants.
  • 198.
    Brahim ER-RAHA II- LanguageXSL-FO XSL/FO est un langage qui permet de formater l’affichage et/ou l’impression d’un document XML. Il s’agit de l’équivalent (en plus puissant) des stylesheet CSS. Principe de formatage d'un document XML
  • 199.
    XSL-FO : leformatage  Permet les mises en pages sophistiquées  Objets de mise en forme applicables aux résultats avec XSLT  Distinction  Formatage des pages  Formatage des objets à l'intérieur des pages • Statiques • Dynamiques
  • 200.
    Principes  Peut s'appliqueraux résultats des feuilles XSLT
  • 201.
    Les processeurs XSL-FO Apache Group : FOP  Formating Object Processor  Génère du PDF http://www.apache.org  JFOR (Open Source)  Génère du RTF http://www.jfor.org  Antenna House  XSL Formatter http://www.antennahouse.com  RenderX  Génère du PDF http://www.renderx.com  Altova  StyleVision http://www.altova.com/products_xsl.html  XML Mind FO Converter  Génère du RTF http://www.xmlmind.com/foconverter  Autres  Arbortext, Adobe, Scriptura, XMLPDF, APOC, XSL-FO to TeX
  • 202.
    Brahim ER-RAHA - page-width="14.8cm" -page-height="21cm" - margin-top="1cm" tous ces attributs définissent le format de la page - margin-bottom="1.5cm" - margin-left="2cm" - margin-right="2cm" 2-1 Principes de base XSL/FO La feuille de style XSL-FO est un document XML. Elle contient donc une déclaration XML et tous ses éléments sont placés dans l’élément racine <fo:root>. D’autre part, les éléments XSL-FO sont préfixés par fo : qui fait référence à l'espace de nom : xmlns:fo="http://www.w3.org/1999/XSL/Format" Un document FO est formé donc d'un élément racine fo:root qui comprend 2 parties bien distinctes:  Une description des structures en page (fo:layout-master-set)  Une description du contenu (fo:page-sequence) a-1 Modèle de page unique L'élément fo:simple-page-master permet de spécifier les régions d'une simple page, les attributs de cet élément sont : - master-name="..." sert de référence pour la page.
  • 203.
    Brahim ER-RAHA Cet élémentcontient aussi un autre élément fo:region-body possédant les attributs suivant : - region-name="..." sert de référence pour la region. - margin-top="1cm" - margin-bottom="1.5cm" tous ces attribus définissent le format de la page - margin-left="2cm" - margin-right="2cm“ Le modèle de page comprend en plus de la région centrale, quatre régions périphériques : - region-before, - region-after, - region-strat, - region-end Les dimensions des régions périphériques sont déterminées par : - l'attribut extend qui détermine sa "largeur" (dans le sens orthogonal au coté considéré) - sa "longueur" est déterminée par la région centrale
  • 204.
    Brahim ER-RAHA Exemple : <?xmlversion="1.0" encoding="UTF-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-size="16pt"> <fo:layout-master-set> <fo:simple-page-master margin-right="15mm" margin-left="15mm" margin-bottom="15mm" margin-top="15mm" page-width="210mm" page-height="297mm" master-name="book"> <fo:region-body region-name="R1" margin-bottom="5mm" margin-top="5mm"/> <fo:region-before extent="2mm" region-name="entete"/> <fo:region-after extent="1.5cm" region-name="pied"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="book"> <fo:title>Hello world example</fo:title> <fo:flow flow-name=“R1"> <fo:block> Salut XSLFO!</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
  • 205.
    Brahim ER-RAHA les margesde la page et de la région centrale
  • 206.
    Brahim ER-RAHA a-2 Structuredes modèles de pages Dans cette paragraphe, nous allons voir comment on peur définir un modèle représentant une séquence de modèles de page. Pour définir des pages multiples, il faut déclarer un élément fo:page-sequence- master contenant un élément fo:repeatable-page-master-reference faisant référence à l'objet fo:simple-page-master Exemple : <fo:layout-master-set> <fo:simple-page-master master-name="single-page" ...> ...<!-- format de page --> </fo:simple-page-master> <fo:page-sequence-master master-name="many-pages"> <fo:repeatable-page-master-reference master-reference="single-page"/> </fo:page-sequence-master> </fo:layout-master-set> <fo:page-sequence master-reference="many-pages"> ...<!-- contenu --> </fo:page-sequence>
  • 207.
    Brahim ER-RAHA Pour définirdes pages alternées (par ex. impaire, paire), il faut définir plusieurs modèles de page simples puis définir un modèle de pages alternatives de type fo:repeatable-page-master-alternatives contenant des conditionnelles de type fo:conditional-page-master-reference avec les propriétés suivantes : odd-or-even : odd ou even, permet d’associer un modèle différent selon si la page est impaire ou paire page-position : first, last, rest ou any, permet d’associer un modèle différent selon la position de la page blank-or-not-blank : blank ou not-blank, permet d’associer un modèle différent selon si la page est vide ou non. master- reference : détermine le type de page simple a utilisée La syntaxe totale d'utilisation d'un modèle de séquence de page est : <fo:page-sequence-master master-name="nomsequence"> ( single-page-master-reference | repeatable-page-master-reference | repeatable-page-master-alternatives )+ </fo:page-sequence-master> L'attribut master-name sert comme référence de la séquence de page définit.
  • 208.
    Brahim ER-RAHA <fo:layout-master-set> <fo:simple-page-master master-name="first-page"...> ... <fo:simple-page-master master-name="odd-page" ...> ... <fo:simple-page-master master-name="even-page" ...> ... <fo:page-sequence-master master-name="chapter-pages"> <fo:repeatable-page-master-alternatives> <fo:conditional-page-master-reference page-position="first“ master-reference="first-page"/> <fo:conditional-page-master-reference odd-or-even="odd“ master-reference="odd-page"/> <fo:conditional-page-master-reference odd-or-even="even“ master-reference="even-page"/> </fo:repeatable-page-master-alternatives> </fo:page-sequence-master> </fo:layout-master-set>
  • 209.
    Brahim ER-RAHA b- générationde continu des pages Le contenu d'un document se trouve dans un élément fo:page-sequence avec l'attribut master-reference="..." pour référencer le modèle de page la Syntaxe est : <fo:page-sequence master-reference="nom modele de page"> (static-content*, flow) </fo:page-sequence> Le contenu (paragraphes, d’images, tableaux,…) est placé dans des flux représentés par deux éléments fo:flow et un élément fo:static-content  fo:flow (destiné à la région centrale)  fo:static-content (pour les en-têtes, etc): pour Les informations qui se répètent sur chaque page Ces deux éléments ont un attribut obligatoire flow-name qui prendre l'une des valeurs suivantes: - xsl-region-afte - xsl-region-before - xsl-region-body - xsl-region-start - xsl-region-end L'élément fo flow est un élément obligatoire et unique, la valeur xsl-region-body est obligatoire pour son attribut flow-name
  • 210.
  • 211.
    Brahim ER-RAHA b-1 LesBlocs La mise en page est décrite à l'aide de boîtes (block). Chaque boîte est formée d'un contenu, d'un espace interne (padding), d'une bordure (border) et d'un espace externe (space). Les quatre côtés sont nommés relativement au sens d'écriture (before, after, start, end) Représentation d'une boite (bloc)
  • 212.
    Brahim ER-RAHA Les boîtesde blocs sont des éléments récursifs de type fo:block et correspondent à des sections, titres, paragraphes, listes, tableaux, etc. (cf <div> en HTML). Les principaux attributs sont (ce sont les même attribut vu dans CSS):  text-align avec comme valeurs start (ou left), end (ou right), center, justify, ...  line-height  text-indent, start-indent  space-before, space-after, padding-...  border, border-...  color, background-color, background-image  font-family, font-size, font-style, font-weight, font-strech, font-variant, text- decoration, ...  letter-spacing, word-spacing, ... Pour modifier les propriétés graphiques d’une portion de texte au sein d’un élément de niveau bloc on utilise l'élémént fo:inline, la syntaxe est : <fo:inline> contenu </fo:inline> Exemple : <fo:block font-size="18pt" color="black" font-family="sans-serif"> Il était <fo:inline font-style="italic" color="Red"> une fois </fo:inline> le langage XML </fo:block> Le résultat est : Il était une fois le langage XML
  • 213.
    Brahim ER-RAHA b-2 Lestableaux La structure globale de tableaux est similaire au modèle de tableau de HTML. Tous les éléments nécessaires sont représentés sur le schéma suivant : Avec: • fo:table-and-caption • fo:table-caption: La caption d’une table • fo:table: la table proprement dite. Elle contient header et footer à option et un body. • fo:table-column: permet de spécifier notamment la longueur d’une colonne (éléments vides) • fo:table-header: Ligne entête, contient des lignes ou cellules (facultatifs) • fo:table-footer: Ligne "footer", contient des lignes ou cellules (facultatifs) • fo:table-body: contient des lignes ou cellules • fo:table-row: les cellules qui contiennent des fo:blocks (le contenus) On commence par définir les colonnes et leurs largeurs. Puis on définit le continu (corps) du tableau
  • 214.
    Brahim ER-RAHA Exemple : <fo:table-columncolumn-number="1" column-width="8cm" /> <fo:table-column column-number="2" column-width="8cm" /> <fo:table-column column-number=“3" column-width="8cm" /> <fo:table-body> <fo:table-row> <fo:table-cell column-number="1" border-style="solid"> <fo:block text-align="left">08 – 09</fo:block> </fo:table-cell> <fo:table-cell column-number="2" number-columns-spanned="2" border- tyle="solid"> <fo:block text-align="center">plenary session</fo:block> </fo:table-cell> </fo:table-row> <fo:table-row> <fo:table-cell border-style ="solid"> <fo:block text-align="left">09 – 10</fo:block> </fo:table-cell> <fo:table-cell border-style="solid"> <fo:block text-align="center">Paper 1 - session 1</fo:block> </fo:table-cell > <fo:table-cell border-style="solid" number-rows-spanned="2"> <fo:block text-align="center">tutorial</fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> Session1 Session2 08-09 plenary session 09-10 Paper1-session1 tutorial 10-11 Paper2-session2 11-12 Paper3-session3
  • 215.
    Brahim ER-RAHA b-3 Leslistes L'organigramme des éléments de liste dans un fichier XSL-FO est : Avec :  fo:list-block : contient la liste et contient quelques définitions pour la géométrie fo:list-item : enfants de fo:list-block, c.a.d. des items qui contiennent un label et un body (voir ci-dessous) fo:list-item-label : contient le contenu du label (typiquement un fo:block avec un nombre, un caractère dingbat, etc.) fo:list-item-body : contient le corps d’un item, un ou plusieurs fo:block L'indentation d’une liste est contrôlée via les attributs start-indent et end-indent associés aux étiquettes et aux corps de liste :  Comme alternative, on peut utiliser les attributs provisional-label-separation et provisional-distance-between-starts  La fonction label-end() retourne la position de la marge droite du label et body-start() retourne la position de la marge gauche du corps
  • 216.
  • 217.
    Brahim ER-RAHA Exemple : <fo:list-blockprovisional-label-separation="1cm" provisional-distance-between-tarts="1cm"> <fo:list-item> <fo:list-item-label end-indent="label-end()" start-indent="0.5cm"> <fo:block>1.</fo:block> </fo:list-item-label> <fo:list-item-body end-indent="1cm" start-indent="body-start()"> <fo:block> Vive XML ! </fo:block> </fo:list-item-body> </fo:list-item> <fo:list-item> <fo:list-item-label end-indent="label-end()" start-indent="0.5cm"> <fo:block>&#x2022;</fo:block> </fo:list-item-label> <fo:list-item-body end-indent="1cm" start-indent="body-start()"> <fo:block> Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! </fo:block> </fo:list-item-body> </fo:list-item> </fo:list-block> le résultat est : 1. Vive XML ! 2. Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL ! Gloire à XSL !
  • 218.
    Brahim ER-RAHA b-4 Lesgraphes Deux éléments peuvent être utilisés pour inclure des éléments de type graphique : fo:external-graphic pour insérer un graphique dont le format de description n’est pas XML (par exemple, une image JPEG) fo:instream-foreign-object pour insérer un graphique dont le format de description est exprimé dans la syntaxe XML (par exemple, un graphique SVG ou une formule MathML) Les attributs de ces éléments sont :  L’attribut src qui a une valeur de type URI qui désigne l’emplacement du graphique à insérer  L’attribut content-type qui permet de spécifier le type de graphique Soit comme un type MIME : <fo:external-graphic contenttype= «content- type:image/gif» src=«resultat.gif»> Soit en termes d’espace de nom <fo:instream-foreign-object xmlns:svg=«http://www.w3.org/2000/svg» content- type=«namespace-prefix:svg»> Les attributs Width, et Height définissent la largeur et la hauteur du graphe. Un fo:external-graphic est de type inline (il est placé sur une ligne de texte). Pour le traiter comme un block il suffit de l’imbriquer dans un élément de type fo:block
  • 219.
    Brahim ER-RAHA Exemple <fo:block> <fo:external-graphic src="url(D:Bureauwebshots.bmp)"width="20pt" height="20pt"/> </fo:block <fo:block> Exemple de graphe SVG <fo:instream-foreign-object> <svg xmlns=http://www.w3.org/2000/svg width="1.5cm" height="1cm"> <polygon style="fill:#FFCCCC" points="0,31 18,0 36,31"/> </svg> </fo:instream-foreign-object> </fo:block>
  • 220.
    Brahim ER-RAHA b-5 LesLiens (Hyperliens) Deux types de liens peuvent être créer avec l'élément principal fo:basic-link :  Liens internes à travers l’attribut internal-destination en lui affectant l’ID du block à atteindre  Liens externes a travers l’attribut external-destination en lui affectant l’URL Exemple <fo:page-sequence master-reference="simple"> <fo:flow flow-name="xsl-region-body"> <fo:block id="A"> <fo:basic-link internal-destination="B">Cliquer-ici </fo:basic-link> pour aller vers le bloc avec id="B". </fo:block> <fo:block id="B">Block with id="B". <fo:basic-link internal-destination="A"> Cliquer-ici </fo:basic-link> pour aller vers le bloc avec id="A". </fo:block> </fo:flow> </fo:page-sequence>
  • 221.
    Brahim ER-RAHA b-6 Numérotationdes pages L’élément fo:page-number utilisé dans un contenu statique permet de placer le numéro de page. La présentation des numéros de page est régie via des attributs associés aux éléments de type fo:page-sequence, ces attributs sont :  initial-page-number : force-page-count  format, letter-value  grouping-separator  grouping-size Exemple : <fo:page-sequence master-reference="alterning"> <fo:static-content flow-name="evenFooter"> <fo:block font-family="Helvetica" font-size="10pt" text-align="left"> <fo:page-number/> </fo:block> </fo:static-content> <fo:static-content flow-name="oddFooter"> <fo:block font-family="Helvetica" font-size="10pt" text-align="right"> <fo:page-number/> </fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <xsl:apply-templates select=".//Recipe"/> <fo:block break-before="page"> <xsl:apply-templates select=".//Recipe/Title"/> </fo:block> </fo:flow> </fo:page-sequence>
  • 222.
    Brahim ER-RAHA XQUERY XQuery, langagenon XML, permet de traiter des ressources XML (fichier ou SGBD-XML) pour obtenir des structures XML. C'est un langage fonctionnel typé et basé sur la manipulation de liste de noeuds XML.
  • 223.
  • 224.
    Brahim ER-RAHA La placede XQuery dans le monde XML
  • 225.
    Brahim ER-RAHA Comment interrogerdes documents XML? Solutions :  SQL: il faut stocker XML dans une BD relationnel  XPath : extraction de fragments d’arbres  XQuery : vrai langage de requêtes pour XML  XSLT : extraction + transformation (règles)
  • 226.
  • 227.
  • 228.
    Brahim ER-RAHA LE BLOCDE BASE EN SQL
  • 229.
    Brahim ER-RAHA LE BLOCDE BASE EN XQUERY
  • 230.
    Brahim ER-RAHA <!ELEMENT bib(book*) > <!ELEMENT book ((author)+, title,publisher, price) > <!ATTLIST book year CDATA #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (la, fi )> <!ELEMENT la (#PCDATA )> <!ELEMENT fi (#PCDATA )> <!ELEMENT publisher (#PCDATA)> <!ELEMENT price (#PCDATA)> DTD Exemple: bib.dtd
  • 231.
  • 232.
    Brahim ER-RAHA Livres (titreet année) publiés par Addison-Wesley avant 1995, triés par ordre alphabétique de titre ? <bib> { for $b in doc("bib.xml")//book where $b/publisher = "Addison-Wesley" and $b/@year < 1995 order by $b/title return <book year="{$b/@year}"> {$b/title} </book> } </bib> EXEMPLE 1 : ÉNONCÉ
  • 233.
  • 234.
  • 235.
    Brahim ER-RAHA Une requêteXQuery est formée :  d’un prologue composé d’une suite de déclarations,  d’un corps composé d’une expression dont la valeur est le résultat de la requête.  La valeur d’une requête est la valeur de l’expression qui constitue son corps, évaluée dans le contexte défini par le prologue. STRUCTURE D’UNE REQUÊTE XQUERY
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
    Brahim ER-RAHA  Pasde distinction entre un item et une séquence de longueur 1 : 47 = (47)  Une séquence peut contenir des valeurs hétérogènes : (1, ‘‘toto’’, <toto/>)  Pas de séquences imbriqués : (1, (2, 6), "toto", <toto/>) =(1, 2, 6, ‘‘toto’’, <toto/>)  Une séquence peut être vide : ()  Les séquences sont triées : (1,2)#(2,1). VALEURS/SÉQUENCES
  • 242.
    Brahim ER-RAHA Valeurs construites: true(), date(‘‘2002-10-23’’ Noeud XML
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
    Brahim ER-RAHA exp1 +exp2 exp1 - exp2 exp1 * exp2 exp1 div exp2 Attention ! l’opérateur de division est div et non / réservé aux expressions de chemin. OPÉRATIONS ARITHMÉTIQUES
  • 248.
  • 249.
    Brahim ER-RAHA L’expression 1+ 5, 4 – 2, 7 * 3 a pour valeur la séquence 6, 2, 10  L’expression ((9, 1), 5, (8, 2)) a pour valeur la séquence 9, 1, 5, 8, 2  L’expression 2 to 5 a pour valeur la séquence 2, 3, 4, 5 L’expression 5 to 2 a pour valeur la séquence vide Opérations sur les séquences
  • 250.
    Brahim ER-RAHA exp1 eqexp2 exp1 ne exp2 exp1 lt exp2 exp1 le exp2 exp1 gt exp2 exp1 ge exp2 La valeur de exp1 op exp2 est obtenue en comparant les valeurs atomisées de exp1 et exp2. COMPARAISON DE VALEURS COMPARAISON DE VALEURS ATOMIQUES
  • 251.
    Brahim ER-RAHA  L’expression5 gt 7 a la valeur false.  L’expression <a>8</a> gt <b>9</b> a la valeur false,  L’expression nom = "Dupont" a la valeur : true si le noeud contexte a un noeud fils <nom>Dupont</nom> false sinon. COMPARAISON DE VALEURS ATOMIQUES
  • 252.
    Brahim ER-RAHA Requête: document("bib.xml")//book/author[la eq"Scholl"] Résultat: <author><la>Scholl</la><fi>M.</fi></author> Requête: document("bib.xml")//book[author/la eq "Scholl"] Résultat: ERROR L’expression author/la dans le prédicat ne retourne pas une valeur atomique mais une séquence de valeurs. COMPARAISON DE VALEURS ATOMIQUES
  • 253.
    Brahim ER-RAHA exp1 =exp2 exp1 != exp2 exp1 < exp2 exp1 <= exp2 exp1 > exp2 exp1 >= exp2 Les comparateurs généraux ont une sémantique existentielle : exp1 op exp2 a la valeur : true s’il existe un item i1 dans la valeur de exp1 et un item i2 dans la valeur de exp2 tel que i1 op i2 est vrai, false sinon. COMPARAISONS GÉNÉRALES
  • 254.
    Brahim ER-RAHA  L’expression (1,2) = (7, 2, 9, 12) a la valeur true L’expression 5 > (2, 9, 3) a la valeur true Si l’item contextuel est un noeud élément dont la valeur est <auteur>Dupont</auteur><auteur>Durand</auteur> alors l’expression auteur = "Dupont" a la valeur true COMPARAISONS GÉNÉRALES
  • 255.
    Brahim ER-RAHA exp1 isexp2 exp1 << exp2 exp1 >> exp2  Les deux opérandes doivent avoir pour valeur, soit une séquence vide, soit un noeud.  Si l’un des opérandes a pour valeur la séquence vide, la valeur de la comparaison est false.  Si la valeur de exp1 est le noeud n1 et la valeur de exp2 est le noeud n2 :  exp1 is exp2 a la valeur true, si les noeuds n1 et n2 sont les mêmes (même identifiant), sinon elle a la valeur false.  exp1 << exp2 a la valeur true, si le noeud n1 précède le nœud n2 dans l’ordre du document, sinon elle a la valeur false.  exp1 >> exp2 a la valeur true, si le noeud n1 suit le nœud n2 dans l’ordre du document, sinon elle a la valeur false. Comparaisons de noeuds
  • 256.
    Brahim ER-RAHA Comparaisons denoeuds L’expression /bib/book[@id="1"] << /bib/book[@id="2"] a la valeur true
  • 257.
    Brahim ER-RAHA Comparaison del’identité de deux noeuds : s1 is s2 s1 est identique à s2 Requête: document("bib.xml")//book[author[2] is author[last()]] Résultat: <book title="Comprendre XSLT"> <author><la>Amann</la><fi>B.</fi></author> <author><la>Rigaux</la><fi>P.</fi></author> <publisher>O’Reilly</publisher> <price>28.95</price> </book> Comparaisons de noeuds
  • 258.
    Brahim ER-RAHA Comparaison dela position de deux noeuds : s1<<s2 (s1>>s2) s1 apparaît avant (après) s2 dans le document. Requête: <livre> { document("bib.xml")//book[author[la="Abiteboul"] << author[la="Suciu"]]/@title } </livre> Résultat: <livre title="Data on the Web"/> Comparaisons par la position
  • 259.
    Brahim ER-RAHA exp1 unionexp2 exp1 | exp2 exp1 intersect exp2 Dans la séquence résultante :  les doubles (noeuds de même identifiant) sont éliminés,  les noeuds sont rangés dans l’ordre du document si le mode ordered n’est pas spécifié. Opérations sur les séquences de noeuds
  • 260.
    Brahim ER-RAHA L’expression doc("bib.xml")//(author| editor) a pour valeur la séquence des noeuds de type author et editor du document bib.xml.
  • 261.
    Brahim ER-RAHA Opérations surles séquences de noeuds
  • 262.
    Brahim ER-RAHA Requête: <livre> (:Le prixsuivi des auteurs:) 'commentaire { document("bib.xml")//book[1]/(price,author) } </livre> Résultat: <livre> Le prix suivi des auteurs: <price>28.95</price> <author><la>Amann</la><fi>B.</fi></author> <author><la>Rigaux</la><fi>P.</fi></author> </livre> On a changé l’ordre des noeuds (#union) CONCATÉNATION DE SÉQUENCES
  • 263.
  • 264.
  • 265.
  • 266.
  • 267.
    Brahim ER-RAHA Expressions dechemins Chaque étape est une expression XQuery (XPath 2.0) : doc(“bib.xml”)/bib/book/author doc(“bib.xml”)/bib//book[1]/publisher doc(“bib.xml”)//book/(author, publisher) :résultat ? doc(“bib.xml”)/(descendant::author,descendant::publisher) : résultat ? doc(“bib.xml”)//book/(@title union publisher) doc(“bib.xml”)//book[position() lt last()]
  • 268.
  • 269.
  • 270.
    Brahim ER-RAHA Le nomet le contenu sont calculés: element { expr-nom } { expr-contenu } attribute { expr-nom } { expr-contenu } Requête: element { document("bib.xml")//book[1]/name(*[1]) } { attribute { document("bib.xml")//book[1]/name(*[3]) } { document("bib.xml")//book[1]/*[3] } } Résultat: <title publisher="Addison-wesley"/>
  • 271.
  • 272.
    Brahim ER-RAHA La clausefor $var in exp affecte la variable $var successivement avec chaque item dans la séquence retournée par exp. La clause let $var := exp affecte la variable $var avec la séquence “entière” retournée par exp. Requête: for $b in document("bib.xml")//book[1] let $al := $b/author return <livre nb_auteurs="{count($al)}"> { $al } </livre> Résultat: <livre nb_auteurs="2"> <author><la>Amann</la><fi>B.</fi></author> <author><la>Rigaux</la><fi>P.</fi></author> </livre> Affectation de variables: for et let (FLWOR)
  • 273.
  • 274.
  • 275.
    Brahim ER-RAHA La clausewhere exp permet de filtrer le résultat par rapport au résultat booléen de l’expression exp (= prédicat dans l’expression de chemin). Requête: <livre> { for $a in document("bib.xml")//book where $a/author[1]/la eq "Abiteboul" return $a/@title } </livre> Résultat: <?xml version="1.0"?> <livre title="Data on the Web"/> SÉLECTION: WHERE
  • 276.
  • 277.
  • 278.
  • 279.
    Brahim ER-RAHA Requête: <livres> { for$b in document("bib.xml")//book where $b/author/la = "Rigaux" return if ($b/@year > 2000) then <livre recent="true"> {$b/@title} </livre> else <livre> {$b/@title} </livre> } </livres> Résultat: <?xml version="1.0"?> <livres> <livre title="Comprendre XSLT"/> <livre recent="true" title="Spatial Databases"/> </livres> TESTS: IF-THEN-ELSE
  • 280.
  • 281.
  • 282.
    Brahim ER-RAHA some $varin expr1 satisfies expr2 il existe au moins un noeud retourné par l’expression expr1 qui satisfait l’expression expr2. every $var in expr1 satisfies expr2 tous les nœuds retournés par l’expression expr1 satisfont l’expression expr2 Requête: for $a in document("bib.xml")//author where every $b in document("bib.xml")//book[author/la = $a/la] satisfies $b/publisher="Morgan Kaufmann Publishers" return string($a/la) Résultat: Scholl, Voisard, Abiteboul, Buneman, Suciu QUANTIFICATION
  • 283.
  • 284.
    Brahim ER-RAHA Expr1 sortby Expr2 (ascending | descending)? Trier les éléments de la séquence retournée par l’expression Expr1 par les valeurs retournées par Expr2. Requête: <livres>{ for $b in document("bib.xml")//book return <livre> { $b/@title, $b/@year } </livre> sort by(@year) } </livres> Résultat: <livres> <livre title="Data on the Web" year="2000"/> <livre title="Spatial Databases" year="2001"/> <livre title="Comprendre XSLT"/> </livres> TRIER AVEC SORT BY
  • 285.
  • 286.
    Brahim ER-RAHA Requête: for $bin document("bib.xml")//book return element livre { attribute titre {$b/@title}, for $a in $b/author return element auteur { attribute nom {$a/la}, for $p in document("addr.xml")//person where $a/la = $p/name return attribute institut {$p/institution} } } JOINTURE: REQUÊTE
  • 287.
    Brahim ER-RAHA <livre titre="ComprendreXSLT"> <auteur nom="Amann" institut="CNAM"/> <auteur nom="Rigaux"/> </livre>, <livre titre="Spatial Databases"> <auteur nom="Rigaux"/> <auteur nom="Scholl" institut="CNAM"/> <auteur nom="Voisard" institut="FU Berlin"/> </livre>, <livre titre="Data on the Web"> <auteur nom="Abiteboul"/> <auteur nom="Buneman"/> <auteur nom="Suciu"/> </livre> Résultat:
  • 288.
  • 289.
  • 290.
  • 291.
    XQuery : Langagede programmation XQuery n'est pas seulement un langage de requête "à la SQL". C'est aussi un vrai langage de programmation fonctionnel. Il possède un certain nombre de caractéristiques qui, couplées à quelques extensions, en font un outil intéressant pour du développement d'applications Web. Nous allons évoquer ici quelques caractéristiques de bases.
  • 292.
    Déclaration de variablesexternes Les variables externes sont déclarées de la manière suivante : ◦ declare variable $v [as type] external; ◦ Exemple : ◦ declare variable $v as xs:double external; Les types de variables Les types, aussi bien pour les variables que pour les signatures des fonctions, sont ceux de XSD avec, en plus, des types spécifiques. La figure(http://www.w3.org/TR/xpath- functions/type-hierarchy.png ). les rappelle
  • 293.
  • 294.
  • 295.
  • 296.
    Brahim ER-RAHA Requête: <books> { let$bl := document("bib.xml")//book for $b in $bl return <book> { $b/@title, attribute no {index-of($bl, $b)}} </book> } </books> Résultat: <?xml version="1.0"?> <books> <book title="Comprendre XSLT" no="1"/> <book title="Spatial Databases" no="2"/> <book title="Data on the Web" no="3"/> </books> EXEMPLE: INDEX-OF
  • 297.
  • 298.
  • 299.
  • 300.
    Brahim ER-RAHA Pour exemplevoir le diapo présentationXquery
  • 301.
  • 302.
    Brahim ER-RAHA Pour exemplevoir le diapo présentationXquery Avec base Xbase dossier testxquery
  • 303.
  • 304.
  • 305.
  • 306.
  • 307.
  • 308.
    Brahim ER-RAHA Utilisation desParseurs (DOM et SAX) Il existe plusieurs types de parseur. Les deux plus répandus sont ceux qui utilisent un arbre pour représenter et exploiter le document et ceux qui utilisent des événements. Le parseur peut en plus permettre de valider le document XML. Ceux qui utilisent un arbre permettent de le parcourir pour obtenir les données et modifier le document. Ceux qui utilisent des événements associent à des méthodes particulières pour traiter le document. SAX (Simple API for XML) est une API libre créée par David Megginson qui utilisent les événements pour analyser et exploiter les documents au format XML. Les parseurs qui produisent des objets composant une arborescence pour représenter le document XML utilisent le modèle DOM (Document Object Model) défini par les recommandations du W3C. Le choix d'utiliser SAX ou DOM doit tenir compte de leurs points forts et de leurs faiblesses : les avantages les inconvénients DOM parcours libre de l'arbre possibilité de modifier la structure et le contenu de l'arbre gourmand en mémoire doit traiter tout le document avant d'exploiter les résultats SAX peut gourmand en ressources mémoire rapide principes faciles à mettre en oeuvre permet de ne traiter que les données utiles traite les données séquentiellement un peu plus difficile à programmer, il est souvent nécessaire de sauvegarder des informations pour les traiter
  • 309.
    Brahim ER-RAHA SAX etDOM ne fournissent que des définitions : ils ne fournissent pas d'implémentation utilisable. L'implémentation est laissée aux différents éditeurs qui fournissent un parseur compatible avec SAX et/ou DOM. L'avantage d'utiliser l'un deux est que le code utilisé sera compatible avec les autres : le code nécessaire à l'instanciation du parseur est cependant spécifique à chaque fournisseur. - IBM fourni gratuitement un parseur XML : xml4j. Il est téléchargeable à l'adresse suivante : http://www.alphaworks.ibm.com/tech/xml4j - Le groupe Apache développe Xerces à partir de xml4j : il est possible de télécharger la dernière version à l'URL http://xml.apache.org - Sun a développé un projet dénommé Project X. Ce projet a été repris par le groupe Apache sous le nom de Crimson. Ces trois projets apportent pour la plupart les mêmes fonctionnalités : ils se distinguent sur des points mineurs : performance, rapidité, facilité d'utilisation etc. ... Ces fonctionnalités évoluent très vite avec les versions de ces parseurs qui se succèdent très rapidement. Pour les utiliser, il suffit de dézipper le fichier et d'ajouter les fichiers .jar dans la variable définissant le CLASSPATH. Il existe plusieurs autres parseurs que l'on peut télécharger sur le web: JDOM (acronyme de l'anglais Java Document Object Model), est une bibliothèque open source pour manipulation des fichiers XML en Java. Elle intègre DOM et SAX, et supporte XPath et XSLT
  • 310.
  • 311.
    XML: le traitementpar programme DOM Manipulation de l'arbre Mal formé/Invalide SAX événements – call back <ville>Paris</ville> XML <ville>Paris</ville> <pays>France</pays> <temp echelle="C">18</temp> Parser Bien formé Valide XSLT PDF RTF, Word (X)HTML <city>Paris</city> <temp degree="F">65</t emp> WML XML <ville>Paris</ville> <pays>France</pays> <temp echelle="C">18</temp> XML XML Schema (ou DTD) XSLFO XSL Stylesheet
  • 312.
  • 313.
  • 314.
    Brahim ER-RAHA DOM estl'acronyme de Document Object Model. C'est une spécification du W3C pour proposer une API qui permet de modéliser, de parcourir et de manipuler un document XML. Le principal rôle de DOM est de fournir une représentation mémoire d'un document XML sous la forme d'un arbre d'objets et d'en permettre la manipulation (parcours, recherche et mise à jour). A partir de cette représentation (le modèle), DOM propose de parcourir le document mais aussi de pouvoir le modifier. Ce dernier aspect est l'un des aspects les plus intéressants de DOM. DOM est défini pour être indépendant du langage dans lequel il sera implémenté. DOM n'est qu'une spécification qui pour être utilisée doit être implémentée par un éditeur tiers. Il existe deux versions de DOM nommées «niveau» : DOM Core Level 1 : cette spécification contient les bases pour manipuler un document XML (document, élément et noeud) DOM level 2 et 3 Le level 4 est en cours de développement V-3-1 les objets de DOM
  • 315.
  • 316.
  • 317.
  • 318.
  • 319.
  • 320.
    org.w3c.dom.Node  La classede base  Tout objet DOM est un Node  Methodes  public Node getFirstChild();  public java.lang.String getNodeName();  public short getNodeType();  public Node appendChild(Node newChild) throws DOMException  … Brahim ER-RAHA
  • 321.
    org.w3c.dom.NodeList  Liste ordonnéede Node  L’index commence à Zéro  Méthodes  public int getLength();  public Node item(int index) ; Brahim ER-RAHA
  • 322.
    org.w3c.dom.NamedNodeMap  Liste nonordonnée de Node  Recherche par nom  Méthodes  public Node getNamedItem(java.lang.String name);  public Node setNamedItem(Node arg) throws DOMException  … Brahim ER-RAHA
  • 323.
    org.w3c.dom.Document  Un objetde type Document représente le document XML en cours de traitement  Méthodes :  public NodeList getElementsByTagName(String tagname)  public Element getDocumentElement();  public Attr createAttribute(String name) throws DOMException  public Text createTextNode(String data)  public Comment createComment(String data)  … Brahim ER-RAHA
  • 324.
    org.w3c.dom.Element  Un objetde type Element représente un élément du document XML  Méthodes :  public java.lang.String getAttribute(String name);  public NodeList getElementsByTagName(String name);  public java.lang.String getTagName();  … Brahim ER-RAHA
  • 325.
    org.w3c.dom.Attr  Un objetde type Attr représente l’attribut d’un élément du document XML  Un objet de type Attr n’est pas le fils d’un objet de type Element représentant l’élément qui contient l’attribut (voir Node).  Méthodes :  public java.lang.String getName();  public java.lang.String getValue();  public void setValue(java.lang.String value) throws DOMException  … Brahim ER-RAHA
  • 326.
    org.w3c.dom.CharData  Supertype detout objet représentant du texte  Méthodes :  public String getData() throws DOMException  public void setData(String data) throws DOMException  public int getLength()  public void appendData(String arg) throws DOMException  public void insertData(int offset, String arg) throws DOMException  … Brahim ER-RAHA
  • 327.
    org.w3c.dom.Text  Hérite deCharData  Représente La valeur textuelle  D’un élément  D’un attribute  Deux objets Text consécutif seront uni lors du prochain parsing  Méthode :  public Text splitText(int offset) throws DOMException Brahim ER-RAHA
  • 328.
    org.w3c.dom.Comment  Hérite deCharData  Représente un commentaire XML  Ne contient pas les balises  <!- -  - - > Brahim ER-RAHA
  • 329.
    org.w3c.dom.CDATASection  Hérite deText  Représente une section littérale  Ne contient pas les balises  <![CDATA[  ]]> Brahim ER-RAHA
  • 330.
    org.w3c.dom.DocumentType  Les documentsXML ont un attribut doctype qui a pour valeur null ou un objet DocumentType  Représente la liste des entitées définies pour le document  Méthodes :  public NamedNodeMap getEntities()  public java.lang.String getName()  …  Attention un DocumentType ne représente pas la totalité de la DTD Brahim ER-RAHA
  • 331.
    org.w3c.dom.Entity  Représente uneEntité XML (parsable ou non parsable)  Représente l’entité et non pas la déclaration  Pas de trace de la valeur  Méthodes :  public java.lang.String getNotationName()  public java.lang.String getSystemId()  public java.lang.String getPublicId() Brahim ER-RAHA
  • 332.
    org.w3c.dom.EntityReference  Représente uneréférence vers une entité  Méthode :  Aucune  Sous-spécifié Brahim ER-RAHA
  • 333.
    Brahim ER-RAHA Chaque élémentqui compose l'arbre possède un type. Selon ce type, l'élément peut avoir certains éléments fils comme le montre le schéma ci-dessus. Toutes les classes et interfaces sont regroupées dans le package org.w3c.dom Voir le projet Eclipse XML-JDOM-DOM-SAX
  • 334.
  • 335.
  • 336.
  • 337.
    Brahim ER-RAHA Architecture d'uneapplication utilisant SAX :
  • 338.
    Brahim ER-RAHA l'application récupèreun parseur (javax.xml.parsers.SAXParser) à partir d'une fabrique de parseurs (javax.xml.parsers.SAXParserFactory). Ce parseur parcourt le document XML grâce à un lecteur (org.xml.sax.XMLReader). Ce dernier contient plusieurs gestionnaires (ou handlers). Ce sont ces différents gestionnaires qui sont chargés du traitement des "événements" lors du parsing. Voici les quatres principaux types de handlers (interfaces du package org.xml.sax) : • Gestionnaire de Contenu : Le ContentHandler est chargé des événements comme le début ou la fin du document, l'ouverture ou a fermeture de balises ou encore la lecture de caractères. • Gestionnaire d'Erreurs : Le ErrorHandler va traiter les trois types d'erreurs possibles lors du parsing : les erreurs simples, les erreurs fatales et les warnings. • Gestionnaire de DTD : Le DTDHandler (Document Type Definition) gère les événements relatifs aux DTD. • Gestionnaire d'entités externes : L'EntityResolver est chargé de gérer les entités externes, en fournissant une InputSource adéquate.
  • 339.
    Brahim ER-RAHA On nedoit pas implémenter les quatre types de handlers, Il faut utiliser la classe DefaultHandler du package org.xml.sax.helpers. Le fonctionnement de cette classe peut être comparé à celui des adapters pour les listeners (AWT et Swing). C'est-à-dire que cette classe propose une implémentation par défaut des quatres types de gestionnaires. Voir l’exemple Voir le projet Eclipse XML-JDOM-DOM-SAX
  • 340.
    Parseur SAX DOM Pourtraiter la totalité d’un document XML au moment de sa lecture, il faut utiliser un parseur SAX. JDK fournit un parseur DOM et un parseur SAX qui peuvent être utilisé sans passer par JDOM
  • 341.
    Interpréter un fichierXML SAX import javax.xml.parsers.*;import org.xml.sax.*; import org.xml.sax.helpers.*; public class SaxParser extends DefaultHandler { public SaxParser() { try { SAXParserFactory parserFactory=SAXParserFactory.newInstance(); SAXParser saxParser=parserFactory.newSAXParser(); saxParser.parse("EX3.xml",this); } catch (Exception e) { e.printStackTrace(); } }
  • 342.
    Interpréter un fichierXML @Override public void startDocument() throws SAXException { System.out.println("Début Document"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // Début de chaque élément System.out.println("Elément :"+qName); System.out.println("t Attributs:"); for(int i=0;i<attributes.getLength();i++){ System.out.println("tt"+attributes.getQName(i) +"="+attributes.getValue(i)); } }
  • 343.
    Interpréter un fichierXML @Override public void endElement(String uri, String localName, String qName) throws SAXException { // Fin de chaque élément } @Override public void endDocument() throws SAXException { // Fin du document } public static void main(String[] args) { new SaxParser(); } }
  • 344.
    JDOM ? JDOM estune API du langage Java développée indépendamment de Sun Microsystems. Elle permet de manipuler des donnés XML plus simplement qu'avec les API classiques. Son utilisation est pratique pour tout développeur Java et repose sur les API XML de Sun. JDOM permet donc de construire des documents, XML, de naviguer dans leur structure, s'ajouter, de modifier, ou de supprimer leur contenu. Voir le projet Eclipse XML-JDOM-DOM-SAX
  • 345.
    Origines de JDOM LesParseurs SAX ◦ SAX est l'acronyme de Simple API for XML. ◦ Ce type de parseur utilise des événements pour piloter le traitement d'un fichier XML. ◦ JDOM utilise des collections SAX pour parser les fichiers XML. Les Parseurs DOM : ◦ DOM est l'acronyme de Document Object Model. C'est une spécification du W3C pour proposer une API qui permet de modéliser, de parcourir et de manipuler un document XML. ◦ Le principal rôle de DOM est de fournir une représentation mémoire d'un document XML sous la forme d'un arbre d'objets et d'en permettre la manipulation (parcours, recherche et mise à jour). ◦ A partir de cette représentation (le modèle), DOM propose de parcourir le document mais aussi de pouvoir le modifier. ◦ Ce dernier aspect est l'un des aspect les plus intéressant de DOM. ◦ DOM est défini pour être indépendant du langage dans lequel il sera implémenté. ◦ JDOM utilise DOM pour manipuler les éléments d'un Document Object Model spécifique (créé grâce à un constructeur basé sur SAX).
  • 346.
    Créer un documentXML avec JDOM L’API JDOM : ◦ Il vous faut dans un premier temps télécharger la dernière version de JDOM disponible à cette adresse : http://www.jdom.org/dist/binary/. ◦ Il suffit ensuite de rendre accessible le fichier /build/jdom.jar, en le plaçant dans votre classpath. Création d’un document XML avec JDOM: ◦ La création d'un fichier XML en partant de zéro est des plus simple. ◦ Il suffit de construire chaque élément puis de les ajouter les uns aux autres de façon logique. ◦ Un noeud est une instance de org.jdom.Element. ◦ Nous commençons donc par créer une classe JDOM1 qui va se charger de créer l'arborescence suivante : <personnes> <etudiant classe="P2"> <nom>Katib</nom> </etudiant> </personnes>
  • 347.
    Exemple d’application pourla création d’un document XML avec JDOM import java.io.*;import org.jdom.*; import org.jdom.output.*; public class App1 { public static void main(String[] args) throws IOException { /*Créer l’élément racine */ Element racine = new Element("personnes"); /*Créer un document JDOM basé sur l’élément racine*/ Document document = new Document(racine); /*Créer un nouveau Element xml etudiant */ Element etudiant = new Element("etudiant"); /* Ajouter cet élément à la racine */ racine.addContent(etudiant); /*Créer un nouveau attribut classe dont la valeur est P2 */ Attribute classe = new Attribute("classe","P2"); /* Ajouter cet attrubut à l’élément etudiant */ etudiant.setAttribute(classe); Element nom = new Element("nom"); /* Créer l’élément nom */ nom.setText("Katib"); /* Définir le texte de nom */ etudiant.addContent(nom); /* ajouter nom à etudiant */ /* Afficher et enregistrer le fichier XML */ XMLOutputter sortie=new XMLOutputter(Format.getPrettyFormat()); sortie.output(document, System.out); sortie.output(document, new FileOutputStream("EX1.xml")); }}
  • 348.
    Parcourir un documentXML avec JDOM Parser un fichier XML revient à transformer un fichier XML en une arborescence JDOM. Nous utiliserons pour cela le constructeur SAXBuilder, basé, comme son nom l'indique, sur l'API SAX. Créez tout d'abord le fichier suivant dans le répertoire contenant votre future classe JDOM2 : <?xml version="1.0" encoding="UTF-8"?> <personnes> <etudiant classe="P2"> <nom>katib</nom> <prenoms> <prenom>mohamed</prenom> <prenom>amine</prenom> </prenoms> </etudiant> <etudiant classe="P1"> <nom>talbi</nom> </etudiant> <etudiant classe="P1"> <nom>santel</nom> </etudiant> </personnes>
  • 349.
    Afficher les nomsdes étudiants du fichier XML import java.io.*;import java.util.List; import org.jdom.*;import org.jdom.input.SAXBuilder; public class App2 { public static void main(String[] args) throws Exception { /* On crée une instance de SAXBuilder */ SAXBuilder sb=new SAXBuilder(); /* On crée un nouveau document JDOM avec en argument le fichier XML */ Document document=sb.build(new File("EX2.xml")); /*On initialise un nouvel élément racine avec l'élément racine du document.*/ Element racine=document.getRootElement(); /* On crée une List contenant tous les noeuds "etudiant" de l'Element racine */ List<Element> etds=racine.getChildren("etudiant"); /* Pour chaque Element de la liste etds*/ for(Element e:etds){ /*Afficher la valeur de l'élément nom */ System.out.println(e.getChild("nom").getText()); } } }
  • 350.
    Modifier une arborescenceavec JDOM Quelques méthodes de JDOM: ◦ addContent : Ajoute le contenu de l'argument à la fin du contenu d'un Element. On peut spécifier un index pour l'inserer à la position voulu. ◦ clone : Retourne un clone parfait de l'Element. ◦ cloneContent : on ne copie que le contenu. ◦ removeAttribute : Supprime un attribut d'un Element ◦ removeChild : Supprime le premier enfant portant ce nom. ◦ removeChildren : Supprime tous les enfants ayant ce nom. ◦ removeContent : Supprime l'intégralité d'un noeud donné en argument ou par sa position. removeContent accept aussi les filtres, tout comme getContent vu précédement. ◦ setAttribute : permet à la fois de créer un attribut et d'en modifier sa valeur. ◦ setContent : Remplace le contenu d'un Element. On peut spécifier un index si l'on ne veut pas tout remplacer. ◦ setName : Change le nom de l'Element. ◦ setText : Change le text contenu par l'Element. <element>TEXT</element> ◦ toString : Retourne une représentation de l'Element sous forme de chaine.
  • 351.
    JDOM et XSLT Grâceà l'API JAXP et TraX il est très facile de faire des transformation XSLT sur un document JDOM. Dans l'exemple suivant nous allons créer une méthode qui prend en entrée un document JDOM et le nom d'un fichier XSL et qui crée en sortie un fichier XML transformé.
  • 352.
    Fichier XML <?xml version="1.0"encoding="UTF-8"?> <personnes> <etudiant classe="P2"> <nom>katib</nom> <prenoms> <prenom>mohamed</prenom> <prenom>amine</prenom> </prenoms> </etudiant> <etudiant classe="P1"> <nom>talbi</nom> </etudiant> <etudiant classe="P1"> <nom>santel</nom> </etudiant> </personnes>
  • 353.
    Fichier XSL pourgénérer une sortie HTML <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head></head> <body> <table border="1" width="80%"> <tr> <th>Nom</th><th>Prénoms</th> </tr> <xsl:for-each select="personnes/etudiant"> <tr> <td><xsl:value-of select="nom"/></td> <td><xsl:value-of select="prenoms/prenom[1]"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
  • 354.
    Exemple de transformationXSL avec JDOM import java.io.*; import org.jdom.*; import org.jdom.input.SAXBuilder; import javax.xml.transform.*; import javax.xml.transform.stream.StreamSource; public class JDOM4{ public static void main(String[] args) { SAXBuilder sb=new SAXBuilder(); try { Document jDomDoc=sb.build(new File("Exercice2.xml")); outputXSLT(jDomDoc, "classe.xsl"); } catch (Exception e) { e.printStackTrace(); } }
  • 355.
    Exemple de transformationXSL avec JDOM public static void outputXSLT(org.jdom.Document documentJDOMEntree,String fichierXSL){ /*Document JDOMResult, résultat de la transformation TraX */ JDOMResult documentJDOMSortie = new JDOMResult(); /* Document JDOM après transformation */ org.jdom.Document resultat = null; try{ /* On définit un transformer avec la source XSL qui va permettre la transformation */ TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource(fichierXSL)); /* On transforme le document JDOMEntree grâce à notre transformer. La méthoded transform() prend en argument le document d'entree associé au transformer et un document JDOMResult, résultat de la transformation TraX */ transformer.transform(new org.jdom.transform.JDOMSource (documentJDOMEntree), documentJDOMSortie); /* Pour récupérer le document JDOM issu de cette transformation, il faut utiliser la méthode getDocument() */ resultat = documentJDOMSortie.getDocument(); /* On crée un fichier xml corespondant au résultat */ XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); outputter.output(resultat, new FileOutputStream("resultat.htm")); } catch(Exception e){} }}
  • 356.
    Fichier HTML généré: resultat.htm <?xml version="1.0" encoding="UTF-8"?> <html> <head /> <body> <table border="1" width="80%"> <tr> <th>Nom</th> <th>Prénoms</th> </tr> <tr> <td>CynO</td> <td>Nicolas</td> </tr> <tr> <td>Superwoman</td> <td /> </tr> <tr> <td>Don Corleone</td> <td /> </tr> </table> </body> </html>
  • 357.
    Application 1- Créer uneapplication java qui permet de créer le fichier XML suivant : meteo.xml <?xml version="1.0" encoding="UTF-8"?> <meteo> <mesure date="2006-1-1"> <ville nom="casa" temp="25" /> <ville nom="rabat" temp="28" /> </mesure> </meteo>
  • 358.
    Application 4 - Créerune feuille de style XSL qui permet de transformer le document XML meteo2.xml en document HTML suivant : 5 - Créer une application java qui permet d’afficher la transformation du fichier XML meteo2.xml par la feuille de style XSL que vous venez de créer. Enregistrer la sortie dans un fichier m.htm
  • 359.
  • 360.
    Brahim ER-RAHA Voir lesvideo projet eclipse : XML_JDOM_DOM_SAX
  • 361.
  • 362.
    Brahim ER-RAHA XML ETLES BASES DE DONNÉES XML est devenu dans peu de temps le format standard de structuration et d’échange de données le plus populaire. Ce métalangage est capable d’être le format du stockage, du transport et d’affichage des données. Parallèlement, les bases de données relationnelles constituaient depuis un bon moment et constituent toujours le moyen le plus utilisé pour le stockage des données dans la plupart des entreprises, et ce pour leur capacité de mettre à disposition d’un grand nombre d’utilisateurs des données avec un accès rapide et un bon niveau de sécurité. Pour ces raisons et pour les avantages qu’offrent ces deux moyens, à savoir XML et les SGBDs, plusieurs auteurs pensent que « l’utilisation combinée de ces deux méthodes offre également au programmeur un grand nombre de possibilités. D’une part, les bases de données relationnelles apportent une gestion et des fonctionnalités de sécurité fiables… d’autre part, dans la mesure où le langage XML est composé uniquement de texte, il peut facilement être transmis sur un réseau, et d’une plate-forme à l’autre… de plus, il peut facilement être traduit d’un langage à l’autre» 1 INTRODUCTION
  • 363.
    Brahim ER-RAHA Plusieurs raisonsdonc nous poussent à associer XML et les bases de données : stocker des documents XML dans une base de données ou utiliser un contenu d’une base de données au format XML : - XML fournit une méthode de représentation des données structurées sans ajout d’informations, - XML permet la réutilisation des données par des systèmes d’héritage, - XML peut être utilisé par des outils déjà disponibles (Feuilles de style : XSLT et serveurs XML : ex : Biztalk…), - XML, en contenant les données et la structure, permet facilement la transmission et la représentation des données, - Les bases de données sont plus adaptées que XML pour des utilisations internes de recherche.
  • 364.
  • 365.
  • 366.
    Brahim ER-RAHA 2- TRANSFORMATIONBASÉE SUR LES TABLES La correspondance basée sur des tables est utilisée par de nombreux logiciels qui transfèrent les données entre une base relationnelle et un document XML. Elle modélise les documents sous la forme d’une table unique ou comme un ensemble de tables. Cela signifie que la structure d’un document XML doit être comme suit : Selon le logiciel, il peut être possible de spécifier si la colonne de données est stockée en tant qu’éléments fils ou comme attributs, ainsi que les noms à utiliser pour chaque élément ou attribut. La correspondance basée sur des tables est utile pour sérialiser des données relationnelles, comme par exemple pour transférer des données entre deux bases de données relationnelles. Son inconvénient évident est qu’elle ne peut pas être utilisée par les autres SGBD. (voir exemple pg :61) <database> <table> <row> <column1>...</column1> <column2>...</column2> ... </row> ... </table> <table> ... </table> ... </database>
  • 367.
    Brahim ER-RAHA Dans unebase de données, il y a des différentes tables qui stockent chacune un ensemble de données liées à une entité déterminée. Une table représentant une adresse postale d’une personne par exemple peut être schématisée comme suit : Cette table est créée, par le biais du langage SQL, comme suit : Prénom Nom Rue Ville Code postale Pays Omar Ramki Rue des Far Agadir 80000 Maroc Create table PERSONNE (Prenom VARCHAR(35), Nom VARCHAR (35), Rue VARCHAR (35), Ville VARCHAR (35), Code_postal VARCHAR (9), Pays VARCHAR (35)) ; XML permet deux moyens de représenter ces données : en utilisant des éléments ou des attributs
  • 368.
    Brahim ER-RAHA En utilisantdes éléments, nous pouvons présenter l’élément « Personne » comme suit : En utilisant des attributs, l’élément « Personne » peut être présenté comme suit : <Personne> <Prénom>Omar</Prénom> <Nom>Ramki</Nom> <Rue>Rue des FAR</Rue> <Ville>Agadir</Ville> <Code_postal>80 000</Code_postal> <Pays>Maroc</Pays> </Personne> <Personne Prénom="Omar" Nom="Ramki" Rue="Rue des FAR" Ville="Agadir" Code_postal="80 000" Pays="Maroc"/>
  • 369.
    Brahim ER-RAHA Considérons lecas d'une base de données relationnelle qui contient deux tables en relation à travers l'exemple suivant : Le script qui permet de créer ces deux tables est le suivant : CREATE TABLE PROPRIETAIRE (ID_Proprietaire BIGINT(100) NOT NULL, Prenom_Owner VARCHAR(255) NOT NULL,Nom_Owner VARCHAR(255) NOT NULL, Tel_Owner VARCHAR (25) NOT NULL, Email_Owner VARCHAR (255), Ville_Owner VARCHAR (35) PRIMARY KEY (ID_Proprietaire)); CREATE TABLE MODELEXML (ID_Modele BIGINT(100) NOT NULL , Designation_Modele VARCHAR(255) NOT NULL, Version VARCHAR(255) NOT NULL, Date_Version DATE NOT NULL, Mots_Cles TEXT, ID_Proprietaire BIGINT (100), PRIMARY KEY (ID_Modele), FOREIGN KEY (ID_Proprietaire) REFERENCES PROPRIETAIRE (ID_Proprietaire));
  • 370.
    Brahim ER-RAHA En XML,cette association des deux tables peut être illustrée par une imbrication en éléments fils de la table référence. < !ELEMENT PROPRIETE_MODELE (MODELEXML+)> < !ATTLIST PROPRIETE_MODELE Prenom_Owner CDATA #REQUIRED Nom_Owner CDATA #REQUIRED Tel_Owner CDATA #REQUIRED Email_Owner CDATA #REQUIRED Ville_Owner CDATA #REQUIRED> <!ELEMENT MODELEXML EMPTY> <!ATTLIST MODELEXML Designation_Modele CDATA #REQUIRED Version CDATA #REQUIRED Date_Version CDATA #REQUIRED Mots_Cles CDATA #REQUIRED>
  • 371.
  • 372.
    Brahim ER-RAHA Le scriptqui permet de créer cette troisième table est le suivant : CREATE TABLE PROPRIETAIRE (ID_Proprietaire BIGINT(100) NOT NULL, Prenom_Owner VARCHAR(255) NOT NULL, Nom_Owner VARCHAR(255) NOT NULL, Tel_Owner VARCHAR (25) NOT NULL, Email_Owner VARCHAR (255), Ville_Owner VARCHAR (35), PRIMARY KEY (ID_Proprietaire)); CREATE TABLE ORGANISATION (ID-Organisation BIGINT (100) NOT NULL, om_Org VARCHAR (35), Acronyme_Org VARCHAR (35), Tel_Org VARCHAR (25), Site_Web_Org VARCHAR (255), Ville_Org VARCHAR (255), PRIMARY KEY (ID_Organisation)); CREATE TABLE MODELEXML (ID_Modele BIGINT(100) NOT NULL, Designation_Modele VARCHAR(255) NOT NULL, Version VARCHAR(255) NOT NULL, Date_Version DATE NOT NULL, Mots_Cles TEXT, ID_Proprietaire BIGINT (100), PRIMARY KEY (ID_Modele), FOREIGN KEY (ID_Proprietaire) REFERENCES PROPRIETAIRE (ID_Proprietaire), FOREIGN KEY (ID_Organisation) REFRENCES ORGANISATION (ID_Organisation));
  • 373.
    Brahim ER-RAHA < !ELEMENTDONNEES_MODELE (PROPRIETE_MODELE, ORGANISATION+)> <!ELEMENT PROPRIETE_MODELE (MODELEXML+)> < !ATTLIST PROPRIETE_MODELE Prenom_Owner CDATA #REQUIRED Nom_Owner CDATA #REQUIRED Tel_Owner CDATA #REQUIRED Email_Owner CDATA #REQUIRED Ville_Owner CDATA #REQUIRED> <!ELEMENT MODELEXML EMPTY> <!ATTLIST MODELEXML IDREFORGANISATION IDREF #REQUIRED Designation_Modele CDATA #REQUIRED Version CDATA #REQUIRED Date_Version CDATA #REQUIRED Mots_Cles CDATA #REQUIRED> <!ELEMENT ORGANISATION EMPTY> <!ATTLIST ORGANISATION ID_Organisation ID #RQUIRED Nom_Org CDATA #REQUIRED Acronyme_Org CDATA #REQUIRED Tel_Org CDATA #REQUIRED Site_Web_Org CDATA #REQUIRED Ville_Org CDATA #REQUIRED> Pour présenter cette relation plus complexe en XML, nous pouvons créer le modèle de données suivant
  • 374.
    Brahim ER-RAHA Dans cetteméthode, nous écrivons un modèle XML, qui va décrir exactement le modèle cible, les données extraites de SGBD étant insérées dans cette structure. Nous utilisant pour cela une API ODBC2XML qui est typique dans ce modèle (cette API est de type Shareware). Le modèle XML est un document XML bien formé dans le quel les requêtes SQL apparaissent dans des instructions de traitement. Les données reçues de la connexion ODBC en réponse à ces requêtes sont utilisées pour générer les éléments qui suivent immédiatement l'instruction de traitement 2 EXTRACTION CONTROLÉE PAR UN MODÈLE XML Exemple : Supposons qu'on a la table "produits" suivante : ProduitRef Nom Poids R1 Oxava212 255 R2 Siripi314 300 R3 Siripi433 433 R4 Slim633 236 R5 Remoc500 652
  • 375.
    Brahim ER-RAHA Le modèleXML d'extraction de données est : <?xml version="1.0"?> <Catalogue> <Titre> Voici le poids de chacun de nos produits : </Titre> <Liste> <?odbc2xml q1: select * from produits?> <Produit id=" odbc2xml q1.ProduitRef "> <Nom> <?odbc2xml q1.Nom?> <Nom> <Poids> <?odbc2xml q1.Poids?> <Poids> </Produit> </Liste> </Catalogue> <Catalogue> <Titre> Voici le poids de chacun de nos produits :</Titre> <Liste> <Produit id=" R1 "> <Nom> Oxava212<Nom> <Poids>255 <Poids> </Produit> <Produit id=" R2 "> <Nom> Siripi314<Nom> <Poids>300 <Poids> </Produit> <Produit id=" R3 "> <Nom> Siripi433<Nom> <Poids>433 <Poids> </Produit> ...</Liste></Catalogue> Après avoir exécuter l'api ODBC2XML , on obtiendra comme résultat :
  • 376.
    Brahim ER-RAHA Le modèleXML d'extraction de données est : <?xml version="1.0"?> <Catalogue> <Titre> Voici le poids de chacun de nos produits : </Titre> <ListeParFournisseur> <?odbc2xml q1: select * from Fournisseur where ville="Casa"?> <Fournisseur id=" odbc2xml q1.CodeFournisseur "> <Nom> <?odbc2xml q1.NomFournisseur?> </Nom> </Fournisseur> <ListProduit> <?odbc2xml q2: select * from Produit where CodeFournisseur = : q1.CodeFournisseur ?> <Produit id=" odbc2xml q1.ProduitRef "> <Nom> <?odbc2xml q1.Nom?> <Nom> <Poids> <?odbc2xml q1.Poids?> <Poids> </Produit> </ListeProduit> </ListeParFournisseur></Catalogue> Considérons la requête suivante : Select * from produit, fournisseurs Where fournisseurs.ville="Casa" And Fournisseurs.CodeFournisseur=Produit.Co deFournisseur