Académique Documents
Professionnel Documents
Culture Documents
Cours XML Final
Cours XML Final
Brahim ER-RAHA
Je veux envoyer ma carte de visite par courrier électronique
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
Brahim ER-RAHA
Autre possibilité :
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
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
Le principal langage du Web est HTML
HTML est un langage pour présenter des informations à l’écran.
Brahim ER-RAHA
Nouveaux besoins : échange et publication de données.
Brahim ER-RAHA
Brahim ER-RAHA
Origine de XML
Standard Generalized Markup Language
SGML
( Sépare les données la structure des données et la
mise en forme )
I-1 Définition
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/)
Brahim ER-RAHA
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 Fichiers XML dont le contenu est généré
Dynamiquement et povient d’une source
De donnée comme une BD relationnelle
Fichier.xml Fichier.xml
Fichier.xml
Middleware
XMLizer XML Application de
publication
(XSL)
Base de
Données
TV Numérique
Projet GIE Cartes Bancaires:
publication des spécifications de protocoles pour réseau Carte Bancaires
vers les fournisseurs et prestataires du GIE
Pourquoi XML ?
Échange de données: ETL
Extractor Mapper
JDBC JDBC
BD
relationnelle
Datawarehouse
Datamining
Projet MEN : Echange de données avec
les académies (remontée et descente)
Pourquoi XML ?
Gestion documents semi structurés
Amendemen Serveur d’Applications
t HTTP GET
Requêtes Requêtes
SGBDR
Feuille
Feuille
Feuille
HTML généré de
destyle
Processeur destyle
style
XSL XSL
XSL
XSL
Pourquoi XML ?
Échange B2B XML EDI
XML EDI
XMLizer
Donneur d’ordre
Internet
(SOAP)
Fournisseur
Projet EDIXML : Expérimentation de la
chaîne pour un grand donneur d'ordres
Pourquoi XML ?
Forces et faiblesses de XML
Une technologie Une syntaxe bavarde
structurante Un méta-langage, mais de
Clarifie tous les échanges nombreux langages
Des standards internes et Coûteux en CPU
externes Parsing
Transversale à l'entreprise Coûteux en mémoire
Échanges de données
Instanciation
Bureautique Format compressé à l’étude
GED XML Binaire
Sites Web
EDI
Bases de données
Intégration e-business
…
Pourquoi XML ?
I-2 Avantages de XML
Autodescriptif et extensible
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
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.
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.
Brahim ER-RAHA
I-3 Mise en page de XML
Brahim ER-RAHA
I-4 Structure des documents XML
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.
Brahim ER-RAHA
I-5 Décodage d'un document XML
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.
Brahim ER-RAHA
Structure d’un document 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.
II DOCUMENT XML
Tout document XML se compose :
Brahim ER-RAHA
Quelques outils de travail
Editeur Outil Support
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"/>
</biblio>
</etudiant>
biblio
Biblio
+ etudiant
@code
@nom Etudiant Etudiant Etudiant
@prenom
@age
+ livre
@id livre livre livre
@titre
@datePret
@rendu
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.
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>
<parent><enfant>Omar</enfant></parent>
Brahim ER-RAHA
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.
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
h- Contenu d’un élément
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>
Brahim ER-RAHA
j- Référence à des caractères ou à des idéogrammes
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).
< <
> >
& &
' ‘
" "
Brahim ER-RAHA
l- Les commentaires
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.
Brahim ER-RAHA
II-2 Document XML validé
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
a- DTD interne
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.
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.
Brahim ER-RAHA
2 Déclaration des éléments
Élément vide
Un élément vide ne contient aucun texte, aucun autre élément, comme les
éléments IMG, HR, BR de HTML.
Par exemple, dans la DTD de XHTML 1.0 l’élément img est déclaré : <!
ELEMENT img EMPTY>
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 :
Conteneur d’éléments
Mixte
Élément libre
Élément qui peut contenir tout élément déclaré dans la DTD et du texte.
<!ELEMENT nom_element ANY>
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>
Brahim ER-RAHA
3- Déclaration d’attribut
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.
Brahim ER-RAHA
Types de données
- É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
Brahim ER-RAHA
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 :
Brahim ER-RAHA
Travail demandé
1. Faire une représentation graphique de l’arbre XML.
2. Ecrire une DTD qui permet de valider ce document XML
3. Créer le fichier XML
4. 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
<?xml version="1.0" encoding="UTF-8"?>
@code
<!ELEMENT operateur (client+) >
<!ELEMENT client (abonnement+) > @nom
<!ELEMENT abonnement (facture+) >
<!ELEMENT facture EMPTY > +abonnement
<!ATTLIST client
code NMTOKEN #REQUIRED @num
nom CDATA #REQUIRED>
<!ATTLIST abonnement @type
num NMTOKEN #REQUIRED @dateAb
type (GSM|FIXE) 'FIXE'
dateAb CDATA #REQUIRED> +facture
<!ATTLIST facture
numFact NMTOKEN #REQUIRED @numFact
dateFact CDATA #REQUIRED
montant CDATA #REQUIRED @dateFact
reglee (oui|non) 'non'> @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>
-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 :
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 :
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
Exemple :
%fich-dtd-1;
%fich-dtd-2;
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 :
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 "ODEHEXA;">
Par exemple
<! ENTITY ccedille "ç">
<!ENTITY CopieRight "©">
<!ENTITY Delta "δ" >
Dans le document l’appel s’effectue avec &nom;
<code> le petit Delta est : Δ</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).
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;
<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 :
Les entités externes représentent des données contenues dans des fichiers
séparés par rapport au document XML.
Analysées
Brahim ER-RAHA
Exemple :
Brahim ER-RAHA
Non analysées
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.
Brahim ER-RAHA
III MODELE SCHAMA XML
Brahim ER-RAHA
III-1 Syntaxe de Déclaration d'un Schema
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>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="modele.xsd">
</Root>
Brahim ER-RAHA
2- Schéma avec espace de nom
Si un schéma définit un espace de nom, son élément racine définit les attributs
suivants :
</Root>
Brahim ER-RAHA
Voir le dossier Exemple cours XML
Brahim ER-RAHA
III-1 Déclaration des éléments dans un Schema
Avec name représente le nom de l'élément et type détermine le type de son contenue
Brahim ER-RAHA
a- Définition des types simples
a-1 Type simple prédéfini
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>
Brahim ER-RAHA
Les types simples (1)
string integer
Confirm this is electric -126789, -1, 0, 1, 126789
normalizedString positiveInteger
Confirm this is electric 1, 126789
token negativeInteger
Confirm this is electric -126789, -1
byte nonNegativeInteger
-1, 126 0, 1, 126789
unsignedByte nonPositiveInteger
0, 126 -126789, -1, 0
base64Binary int
GpM7 -1, 126789675
hexBinary unsignedInt
0FB7 0, 1267896754
Schema
Les types simples (2)
long boolean
-1, 12678967543233 true, false 1, 0
unsignedLong time
0, 12678967543233 13:20:00.000, 13:20:00.000-
short 05:00
-1, 12678 dateTime
unsignedShort 1999-05-31T13:20:00.000-
0, 12678 05:00
decimal duration
-1.23, 0, 123.4, 1000.00 P1Y2M3DT10H30M12.3S
float date
-INF, -1E4, -0, 0, 12.78E-2, 12, 1999-05-31
INF, NaN gMonth
double --05--
-INF, -1E4, -0, 0, 12.78E-2, 12,
INF, NaN
gYear
1999
Schema
Les types simples (3)
gYearMonth language
1999-02 en-GB, en-US, fr
gDay
---31
ID
gMonthDay "A212"
--05-31 IDREF
Name "A212"
shipTo
IDREFS
QName
po:USAddress
"A212" "B213"
NCName ENTITY
USAddress ENTITIES
anyURI
http://www.example.com/,
NOTATION
http://www.example.com/ NMTOKEN, NMTOKENS
doc.html#ID5 US
Brésil Canada Mexique
Schema
a-2 Type simple personnalisé (dérivé)
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
et le déclaration de type dans l'élément se
<xs:simpleType name="mytype"> fait par:
definition de type <xs:element name="myelt" type="mytype"/>
</xs:simpleType>
La dérivation de ces types à partir des types prédéfinis se fait soit par :
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 :
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 :
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 :
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
b- Définition de types complexes
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:
-<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.
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)
Brahim ER-RAHA
sequence
<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>
<entete>
<titre>...</titre>
<auteur>...</auteur>
<titre> …</titre>
<auteur>…</auteur>
</entete>
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>
<entete>
<titre>...</titre>
<titre>….</titre>
<auteur>...</auteur>
<titre> …</titre>
<titre>….</titre>
<auteur>…</auteur>
</entete>
Brahim ER-RAHA
Choice
<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>
<entete>
<titre>...</titre>
<auteur>…</auteur>
</entete>
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>
<entete>
<titre>...</titre>
<titre>….</titre>
<auteur>...</auteur>
</entete>
Brahim ER-RAHA
all
<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>
<entete>
<titre>...</titre>
<auteur>...</auteur>
<auteur> …</auteur>
<titre>….</titre>
<auteur>…</auteur>
</entete>
minOccurs ou maxOccurs de all et de ses éléments n’accepte que 0 ou 1
Brahim ER-RAHA
b-2 contenu composé uniquement d'attributs (Element vide)
<xsd:complexType name="ImageType">
<xsd:attribute name="src" type="xsd:anyURI" />
</xsd:complexType>
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>
<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>
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 :
Brahim ER-RAHA
c-Définitions d'attributs dans un type complexe
Pour illustrer la définition d'attributs, reprenons l'exemple suivant :
Dans une déclaration d'attribut, l'attribut use peut prendre les valeurs suivantes
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.
autres
signification
attributs
si l'attribut ainsi défini est présent dans la balise, il ne peut prendre que la valeur associée à
fixed fixed. Exemple:
<xsd:attribute name="..." type="xsd:decimal" fixed="0" />
l'attribut peut ne pas être défini, auquel cas il prendra une valeur par défaut. Exemple:
default
<xsd:attribute name="..." type="xsd:decimal" default="10" />
Brahim ER-RAHA
e- Annotations
<xs:complexType>
<xs:group ref="myGroup">
</xs:complexType>
Brahim ER-RAHA
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.
Un exemple de fichier XML correspondant à ce problème est le suivant
Brahim ER-RAHA
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
IV- Mise en page d'un document XML
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
Brahim ER-RAHA
IV-1 feuilles de style CSS.
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.
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
<?xml version='1.0'?>
<?xml-stylesheet href="FeuilleDeStyle.css" type="text/css" ?>
Brahim ER-RAHA
1- Principe de base
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 :
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
Brahim ER-RAHA
2-Héritage
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 :
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.
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.
Brahim ER-RAHA
3- Importation des règles
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,
Brahim ER-RAHA
4- La cascade
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 :
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.
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>
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
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
6- Sélecteurs d’éléments : Les sélecteurs d’éléments disponibles en CSS sont :
Brahim ER-RAHA
Exemple :
-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.
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:
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.
L'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 :
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 :
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.
Brahim ER-RAHA
1- Langage XSLT
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 :
Brahim ER-RAHA
1-2 Structure d’une feuille de style XSLT
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 :
Brahim ER-RAHA
I-3 Modèle unique pour un document XML
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.
<?xml version="1.0"?> <?xml version= “1.0 “?>
<?xml-stylesheet type="text/xsl" <xsl:stylesheet xmlns:xsl="
href="biblio.xsl" ?> http://www.w3.org/1999/XSL/Transform
<bibliotheque> ">
<livre> <xsl:template match="/">
<titre>N ou M</titre> <H2>Bibliotheque</H2>
<auteur>Agatha Christie</auteur> <xsl:for-each
<ref>Policier-C-15</ref> select="bibliotheque/livre">
</livre> <P style="font-style:italic">
<livre> <xsl:value-of select="titre"/>
<titre>Le chien des Baskerville</titre> </P>
<auteur>Sir Arthur Conan Doyle</auteur> <P style="color:red">
<ref>Policier-D-3</ref> <xsl:value-of select="auteur"/>
</livre> </P>
<livre> <P style="color:blue">
<titre>Dune</titre> <xsl:value-of select="ref"/>
<auteur>Franck Heckbert</auteur> </P>
<ref>Fiction-H-1</ref> </xsl:for-each>
</livre> </xsl:template>
</bibliotheque> </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>
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
a- Langage Xpath
<xsl:template match="//nom[position()=1]">
Brahim ER-RAHA
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 :
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 [].
Brahim ER-RAHA
../famille[(@type="non métal") and (atome/masse > 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/atome[3] [masse > 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 > 34] [3] sélectionne le 3ème élément parmi les atomes,
dont la masse est > à 34, des fils famille du nœud racine
/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
I- Syntaxe Simple
<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>>
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>
<AAA> <CCC>
<BBB/> <DDD>
<CCC/> <BBB/>
<BBB/> <BBB/>
<DDD> </DDD>
<BBB/> </CCC>
</DDD> </AAA>
Brahim ER-RAHA
6- /*/*/*/BBB
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>
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>
Brahim ER-RAHA
18- //*[count(*)=3] : Sélectionne les éléments ayant trois enfants
Brahim ER-RAHA
19- //*[name()='BBB']
Brahim ER-RAHA
21- //*[starts-with(name(),'B')] :
Brahim ER-RAHA
23- //*[string-length(name()) = 3]
<AAA>
<Q/>
<SSSS/>
<BB/>
<CCC/>
<DDDDDDDD/>
<EEEE/>
</AAA>
<AAA>
<BBB/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<EEE/>
</AAA>
Plusieurs chemins peuvent être combinés avec le séparateur |
Brahim ER-RAHA
II- Noms d'axes
1- /AAA : Équivalent à /child::AAA
<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
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
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::*
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>…..
Brahim ER-RAHA
b- Action possible par le langages XSLT
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 :
Brahim ER-RAHA
b-2 Réalisation des boucles
</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"?> <html>
<xsl:stylesheet version="1.0" xmlns:xsl= <body>
http://www.w3.org/1999/XSL/Transform> <table>
<xsl:template match="/classification_atomique"> <tr>
<html><body> <th>symbole</th>
<table border="1"> <th>numero</th>
<tr> </tr>
<th>symbole</th> <tr>
<th>numero</th> <td>hélium</td>
</tr>
<xsl:for-each select="atome"> <td>2</td>
<xsl:if test="type='gaz rare'"> </tr>
<tr> <tr>
<td> <td>néon</td>
<xsl:value-of select="nom"/> <td>10</td>
</td> </tr>
<td> <tr>
<xsl:value-of select="numero"/> <td>argon</td>
</td> <td>18</td>
</tr> </tr>
</xsl:if> </table>
</xsl:for-each> </body>
</table></body></html> </html>
</xsl:template>
</xsl:stylesheet>
Brahim ER-RAHA
Traitement conditionnel par xsl:choose
Brahim ER-RAHA
Fichier XSL Résultat HTML
<xsl:template match="/classification_atomique"> <html> <body> <table>
<html><body><table border="1">
<tr> <tr>
<th>type</th> <th>type</th>
<th>symbole</th> <th>symbole</th>
<th>numero</th> <th>numero</th>
</tr> </tr>
<xsl:for-each select="atome"> <tr>
<tr> <td> <td></td>
<xsl:choose> <td>hydrogène</t
<xsl:when test="contains(type,'métal')"> d> <td>1</td>
métal </xsl:when> </tr>
<xsl:when test="contains(type,'gaz')"> <tr>
gaz </xsl:when> <td>gaz</td>
<xsl:otherwise>Rien</xsl:otherwise> <td>hélium</td>
</xsl:choose> <td>2</td>
</td> </tr>
<td> <tr>
<xsl:value-of select="nom"/> <td>métal</td>
</td> <td>lithium</td>
<td>
<xsl:value-of select="numero"/> <td>3</td>
</td> </tr> </tr>
</xsl:for-each> </table></body></html> <tr>....
</xsl:template> </xsl:stylesheet>
Brahim ER-RAHA
Exemple
Brahim ER-RAHA
DTD
XML
Brahim ER-RAHA
XSL
HTML
Brahim ER-RAHA
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 :
@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 :
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
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:
Brahim ER-RAHA
Exemple
Brahim ER-RAHA
Exemple :Xsl:element :
Brahim ER-RAHA
Xsl:attribute
Fichier XSL Arbre généré
Fichier XML
<source> <xsl:stylesheet version = '1.0' <TABLE>
<color>blue</color> xmlns:xsl='http://www.w3.org/1999/ <TR>
<color>navy</color> XSL/Transform'> <TD style="color:blue">blue</TD>
<color>green</color> <xsl:template match="color"> </TR>
<TABLE> </TABLE>
<color>lime</color> <TR> <TABLE>
<color>red</color> <TD> <TR>
</source> <xsl:attribute name="style"> <TD style="color:navy">navy</TD>
<xsl:text>color:</xsl:text> </TR>
<xsl:value-of select="."/> </TABLE>
</xsl:attribute> <TABLE>
<xsl:value-of select="."/> <TR>
</TD> <TD style="color:green">green</TD>
</TR> </TR>
</TABLE> </TABLE>
</xsl:template></xsl:stylesheet> <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
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
Brahim ER-RAHA
Création des listes
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.
Brahim ER-RAHA
Exemple 1
Brahim ER-RAHA
Exemple 2:
<xsl:attribute-set name="att">
<xsl:attribute name="code" select="code"/>
<xsl:attribute name="nom" select="nom"/>
<xsl:attribute name="salaire" select="salaire"/>
</xsl:attribute-set>
</xsl:stylesheet>
Brahim ER-RAHA
Utilisation des variables
L'élément <xsl:variable> sert à créer les variables dans XSLT. Il possède les
attributs suivants :
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 :
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: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>
Brahim ER-RAHA
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/source">
<xsl:copy>
<xsl:attribute name="salaireMoyenne" select="format-
number(sum(employe/salaire) div count(employe), '0000.00 DH')"/>
<xsl:for-each select="//employe">
<xsl:sort order="descending" select="./nom"/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
Brahim ER-RAHA
<xsl:template match="employe">
<xsl:param name="code"/>
<xsl:param name="salaire"/>
</xsl:stylesheet>
Brahim ER-RAHA
Fichier XML Fichier XSL Arbre généré
<source> <xsl:variable name="var1" select="//AAA/CCC/text()"/> //AAA/CCC/DDD : D1
<AAA> <xsl:variable name="var2">//AAA/CCC/text()</xsl:variable //AAA/CCC/text() : C2C3
<BBB> >
<CCC>C1</CCC> <xsl:template match="/">
</BBB> <xsl:call-template name="function">
<CCC>C2</CCC> <xsl:with-param name="path1“
<CCC>C3</CCC> select="//AAA/CCC/DDD"/>
</AAA> <xsl:with-param name="path2">//AAA/CCC/DDD</
<AAA> xsl:with-param>
<CCC> </xsl:call-template>
<DDD>D1</DDD> </xsl:template>
<DDD>D2</DDD>
</CCC> <xsl:template name="function">
</AAA> <xsl:param name="path1"/>
</source> <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>
Brahim ER-RAHA
Document XML Document XSL Document Résultat
<source> <xsl:stylesheet version = '1.0' <html>
<AAA id="a1" xmlns:xsl='http://www.w3.org/1999/XSL/Transf <div
pos="start"> orm'> style="color:red">CCC
<BBB id="b1"/> <xsl:template match="/"> id=c1</div>
<BBB id="b2"/> <xsl:apply-templates select="//CCC" mode <div
</AAA> ="red"/> style="color:red">CCC
<AAA id="a2"> <xsl:apply-templates select="//CCC" mode id=c2</div>
<BBB id="b3"/> ="yellow"/> <div
<BBB id="b4"/> </xsl:template> style="color:red">CCC
<CCC id="c1"> <xsl:template match="CCC" mode="red"> id=c3</div>
<CCC id="c2"/> <div style="color:red"> </html>
</CCC> <xsl:value-of select="name()"/>
<BBB id="b5"> <xsl:text> id=</xsl:text>
<CCC id="c3"/> <xsl:value-of select="@id"/>
</BBB> </div>
</AAA> </xsl:template>
</source> <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>
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.
Brahim ER-RAHA
Document XML Document XSL (Doc2.xsl) Document Résultat
<source> <xsl:stylesheet version = '1.0' <h3
<AAA>red</AAA> xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> style="color:red">re
<BBB>blue</BBB> <xsl:import href="doc1.xsl"/> d</h3>
<CCC>purple</CCC> <xsl:template match="BBB"> <h2
</source> <h2 style="color:{.}"> style="color:blue">b
<xsl:value-of select="."/> lue</h2>
</h2> purple
</xsl:template></xsl:stylesheet>
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).
Brahim ER-RAHA
Exercice
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
3- Effectuer pour chaque planète un test sur l'élément satellite. S'il existe, afficher le
nombre de satellites. 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.
Brahim ER-RAHA
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
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:
- 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"
Brahim ER-RAHA
Cet élément contient aussi un autre élément fo:region-body possédant les attributs
suivant :
- region-before,
- region-after,
- region-strat,
- region-end
Brahim ER-RAHA
Exemple :
<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.
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 :
<fo:simple-page-master-reference master-name="aaa">
<fo:simple-page-master-reference master-name="bbb">
<fo:simple-page-master-reference master-name="ccc">
<fo:page-sequence-master master-name="nomsequence">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference page-position="first“ master-reference="aaa"/>
<fo:conditional-page-master-reference odd-or-even="odd“ master-reference="bbb"/>
<fo:conditional-page-master-reference odd-or-even=“even" master-reference="ccc"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
Brahim ER-RAHA
<fo:layout-master-set>
<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
Ces deux éléments ont un attribut obligatoire flow-name qui prendre l'une des
valeurs suivantes:
- xsl-region-after
- 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)
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 :
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 :
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 :
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:\Bureau\webshots.bmp)" width="20pt"
height="20pt"/>
</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 :
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 pour aller vers
le bloc avec id="B"
</fo:basic-link>
</fo:block>
<fo:block id="B">Block with id="B".
<fo:basic-link internal-destination="A"> Cliquer-ici pour aller vers
le bloc avec id= " A"
</fo:basic-link>
</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
Brahim ER-RAHA
Brahim ER-RAHA
La place de XQuery dans le monde XML
Brahim ER-RAHA
Comment interroger des documents XML?
Solutions :
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
DTD Exemple: bib.dtd
Brahim ER-RAHA
Brahim ER-RAHA
EXEMPLE 1 : ÉNONCÉ
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>
Brahim ER-RAHA
EXEMPLE 1 : RÉPONSE
Brahim ER-RAHA
Brahim ER-RAHA
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
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
OPÉRATIONS ARITHMÉTIQUES
exp1 + exp2
exp1 - exp2
exp1 * exp2
exp1 div exp2
Brahim ER-RAHA
Brahim ER-RAHA
Opérations sur les séquences
L’expression 1 + 5, 4 – 2, 7 * 3
a pour valeur la séquence
6, 2, 10
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
Brahim ER-RAHA
COMPARAISON DE VALEURS
COMPARAISON DE VALEURS ATOMIQUES
exp1 eq exp2
exp1 ne exp2
exp1 lt exp2
exp1 le exp2
exp1 gt exp2
exp1 ge exp2
Brahim ER-RAHA
COMPARAISON DE VALEURS ATOMIQUES
L’expression 5 gt 7
a la valeur false.
Brahim ER-RAHA
COMPARAISON DE VALEURS ATOMIQUES
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
Brahim ER-RAHA
COMPARAISONS GÉNÉRALES
exp1 = exp2
exp1 != exp2
exp1 < exp2
exp1 <= exp2
exp1 > exp2
exp1 >= exp2
L’expression
(1, 2) = (7, 2, 9, 12) a la valeur true
L’expression
5 > (2, 9, 3) a la valeur true
<auteur>Dupont</auteur><auteur>Durand</auteur>
alors l’expression
auteur = "Dupont"
a la valeur true
Brahim ER-RAHA
Comparaisons de noeuds
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 :
Brahim ER-RAHA
Comparaisons de noeuds
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>
Brahim ER-RAHA
Comparaisons par la position
Requête:
<livre>
{ document("bib.xml")//book[author[la="Abiteboul"] <<
author[la="Suciu"]]/@title }
</livre>
Résultat:
<livre title="Data on the Web"/>
Brahim ER-RAHA
Opérations sur les séquences de noeuds
Brahim ER-RAHA
L’expression doc("bib.xml")//(author | editor)
a pour valeur
Brahim ER-RAHA
Opérations sur les séquences de noeuds
Brahim ER-RAHA
CONCATÉNATION DE SÉQUENCES
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>
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Expressions de chemins
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>
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”)/(descendant::author,descendant::publisher) :
résultat ?
doc(“bib.xml”)//book[position() lt last()]
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Le nom et le contenu sont calculés:
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
Affectation de variables: for et let (FLWOR)
La clause for $var in exp affecte la variable $var successivement avec
chaque item dans la séquence 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>
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
SÉLECTION: WHERE
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"/>
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
TESTS: IF-THEN-ELSE
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>
Brahim ER-RAHA
Brahim ER-RAHA
Brahim ER-RAHA
QUANTIFICATION
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:
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>
Brahim ER-RAHA
JOINTURE
Utilisation de plusieurs Document XML
Fichier d’adresses:
Brahim ER-RAHA
JOINTURE: REQUÊTE
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}
}}
Brahim ER-RAHA
Résultat:
Brahim ER-RAHA
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;
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>
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
parcours libre de l'arbre gourmand en mémoire
DOM possibilité de modifier la structure et le doit traiter tout le document avant
contenu de l'arbre d'exploiter les résultats
peut gourmand en ressources mémoire
traite les données séquentiellement
rapide
un peu plus difficile à programmer, il est
SAX principes faciles à mettre en oeuvre
souvent nécessaire de sauvegarder des
permet de ne traiter que les données
informations pour les traiter
utiles
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.
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
Brahim ER-RAHA
XML: le traitement par programme
XML
Schema
(ou DTD)
DOM
XML XML
Parser
<ville>Paris</ville> <ville>Paris</ville>
<pays>France</pays> Manipulation
Bien formé <pays>France</pays>
<temp Valide <temp de l'arbre
echelle="C">18</temp> echelle="C">18</temp>
SAX
XSL <ville>Paris</ville>
Stylesheet
Mal formé/Invalide
événements – call back
XSLT XSLFO
<city>Paris</city>
<temp
degree="F">65</te
mp>
WML XML (X)HTML PDF RTF, Word
Brahim ER-RAHA
Brahim ER-RAHA
V-3-1 les objets de 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).
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.
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
Brahim ER-RAHA
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
Voir le projet Eclipse
XML-JDOM-DOM-SAX
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
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).
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
Brahim ER-RAHA
Parseur SAX DOM
Pour traiter la totalité d’un document XML au moment de
sa lecture, il faut utiliser un parseur SAX.
}
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.
<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 :
}
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>
</etudiant>
</prenoms>
<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");
} e.printStackTrace
catch (Exception e) {
();
}}
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" />
</meteo>
</mesure>
Application
4 - Créer une feuille de style XSL qui permet de transformer le
document XML meteo2.xml en document HTML suivant :
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»
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 peut être utilisé par des outils déjà disponibles (Feuilles de style : XSLT et
serveurs XML : ex : Biztalk…),
- 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 :
<database>
<table>
<row>
<column1>...</column1>
<column2>...</column2>
...
</row>
...
</table>
<table>
...
</table>
...
</database>
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)
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 :
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 :
<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>
En utilisant des attributs, l’élément « Personne » peut être présenté comme suit :
<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 :
<!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 :
Brahim ER-RAHA
Pour présenter cette relation plus complexe en XML, nous pouvons créer le
modèle de données suivant
Brahim ER-RAHA
2 EXTRACTION CONTROLÉE PAR UN MODÈLE XML
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
Exemple :
Supposons qu'on a la table "produits" suivante :
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>
Après avoir exécuter l'api ODBC2XML
<Produit id=" R2 ">
, on obtiendra comme résultat :
<Nom> Siripi314<Nom>
<Poids>300 <Poids>
</Produit>
<Produit id=" R3 ">
<Nom> Siripi433<Nom>
<Poids>433 <Poids>
</Produit>
...</Liste></Catalogue>
Brahim ER-RAHA
Considérons la requête suivante : Select * from produit, fournisseurs
Where fournisseurs.ville="Casa"
And
Fournisseurs.CodeFournisseur=Produit.Co
deFournisseur
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>
Brahim ER-RAHA