Steffenel Programmation des Applications Réparties – Master M1 1
Programmation des Applications Réparties
XQuery Transformations XSLT Formats de documents
Luiz Angelo Steffenel [email protected]
Steffenel Programmation des Applications Réparties – Master M1 2
XQuery
Steffenel Programmation des Applications Réparties – Master M1 3
Introduction
XQuery est le langage de requêtes pour XML défini et standardisé par le W3C
XQuery s’impose comme le langage de requêtes: - Pour les bases de données XML natives - Pour les documents XML textuels (XQuery Text) - Pour l’intégration de données (bases de données virtuelles)
Le besoin d’interroger les bases relationnelles en XQuery existe
- Pour l’intégration et la publication de données - Compétition avec les extensions de SQL (SQL/XML)
Steffenel Programmation des Applications Réparties – Master M1 4
Objectifs
Types XML Schema XPath 2
Puissance de SQL
Structure d'arbres
Recherche d'information
Langage fonctionnel
Steffenel Programmation des Applications Réparties – Master M1 5
La base
Proposé par IBM , MS, AT&T, Data Direct, ... Langage fonctionnel type CAML Forme de requête élémentaire (FLWOR)
- FOR $<var> in <forest> [, $<var> in <forest>]+ //itération - LET $<var> := <subtree> // assignation - WHERE <condition> // élagage - ORDER BY <element> // ordre (optionnel) - RETURN <result> // construction
Les forêts sont sélectionnées par des Xpath (document ou collection)
Le résultat est une forêt (un ou plusieurs arbres)
Steffenel Programmation des Applications Réparties – Master M1 6
Exemple de documents
<Guide Version= "2.0">
<Restaurant type="francais" categorie="***"> <Nom>Le Moulin</Nom> <Adresse> <Rue>des Vignes</Rue> <Ville>Mougins</Ville> </Adresse>
<Manager>Dupuis</Manager> </Restaurant>
<Restaurant type="francais" categorie ="**">
<Nom>La Licorne</Nom> <Adresse><Rue>Des Moines</Rue> <Ville>Paris</Ville>
</Adresse> <Téléphone>0148253278</Téléphone> <Manager>Dupuis</Manager>
</Restaurant>
<Bar type = "anglais"> <Nom>Rose and Crown</Nom> </Bar>
</Guide>
Steffenel Programmation des Applications Réparties – Master M1 7
Exemple 1 : XPath
Noms de tous les restaurants :
- doc(“Restaurants.xml”)/Guide/Restaurant/Nom/text()
- doc(“Restaurants.xml”)/Guide/Restaurant/Nom
Steffenel Programmation des Applications Réparties – Master M1 8
Exemple 2 et 3 : XPath +
Expression régulière - Menu de tous les restaurants - doc(“Restaurants.xml”)//Menu
Accès via indice à attribut - Donnez le nom des menus du premier restaurant - doc(“Restaurants.xml”)/Guide/Restaurant[1]/Menu/@Nom
Steffenel Programmation des Applications Réparties – Master M1 9
Exemple 4 : Sélection
Lister le nom des restaurants de Cabourg: doc(“Restaurants.xml”)/Guide/Restaurant[Adresse/
Ville= “Cabourg"] /Nom
• Cette syntaxe devient assez compliquée • L'équivalent en format FLWOR
for $R in collection("Restaurants")/Restaurant where $R/Adresse/Ville = “Cabourg” return {$R/Nom}
Steffenel Programmation des Applications Réparties – Master M1 10
Exemple 5 : Jointure
Lister le nom des Restaurants avec téléphone dans la rue de l'Hôtel Lutecia:
For $R in collection("Restaurants")/Restaurant, $H in collection("Hotels")/Hotel
where $H//Rue = $R//Rue and $H//Nom = "Le Lutecia" return
<Result> {$R/Nom} {$R/Téléphone} </Result>
Steffenel Programmation des Applications Réparties – Master M1 11
Exemple 6 : Restructuration d'arbre
Construire une liste de restaurants par Ville
for $c in distinct(collection(“Restaurants”)/Restaurant//Ville) return <Ville>{$c}</Ville> <Restaurants> { for $r in collection(“Restaurants”)/Restaurant where $r//Ville = $c return {$r} } <Restaurants>
Steffenel Programmation des Applications Réparties – Master M1 12
Exemple 7 : Imbrication en Where
Adresses des hotels dans des villes ayant des restaurants trois étoiles
for $h in collection(“Hotels”)/Hotel where $h/Adresse/Ville in for $r in collection(“Restaurants”)/Restaurant where $s/@categorie = "***" return {$r/Adresse/Ville/text()} return {$h/Adresse}
Steffenel Programmation des Applications Réparties – Master M1 13
Exemple 8 : Agrégat simple
Combien de restaurants y-a-t-il en collection ?
let $R := collection(“Restaurants”)/Restaurant return
<NombreRestaurant > {count ($R)} </NombreRestaurant>
Steffenel Programmation des Applications Réparties – Master M1 14
Exemple 9 : Agrégat partitionné
Lister le nom de chaque restaurant avec le prix moyens des menus proposés
for $r in collection(“Restaurants”)//Restaurant let $a := collection(“Restaurants”)// [Restaurant = $r]//Menu/@Prix return <resultat> {$r/Nom} <avgPrix>{AVG($a)}</avgPrix> </resultat>
Steffenel Programmation des Applications Réparties – Master M1 15
Exemple 10 : recherche textuelle
Lister les bons restaurants de Paris
for $r in collection(“Restaurants”)//Restaurant where (contains ($r/Comments, “Bon”) or contains ($r/Comments, “Excellent”)) and $r/Adresse/Ville = “Paris” return {$r/Nom}
Steffenel Programmation des Applications Réparties – Master M1 16
Exemple 11 : Ordre et désordre
Lister les bons restaurants de Paris par ordre alphabétique
for $r in unordered(collection(“Restaurants”)//Restaurant) where (contains($r/Comments, "Excellent”) or contains($r/Comments, "Good”)) and $r/Adresse/Ville = “Paris” return {$r/Nom} orderby ($r/Nom descending)
Steffenel Programmation des Applications Réparties – Master M1 17
Exemple 12 : Substring
Trouver les livres dans lequel le nom d'un élément se termine par "or" et le même élément contient la chaîne "Suciu" quelque part. Pour chaque tel livre, retourner le titre et l'élément qualifiant.
for $b in document("document")//book let $e := $b/*[contains(string(.), "Suciu") and ends-with(local-name(.), "or")] where exists($e) return <book> { $b/title } { $e } </book>
Steffenel Programmation des Applications Réparties – Master M1 18
Exemple 13 : if-then-else
• Il est possible d'inscrire expressions conditionnelles dans des clauses Xquery
• De même, les comparaisons =, !=, <, <=, >, >= , etc.
for $x in doc("books.xml")/bookstore/book return if ($x/@category="CHILDREN") then <child>{data($x/title)}</child> else <adult>{data($x/title)}</adult>"
Steffenel Programmation des Applications Réparties – Master M1 19
Fonctionnalités XQuery Text
Recherche sur mot-clés Recherche de phrase Support des mots de
laiaison Recherche sur préfix, suffix,
infix Normalisation des mots,
accents, capitales, …
Recherche par proximité (unité = mots)
Spécification de l'ordre des mots
Combinaison logic avec AND, OR , NOT
Recherche par similarité Tri des résultats par
pertinence
Steffenel Programmation des Applications Réparties – Master M1 20
Bilan XQuery
Véritable langage de programmation Très puissant
- Sélection - Jointure - Imbrication - Restructuration - Agrégation - Tri - Plein texte - …
Sur des forêts dont les arbres sont des documents Nécessite un « moteur » XQuery
- Un browser ne suffit pas :( - Php5 n'a pas un moteur natif pour Xquery
Steffenel Programmation des Applications Réparties – Master M1 21
Programmation des Applications Réparties
Transformations XSLT
Steffenel Programmation des Applications Réparties – Master M1 22
XSLT
Objectif: transformer un document XML en - un ou plusieurs documents XML, HTML, WML, SMIL - un document papier: PDF (XSL-FO), LaTeX - un texte simple (ASCII ,sans format)
Steffenel Programmation des Applications Réparties – Master M1 23
Le Mécanisme
Un document est un arbre
Le processeur XSL parcourt l'arbre et applique les règles de transformations vérifiées (à condition vraie) aux nœuds sélectionnés
Un document est produit en sortie
XSL Processo
r
XML Document
Format ( Postcript)
Format (XML)
application e.Commer
ce
format (WML)
Browser
(XHTML, DHTML, HTML)
Format (XML) pour
Word, Excel
XSL Stylesheet
Steffenel Programmation des Applications Réparties – Master M1 24
Où appliquer XSLT ?
Fichier
Base de données
Affichage
• Affichage • Traitement
S E R V E U R
XML
XML
Programme
XML ASP PHP
JSP
Processeur XSL Affichage
HTML
HTML
XML
Processeur XSL
Steffenel Programmation des Applications Réparties – Master M1 25
Programme XSLT
Un programme XSLT consiste à produire un document résultat à partir d’un document source
Un programme XSLT est un document XML
Les éléments XSLT sont différenciés grâce à un espace de noms xsl: <?xml version="1.0"encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="COURS"> <html> <head><title>Fiche du cours</title></head> <body bgcolor="white"> <p> <h1><i><xsl:value-of select="SUJET"/></i></h1> <hr/> <xsl:apply-templates/> </body> </html> </xsl:template> </xsl:stylesheet>
Steffenel Programmation des Applications Réparties – Master M1 26
Fonctions d'un programme XSLT
Transformation d’arbres XML: - extraction de données - génération de texte - suppression de contenu (nœuds) - déplacer le contenu (nœuds) - dupliquer le contenu (nœuds) - trier
Steffenel Programmation des Applications Réparties – Master M1 27
Les Feuilles de Style
Une feuille de style XSL - est un document XML de racine <xsl:stylesheet>"- contient une liste de règles de transformation
<xsl:template>"
Chaque règle (<xsl:template>) précise: - Une condition spécifiant le sous-arbre du document
d’entrée auquel elle s’applique (match=) - Une production spécifiant le résultat de l’application de la
règle (contenu)
Steffenel Programmation des Applications Réparties – Master M1 28
Les Règles de Production
Définition des règles par <xsl:template …>" Attributs
- match: condition de sélection des nœuds sur lesquels la règle s'applique (XPath)
- name: nom de la règle, pour invocation explicite (en conjonction avec <call-template>)
- mode: permet d'appliquer à un même élément des règles différentes en fonction du contexte
- priority: priorité, utilisé en cas de conflit entre deux règles ayant la même condition
Exemples <xsl: template match="/">"<xsl: template match="auteur" name="R1" priority="1">"
Steffenel Programmation des Applications Réparties – Master M1 29
Exemple
Steffenel Programmation des Applications Réparties – Master M1 30
Fonctionnalités de XSLT
Extraction de données (xsl:value-of)
<xsl:template match="FILM"> <xsl:value-of select="TITRE"/> </xsl:template>
Génération de texte (texte brut)
<xsl:template match="FILM"> Ceci est le texte produit par application de cette règle. </xsl:template>
Génération d’un arbre XML (fragment XML bien formé)
<xsl:template match="FILM"> <body> <p>Un paragraphe</p> </body> </xsl:template>
Steffenel Programmation des Applications Réparties – Master M1 31
Fonctionnalités XSLT (2)
Génération d’arbre avec extraction de valeur
<xsl:template match="FILM"> <body> <p>Titre: <xsl:value-of select="TITRE"/> </p> </body> </xsl:template>
Steffenel Programmation des Applications Réparties – Master M1 32
Les Règles
C’est la structure de base
Règle = template : élément de base pour produire le résultat - une règle s’applique dans le contexte d’un nœud de l’arbre - l’application de la règle produit un fragment du résultat
Programme XSLT = ensemble de règles pour construire un résultat
Dans une règle, on peut: - accéder aux fils, aux descendants, au parent, aux frères, aux
neveux, aux attributs,... du noeud à transformer (grâce à XPath) - effectuer des tests et des boucles,… - “appeler” d’autres règles
Steffenel Programmation des Applications Réparties – Master M1 33
Exemple
Steffenel Programmation des Applications Réparties – Master M1 34
Exemple (2)
Steffenel Programmation des Applications Réparties – Master M1 35
Exemple (3)
Boucle : traduction de l’élément XML <SALLES> en élément HTML <ol><li/></ol>
<xsl:template match="SALLE"> <h2>Salle No <xsl:value-of select="@NO"/></h2> Film:<xsl:value-of select="FILM/TITRE"/> de <xsl:value-of select="FILM/AUTEUR"/> <ol> <xsl:for-each select="SEANCES/SEANCE"> <li><xsl:value-of select="."/></li> </xsl:for-each> </ol> </xsl:template>
Remarque: c’est un fragment HTML, à intégrer dans un document complet
Steffenel Programmation des Applications Réparties – Master M1 36
Appel des Règles
En général, on produit un résultat en combinant plusieurs règles:
- la règle initiale s’applique à la racine du document traité (’/’) - on produit alors le cadre du document HTML - on appelle d’autres règles pour compléter la création du résultat
Exemple <xsl:template match="/"> <html> <head><title>Programme de <xsl:value-of select="CINEMA/NOM"/></title></head> <body bgcolor="white"> <xsl:apply-templates select="CINEMA"/> </body> </html> </xsl:template>
Steffenel Programmation des Applications Réparties – Master M1 37
Règle CINEMA
Exploitation de l’élément CINEMA, puis appel à la règle SALLE <xsl:template match="CINEMA">
<h1><i><xsl:value-of select="NOM"/></i></h1><hr/> <xsl:value-of select="ADRESSE"/>, <i>Métro:</i> <xsl:value-of select="METRO"/> <hr/> <xsl:apply-templates select="SALLE"/> </xsl:template>
<xsl:template match="SALLE"> <h2>Salle No <xsl:value-of select="@NO"/></h2> Film:<xsl:value-of select="FILM/TITRE"/> de <xsl:value-of select="FILM/AUTEUR"/> <ol> <xsl:for-each select="SEANCES/SEANCE"> <li><xsl:value-of select="."/></li> </xsl:for-each> </ol> </xsl:template>
Steffenel Programmation des Applications Réparties – Master M1 38
Vue de l'Ensemble
Steffenel Programmation des Applications Réparties – Master M1 39
Sélection des Règles
Un motif de sélection est une expression XPath restreinte - les fils d’un élément (axe child) - les attributs d’un élément (axe attribute) - la simplification // (axe /descendant-or-self::node()/)
Cette restriction garantit que l’on peut savoir si une règle doit être déclenchée pour un nœud N uniquement en analysant les ancêtres de N
Cela diminue considérablement la complexité de l’algorithme de sélection
Steffenel Programmation des Applications Réparties – Master M1 40
Sélection des Règles (2)
Exemples - /COURS/ENSEIGNANTS: la règle s’applique à tous les nœuds
ENSEIGNANTS fils d’un élément racine COURS - //SEANCE[@ID=2]: … à tous les nœuds de type SEANCE ayant
un attribut ID valant 2 - /descendant::FILM[1]: … au premier élément de type FILM dans le
document - FILM[1]: … aux premiers fils de type FILM (il peut y en avoir
plusieurs!) - /COURS[@CODE="TC234"]: … aux cours avec le code TC234
Steffenel Programmation des Applications Réparties – Master M1 41
Règles par Défaut
Lorsque aucune règle n’est sélectionnée, le moteur XSLT applique des règles par défaut
La première règle pour les éléments et la racine du document <xsl:template match=”*|/”> <xsl:apply-templates/> </xsl:template>
- on demande l’application de règles pour les fils du nœud courant La deuxième règle insère dans le document résultat la valeur du nœud ou
de l’attribut <xsl:template match=”text()|@*”> <xsl:value-of select=”.”/> </xsl:template>
- cela suppose (en particulier pour les attributs) d’avoir utilisé un xsl:apply-templates qui ait sélectionné ces nœuds
La troisième règle concerne les processing-instructions et les commentaires
Steffenel Programmation des Applications Réparties – Master M1 42
Conséquences
Si on se contente des règles par défaut, on obtient la concaténation de nœuds de type Text
Programme minimal: <?xmlversion="1.0"encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
Steffenel Programmation des Applications Réparties – Master M1 43
xsl:apply-templates
C’est une instruction qui possède 3 attributs - select - mode - priority
select doit sélectionner un ensemble de nœuds - ces nœuds constituent le contexte d’utilisation - pour chaque nœud, on va rechercher la règle à instancier
mode permet de choisir explicitement une des règles à instancier parmi celles qui sont candidates
priority permet de définir une priorité pour le processeur puisse choisir
Steffenel Programmation des Applications Réparties – Master M1 44
Priorités Implicites
Idée: plus c’est «spécifique», plus c’est prioritaire - Priorité 0: les motifs constitués d’une seule étape XPath, avec un
nom d’élément ou d’attribut et sans prédicat - Priorité -0.5: les filtres autres qu’un nom d’élément ou d’attribut ont
une priorité égale à -0,5 (node(),*) - Tous les autres ont une priorité de 0.5 (prédicats, plusieurs
étapes)
Steffenel Programmation des Applications Réparties – Master M1 45
Programme XSLT
Ce programme permet d’effacer les nœuds de type RESUME
<!-- on ne recopie pas les nœuds RESUME dans le document résultat --> <xsl:template match="RESUME"/> <!-- on recopie les autres nœuds --> <xsl:template match="@*|node()" priority="-1"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template>
Steffenel Programmation des Applications Réparties – Master M1 46
Les Modes
Objectif
- un même nœud peut être traité plusieurs fois
- exemple
on parcourt tous les chapitres et paragraphes pour produire une table des matières
on les parcourt à nouveau pour publier le contenu Il faut donc des règles différentes qui s’appliquent aux mêmes nœuds: c’est le
mode qui va permettre la distinction
- exemple: création de liens HTML
- on peut créer des ancres «internes» à un document <a name=’Alien’/>
- on peut ensuite créer un lien vers cette ancre <a href=’#Alien’>Lien vers le film Alien</A>
- objectif: une règle pour créer les liens, une autre pour créer les ancres
Steffenel Programmation des Applications Réparties – Master M1 47
Règles avec Mode
<xsl:template match="FILM" mode="Ancres">
<a href="#{TITRE}"> <xsl:value-of select="TITRE"/> </a>
</xsl:template>
<xsl:template match="FILM">
<a name="{TITRE}"/>
<h1><xsl:value-of select="TITRE"/></h1>
<b><xsl:value-of select="TITRE"/>,</b>
<xsl:value-of select="GENRE"/> <br/>
<b>Réalisateur</b>: <xsl:value-of select="MES"/>
</xsl:template>
Steffenel Programmation des Applications Réparties – Master M1 48
L'appel des Règles
<xsl:template match="FILMS">
<html>
<head><title>Liste des films</title></head>
<body bgcolor="white">
<xsl:apply-templates select="FILM" mode="Ancres"/>
<xsl:apply-templates select="FILM"/>
</body>
</html>
</xsl:template>
Steffenel Programmation des Applications Réparties – Master M1 49
Synthèse : sélection d'une règle
Soit un xsl:apply-templates, et N un des nœuds sélectionné
On ne prend que les règles avec le même mode que xsl:apply-templates
On teste le motif XPath pour savoir si le nœud satisfait la règle
On prend celle qui a la plus grande priorité
Steffenel Programmation des Applications Réparties – Master M1 50
Éléments de Programmation
Traitement conditionnel: xsl:if Syntaxe <xsl:if test = "boolean-expression">
<!-- contenu -->
</xsl:if>
Permet de changer l’output en fonction d’un test
Attention: il n’existe pas de "else" (utilisez "choose" à la place)
Cas d’utilisation: traitement d’un élément en fonction de sa position, des ses attributs,…
Steffenel Programmation des Applications Réparties – Master M1 51
Éléments de Programmation (2)
Traitement conditionnel: xsl:choose <xsl:choose> <!-- Content: (xsl:when+, xsl:otherwise?) --> </xsl:choose> <xsl:when test = boolean-expression> <!-- contenu --> </xsl:when> <xsl:otherwise> <!-- contenu --> </xsl:otherwise>
Cette définition dit:
- on peut avoir plusieurs clauses avec un test (xsl:when). - la première vraie est utilisée (donc la série des xsl:when correspond à "if
( ) {...}" elseif ( ) { ...}" elseif ( ) { ...}")
- si aucune clause n’est vraie et s’il existe une clause xsl:otherwise, c’est cette dernière qui est exécutée (il s’agit donc du "else {...}")
Steffenel Programmation des Applications Réparties – Master M1 52
Éléments de Programmation (3)
Itération: xsl:for-each
Syntaxe <xsl:for-each select="motif-XPath"> "
<!-- contenu --> "
</xsl:for-each> "
Permet de parcourir un ensemble de nœuds et d’appliquer un traitement
Steffenel Programmation des Applications Réparties – Master M1 53
Éléments de Programmation (4)
Tri: xsl:sort Syntaxe <xsl:sort
select="motif-XPath" <!-- par défaut, . -->
data-type="text|number" <!-- par défaut, text -->
order="ascending|descending" <!-- par défaut, asc -->
case-order="upper-first|lower-first" <!-- par défaut, upper -->
lang="nom_de_langue" <!-- par défaut, langue système -->
/>
Associé à un parcours (xsl:for-each ou xsl:apply-templates)
Permet de modifier l’ordre des nœuds
Steffenel Programmation des Applications Réparties – Master M1 54
Éléments avancés de programmation
• Variables • Parfois une seule requête Xpath ne suffit pas • Les variables permettent de stocker des valeurs et les réutiliser
après <stylesheet version='1.0' xmlns='...'> " <template match="/factures">" <variable name='nom' select='clientID'/>" <for-each select='facture'>" <value-of select='//client[@id=$nom]/nom' /> : <value-of select='.' />"
</for-each>" </template>"</stylesheet>"
Steffenel Programmation des Applications Réparties – Master M1 55
Éléments avancés de programmation
• Passage de paramètres • Possibilité de passer des paramètres lors d'un appel de template <template match='...'> <param name='nom'>valeur défaut</param> …"
</template>"<apply-templates select='...'> <with-param name='nom'>une valeur </with-param>"
</apply-template>
• Valeur de nom accessible avec $nom
Steffenel Programmation des Applications Réparties – Master M1 56
Exemple – doc.xml
doc.xml :"
<trains> <liste> <gare id='g'>Grenoble</gare> <gare id='l'>Lyon</gare> <gare id='c'>Chambéry</gare> </liste> <trajet> <horaire gare='g' t='10:01'/> <horaire gare='l' t='10:22'/> <horaire gare='c' t='11:07'/> </trajet> <trajet> <horaire gare='g' t='15:10'/> <horaire gare='l' t='16:22'/> <horaire gare='c' t='16:49'/> </trajet>"
</trains>"
Steffenel Programmation des Applications Réparties – Master M1 57
Exemple - avant
<stylesheet version='1.0' xmlns='http://www.w3.org/1999/XSL/Transform'> <template match="/"> <for-each select='//liste/gare'> <variable name='x' select='@id' /> <value-of select='.'/> : <for-each select='//trajet'> <value-of select='horaire[@gare=$x]/@t' /> <text> </text> </for-each> <text> </text> </for-each> </template> "</stylesheet>"
Réponse :
Grenoble : 10:01 15:10 Lyon : 10:22 16:22 Chambéry : 11:07 16:49
Problème : trop de "for-each"s, peu modulaire
Steffenel Programmation des Applications Réparties – Master M1 58
Exemple - après
<stylesheet version='1.0' xmlns='http://www.w3.org/1999/XSL/Transform'> <template match="liste/gare"> <value-of select='.'/> : <apply-templates select='//trajet' mode='h'> <with-param name='x'> <value-of select='@id' /> </with-param> </apply-templates> </template>
<template match='trajet' mode='h'> <param name="x">g</param> <value-of select='horaire[@gare=$x]/@t'/> <text> </text> </template>"</stylesheet>"
Réponse :
Grenoble : 10:01 15:10 Lyon : 10:22 16:22 Chambéry : 11:07 16:49
Steffenel Programmation des Applications Réparties – Master M1 59
XSL-FO
Steffenel Programmation des Applications Réparties – Master M1 60
XSL-FO
• Recommandation du W3C depuis 2001
• Format XML pour décrire un document imprimé : • Taille du papier, • Marges, • Orientation, • ...
• Espace de noms : http://www.w3.org/1999/XSL/Format
Steffenel Programmation des Applications Réparties – Master M1 61
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
Steffenel Programmation des Applications Réparties – Master M1 62
Principes
Peut s'appliquer aux résultats des feuilles XSLT
Steffenel Programmation des Applications Réparties – Master M1 63
Fonctionnalités
Pages portrait ou paysage Pages recto-verso Page de tailles variées Marges multiples Colonnes multiples Entête et pieds de page Caractères unicode Formatage multi-langages Tables des matières
générées
Multiple directions d'écritures
Numérotation des pages Graphiques et SVG Tables, avec entêtes,
lignes et colonnes fusionnables
Listes Zones flottantes Tris à l'édition Notes de bas de pages
Steffenel Programmation des Applications Réparties – Master M1 64
Organisation du document
Un document FO est formé d'un élément fo:root qui comprend deux parties distinctes
- une description des modèles de pages fo:layout-master-set"
- une description du contenu fo:page-sequence"
Le contenu comporte : - Des flux contenant les données mêmes du document - Des éléments statiques dont le contenu se répète sur les pages
(en-têtes courants, no de page, etc.)
Steffenel Programmation des Applications Réparties – Master M1 65
Format
<root> <layout-master-set> <simple-page-master master-name=”couverture” …> <!-- page unique : description de la couverture --> </simple-page-master> <page-master-sequence master-name=”contenu” ...> <!-- description physique des pages internes --> </page-master-sequence> </layout-master-set> <page-sequence master-reference=”couverture”> <!-- Texte de la couverture --> </page-sequence> <page-sequence master-reference=”contenu”> <!-- Texte du livre --> </page-sequence> </root>"
Steffenel Programmation des Applications Réparties – Master M1 66
Objets de formatage
Les objets de formatage sont multiples : - <fo:block> ""
utilisé pour les blocs de textes, paragraphes, titres… - <fo:display-rule> ""
ligne de séparation - <fo:external-graphic> "
zone rectangulaire contenant un graphisme (SVG) Ils possèdent de nombreuses propriétés
- Pour un block on peut définir la marge gauche et droite l’espace avant et après le paragraphe la couleur du texte ………...
Steffenel Programmation des Applications Réparties – Master M1 67
XSL-FO: Hello World
<?xml version="1.0" encoding="iso-8859-1"?> <fo:root xmlns:fo="http://www.w3.org/1999/
XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-
name="contenu"> <fo:region-body margin="2 cm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-
reference="contenu"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello, world!</fo:block> </fo:flow> </fo:page-sequence> </fo:root>
Element Root - Permet de définir le namespace XSL-FO
Layout master set - Permet de déclarer une ou plusieurs page
masters (masque) et page sequence masters pour définir la structure des pages (ici une de 2 cm de marges)
Page sequence - Les pages sont groupées en séquences et
structurées selon la référence au masque. Flow
- C'est le container du texte utilisateur dans le document. Le nom du flot lit le texte à une zone de la page définie dans le masque.
Block - C'est le bloc de formatage qui inclut un
paragraphe de texte pouvant être produit pas XSLT.
Steffenel Programmation des Applications Réparties – Master M1 68
XSL-FO: Encore plus de détails
<?xml version="1.0" encoding="iso-8859-1"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name=”contenu” page-height=”11cm” page-width=”8cm”
margin-top=”1cm” margin-bottom=”1cm” margin-left=”1cm” margin-right=”1cm”> <region-body region-name=”contenu-region” />
</fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference=”contenu”> <fo:flow flow-name=”contenu-region”> <fo:block font-family=”Helvetica” font-size=”20pt” font-weight=”bold”text-align=”center”> Un titre
</fo:block> <fo:block font-family=”NewRoman” font-size=”12pt”font-weight=”normal” text-align=”left”> Hello World! </fo:block> </fo:flow> </fo:page-sequence> </fo:root>
Steffenel Programmation des Applications Réparties – Master M1 69
Les processeurs XSL-FO
Apache Group : FOP - Formating Object Processor - Génère du PDF http://www.apache.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
Steffenel Programmation des Applications Réparties – Master M1 70
Bilan XSL-FO
XSL-FO est particulièrement verbeux. la structure du document est suffisamment simple pour
pouvoir écrire un canevas et s'en servir pour formater du texte.
Spécialement utile dans le cas de transformations automatiques par exemple en partant de DocBook.
Son usage principal est la production de PDF au niveau des serveurs de contenu Lien "pdf" dans certains CMS
Steffenel Programmation des Applications Réparties – Master M1 71
Formats de documents XML
Steffenel Programmation des Applications Réparties – Master M1 72
Formats de documents texte
• XHTML est spécialisé pour l'affichage pour le web.
• D'autres formats existent :
• Polyvalent : Docbook
• Orientés impression papier : • XSL-FO • Suites bureautiques :
• ODF : OpenOffice • OOXML : Microsoft Office
Steffenel Programmation des Applications Réparties – Master M1 73
Docbook
• Origine : format pour de la documentation technique
• Défini comme standard par OASIS (Organization for the Advancement of Structured Information Standard) • Aujourd'hui son utilisation se généralise
• Documentation du format sur le site http://www.docbook.org
Steffenel Programmation des Applications Réparties – Master M1 74
Document Docbook
<!DOCTYPE xxx PUBLIC “-//OASIS//DTD DocBook XML V4.5//EN” “http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd”>
• Livres, avec la racine <book> ... </book> • Découpé en chapitres • Page de titre • Préface
• Articles, avec la racine <article> .. </article> • En un seul tenant • Pas de sauts de page • Pas de chapitres
Steffenel Programmation des Applications Réparties – Master M1 75
Exemple
<?xml version="1.0" encoding="utf-8"?> <article> <articleinfo> <title>Espaces de noms</title> <author> <firstname>Benoît</firstname> <surname>Valiron</surname> </author> </articleinfo> <sect1> <title>Déclaration d'un espace de noms</title> <sect2> <title>Un titre de sous-section</title> <para>Texte de <emphasis>l'exercice 1</emphasis>.</para> </sect2> </sect1> </article>"
Steffenel Programmation des Applications Réparties – Master M1 76
Principaux éléments pour un article
• Cinq niveaux hiérarchique • <sect1> à <sect5>"
• Paragraphes encadrés par <para> ... </para>"• Listes
• Ordonnées : <orderedlist> "• Non-ordonnées : <itemizedlist> "• Items des listes : <listitem>"
• Citations : <blockquote>"• Morceau de code (DTD, XML, programme...) :
• <programlisting>"• Dans le texte :
• Emphase : <emphasis> "• Liens hypertextes : <ulink> "• Code : <code>"
Steffenel Programmation des Applications Réparties – Master M1 77
Extensions
• Docbook vient avec de nombreuses possibilités: • Table des matières • Index • Format pour de la bibliographie
• Le format est modulaire : • nul besoin de tout connaitre pour produire un document
Steffenel Programmation des Applications Réparties – Master M1 78
Conversion
Steffenel Programmation des Applications Réparties – Master M1 79
ODF et OpenDocument
• Un fichier OpenOffice est un ensemble de documents XML compressés dans un zip
Steffenel Programmation des Applications Réparties – Master M1 80
Dedans
• Du XML !
• En particulier : • content.xml → le contenu du document • styles.xml → la description des styles utilisés • meta.xml → méta-données : titre, auteur, ... • settings.xml → les réglages de la dernière sauvegarde (niveau de
zoom, position du curseur...)
Steffenel Programmation des Applications Réparties – Master M1 81
Content.xml
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" ...>"
<office:scripts> <!-- Scripts définis --> </office:scripts> <office:font-face-decls> <style:font-face ...> <!-- Polices utilisées --> </office:font-face-decls> <office:automatic-styles> <style:style ...> <!-- Styles internes --> </office:automatic-style> <office:body> <!-- Corps du document --> </office:body>"
Steffenel Programmation des Applications Réparties – Master M1 82
Commentaire
• Le format ODF d'OpenOffice est plutôt orienté machine • même si il reste lisible, suivant la philosophie XML qui demande
des noms de balises explicites
• À la différence de Docbook, ODF est plus concerné par la mise en page que par la structure logique du texte
• Le formatage est strictement séparé dans des styles
Steffenel Programmation des Applications Réparties – Master M1 83
OOXML – Microsoft Office
• Vrai nom : ECMA-376 : Office Open XML file format.
• Après de nombreuses péripéties, c'est devenu un standard ISO. • Son spécification compte plus de 6000 pages
• Descendant des formats propriétaires : .xls, .doc, .ppt
• Néanmoins, le corps du document est en XML
Steffenel Programmation des Applications Réparties – Master M1 84
Un fichier docx
• Décompressé : • [Content_Types].xml → décrit le contenu de l'archive • _rels → dossier contenant des fichiers XML décrivant les relations
entre les composantes de l'archive. • DocProps → dossier avec les propriètés
• De l'application : app.xml • Du document : core.xml • Définies par l'utilisateur : custom.xml
• Un répertoire pour le type du document (ex : word) contenant document.xml
Steffenel Programmation des Applications Réparties – Master M1 85
Exemple de document.xml
• Un paragraphe contenant les mots “gras” et “italique” en gras et en italique : <w:p>
<w:r> <w:rPr><w:b/></w:rPr> <w:t>gras</w:t> </w:r> <w:r> <w:rPr><w:i/></w:rPr> <w:t>italique</w:t> </w:r>
</w:p>
Steffenel Programmation des Applications Réparties – Master M1 86
Commentaires
• Comme pour ODF, on a un format orienté machine.
• À la différence d'ODF, les styles sont inclus dans le contenu
• OOXML est particulièrement peu lisible, avec des balises et des espaces de noms peu explicites, ce qui ne l'empêche pas d'être verbeux.
• OOXML porte le lourd héritage du format binaire