Programmation des Applications Réparties. XQuery Transformations XSLT Formats de documents

Dimension: px
Commencer à balayer dès la page:

Download "Programmation des Applications Réparties. XQuery Transformations XSLT Formats de documents"

Transcription

1 Programmation des Applications Réparties XQuery Transformations XSLT Formats de documents Luiz Angelo Steffenel Steffenel Programmation des Applications Réparties Master M1 1

2 XQuery Steffenel Programmation des Applications Réparties Master M1 2

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 3

4 Objectifs Puissance de SQL Recherche d'information Types XML Schema XPath 2 Structure d'arbres Langage fonctionnel Steffenel Programmation des Applications Réparties Master M1 4

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 5

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> </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 6

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 7

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 8

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 9

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 10

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 11

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 12

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 13

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 14

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 15

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 16

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 17

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 18

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 19

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 20

21 Programmation des Applications Réparties Transformations XSLT Steffenel Programmation des Applications Réparties Master M1 21

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 22

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 XML Document XSL Processo r Browser (XHTML, DHTML, HTML) Format ( Postcript) XSL Stylesheet Format (XML) pour Word, Excel Format (XML) application e.commer ce Steffenel Programmation des Applications Réparties Master M1 23 format (WML)

24 Où appliquer XSLT? Programme Fichier XML XML S E R V E U R ASP PH P JSP HTML Processeur XSL Affichage HTML Affichage XML XML Base de données Processeur XSL Affichage Traitement Steffenel Programmation des Applications Réparties Master M1 24

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 "?> <xsl:stylesheet version="1.0" xmlns: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 25

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 26

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 27

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 28

29 Exemple Steffenel Programmation des Applications Réparties Master M1 29

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 30

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 31

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 32

33 Exemple Steffenel Programmation des Applications Réparties Master M1 33

34 Exemple (2) Steffenel Programmation des Applications Réparties Master M1 34

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 35

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 36

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 37

38 Vue de l'ensemble Steffenel Programmation des Applications Réparties Master M1 38

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 39

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 40

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= > <xsl:value-of select=. /> </xsl:template> - cela suppose (en particulier pour les attributs) d avoir utilisé un xsl:applytemplates 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 41

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 "?> <xsl:stylesheet version="1.0" xmlns:xsl=" </xsl:stylesheet> Steffenel Programmation des Applications Réparties Master M1 42

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 43

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 44

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 45

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 46

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 47

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 48

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 49

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 50

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 51

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 52

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 53

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 /> : <value-of select='.' />" </for-each>" </template>" </stylesheet>" Steffenel Programmation des Applications Réparties Master M1 54

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 55

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 56

57 Exemple - avant <stylesheet version='1.0' xmlns=' 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 57

58 Exemple - après <stylesheet version='1.0' xmlns=' 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> Réponse : <template match='trajet' mode='h'> <param name="x">g</param> <value-of select='horaire[@gare=$x]/@t'/> <text> </text> </template>" </stylesheet>" Grenoble : 10:01 15:10 Lyon : 10:22 16:22 Chambéry : 11:07 16:49 Steffenel Programmation des Applications Réparties Master M1 58

59 XSL-FO Steffenel Programmation des Applications Réparties Master M1 59

60 XSL-FO Recommandation du W3C depuis 2001 Format XML pour décrire un document imprimé : Taille du papier, Marges, Orientation,... Espace de noms : Steffenel Programmation des Applications Réparties Master M1 60

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 61

62 Principes Peut s'appliquer aux résultats des feuilles XSLT Steffenel Programmation des Applications Réparties Master M1 62

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 63

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 64

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 65

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 66

67 XSL-FO: Hello World <?xml version="1.0" encoding="iso "?> <fo:root xmlns:fo=" XSL/Format"> <fo:layout-master-set> <fo:simple-page-master mastername="contenu"> <fo:region-body margin="2 cm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence masterreference="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 67

68 XSL-FO: Encore plus de détails <?xml version="1.0" encoding="iso "?> <fo:root xmlns:fo=" <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 68

69 Les processeurs XSL-FO Apache Group : FOP - Formating Object Processor - Génère du PDF Antenna House - XSL Formatter RenderX - Génère du PDF Altova - StyleVision XML Mind FO Converter - Génère du RTF Autres - Arbortext, Adobe, Scriptura, XMLPDF, APOC, XSL-FO to TeX Steffenel Programmation des Applications Réparties Master M1 69

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 70

71 Formats de documents XML Steffenel Programmation des Applications Réparties Master M1 71

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 72

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 Steffenel Programmation des Applications Réparties Master M1 73

74 Document Docbook <!DOCTYPE xxx PUBLIC -//OASIS//DTD DocBook XML V4.5// EN > 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 74

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 75

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 76

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 77

78 Conversion Steffenel Programmation des Applications Réparties Master M1 78

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 79

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 80

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=" xmlns:dc=" <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 81

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 82

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 83

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 84

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 85

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 Steffenel Programmation des Applications Réparties Master M1 86