Présentation des résultats – Requêtes XQuery

By 21 March 2012

Présentation des résultats – Chapitre 8 :

Parvenant au terme de ce travail, nous nous attacherons en cette dernière partie à la présentation des résultats obtenus.
Au départ d’un fichier au format XML, nous avons au travers des diverses requêtes XQuery produit des résultats sous forme d’arbres XML, qui sont lisibles, mais dont la présentation peut être améliorée.

Pour ce, nous utiliserons les solutions XSL du W3C, et plus particulièrement XSL-FO.
Comme pour la partie dédiée à XQuery, nous utiliserons le vocabulaire technique en anglais, la recommandation source du W3C étant rédigée en anglais.

1-XSL.

Extensible Stylesheet Language est un langage de transformation de documents XML.
XSL, devenu une recommandation du W3C le 16 décembre 1998 en version1.0 , a évolué pour être scindé en trois domaines: Xpath, XSLT et XSL-FO.

2-XSLT et Stylesheet.

Une transformation XSL s’opère par le recours à une « stylesheet » ou feuille de style.
XSLT est le langage utilisé pour produire les « stylesheet », ce qui revient à ce qu’une stylesheet est un document de transformation XSLT.

Une « stylesheet » permet de décrire les règles de transformation des données (éléments et attributs) d’un arbre XML afin d’aboutir en fin de traitement à leur présentation (police, taille, couleur, fond de page,..).
Une « stylesheet » est un document XML bien formé utilisant des expressions issues de l’espace de nom XML.

3-Transformation et Templates.

Une « stylesheet » consiste en un ensemble de « template rules ».
Un « template rule » utilise deux composants:

1) Des pattern qui recourent à Xpath et sélectionnent les éléments de l’arbre XML de base.
2) Des template qui appliqués aux éléments sélectionnés, construisent chacun une partie de l’arbre de résultat.

Principe de transformation.
Nous décrivons brièvement le principe de transformation d’un arbre XML en un autre afin de mieux appréhender les mécanismes mis en oeuvre.

Un processeur XSL reçoit en entrée un document XML (à traiter) et une « stylesheet ».
L’arbre XML initial est transformé par le processeur XSL en un autre arbre XML selon les indications fournies par la «stylesheet».
Cette transformation est réalisée en deux étapes:

1) La construction de l’arbre de résultat (« tree transformation »).
2) Traitement de l’arbre de résultat selon la feuille de style (« formatting »).
Principe de transformation

 

4-Le formatting.

L’étape de « Formatting » inclus de la sémantique dans l’arbre de résultat dont les « nodes » sont des « formatting objects ».
Les « formatting objects » font partie de classes qui décrivent paragraphes, texte, tables.
« Formatting » consiste à créer un arbre « formatting object tree », dont les éléments sont des « formatting object ».
Le modèle du « formatting object tree » est celui du « area tree ».
« Formatting » revient à créer un arbre « area tree » constitué de « geometric area » .

Les « geometric area » consistent en une séquence de pages, où chaque « area » a sa position précise dans la page.
Cet « area tree » décrit la structure géométrique de la sortie.
Simplement exprimé, la transformation crée une séquence de zones géométriques ayant un contenu et une position précise au sein de séquence.
Nous retenons que les « formatting objects » peuvent être de type « block-level » ou « inlinelevel », ceci selon le type d’ « areas » qu’ils génèrent.

6-XSL-FO.

XST-FO fait partie de la recommandation Extensible Stylesheet Language version 1.0 du 15 octobre 2001, modifiée en version 1.1 le 05 décembre 2006.
XSL-FO a pour finalité de produire un document imprimable, alors qu’une transformation XSLT comme nous venons de décrire, génère soit du XML, soit du HTML ou du texte.

Plutôt que de devoir utiliser une multitude de spécifications correspondant chacune à un type d’imprimante existant, il a été choisi de produire un document au format PS ou PDF, ce qui le rend imprimable presque universellement.

7-Principe de transformation XSL-FO.

Une transformation XSL-FO est similaire à une transformation XSLT: à un document XML de base est appliquée une feuille de style XSLT qui sélectionne les éléments XML de base et leur applique les règles de transformation qui créent le document XSL-FO.

Ce document XSL-FO est alors traité par un « formatter » qui produit le document PDF imprimable.
Apache propose un outil: Formatting Objects Processor – FOP – permettant la transformation en PDF d’un document XSL-FO.
Principe de transformation XSL-FO.

8-XSL-FO stylesheet.

La construction d’une « stylesheet » XSL-FO repose sur l’utilisation de différents « formatting objects ».
La recommandation W3C propose le modèle ci-après.
XSL-FO stylesheet.
La forme d’un document XSL-FO est celle d’un arbre XML, à la base duquel se trouve un élément racine qui est le « fo:root » « formatting object ».
« fo-root » a pour éléments descendants:
– « fo:layout-master-set » qui défini la géométrie et la séquence des pages utilisées dans le document final.
– « fo:declarations » (qui est optionnel).
– une ou plusieurs « fo:page-sequences », dont les descendants sont des « flows », génèrent le contenu de ces pages.
« fo:layout-master-set » a pour enfants:
– simple-page-masters qui décrit les subdivisions des pages et leur géométrie; il faut au minimum un simple-page-master. Un simple-page-master a un attribut « master-name ».
– page-sequence-masters qui décrit la séquence de « page-masters » que le formatting du
« fo:page-sequence » devra respecter. Il détermine l’ordre d’apparition des « page-masters ». Un page-sequence-master » a un attribut « master-reference ».

Représentation d’un simple-page-master model. (source: W3C)

Représentation d'un simple-page-master model
Le « simple-page-master » permet de déterminer différentes régions (« region before », « region start », « region after », « region end », « body ») et la taille d’une page (« margin »).
D’autres propriétés ayant trait à la pagination peuvent être décrites, comme la direction d’écriture au travers des différentes pages d’un document « writing mode » et « relative direction » .

9-Application pratique.

Nous créons une présentation pour l’arbre XML synthétisant les résultats d’une commande, que nous développions au cours du chapitre précédent.

Nous le reproduisons ci-dessous.

<?xml version=”1.0″ encoding=”UTF-8″?>
<presentation2> <commande>
<id_commande>com001</id_commande>
<descriptif>systeme solaire</descriptif>
<nom>jaeger</nom>
<adresse>rue du bois 36 à 1000 bruxelles</adresse>
</commande> <charges>
<cout_direct>5103</cout_direct> <cout_indirect_commande>3376.1968</cout_indirect_commande>
</charges>
<resultats>
<chiffre_affaire>12000</chiffre_affaire>
<marge_brute>6897</marge_brute>
<marge_nette>3520.8032</marge_nette>
</resultats>
<ratios>
<a>42.525</a>
<b>57.475</b>
<c>28.134974</c>
<d>29.340027</d>
<e>70.65997</e>
</ratios>
</presentation2>

Détail de la stylesheet.
Nous détaillons la « Stylesheet » de façon fragmentaire; le document est présenté dans son entièreté plus bas.

<?xml version=”1.0″ encoding=”ISO-8859-1″ ?> <xsl:stylesheet version=”1.0″
xmlns:xsl=” http://www.w3.org/1999/XSL/Transform”>

Nous déclarons le document XSL qui est conforme à la version XSL 1.0 et est lui même un document XML.
La mention de xmlns:xsl=” http://www.w3.org/1999/XSL/Transform” indique au processeur XSLT qu’il devra utiliser le « namespace » correspondant (Transform).

<xsl:template match=”presentation”>
<fo:root xmlns:fo=” http://www.w3.org/1999/XSL/Format”>

Nous sélectionnons l’élément « presentation » qui est l’élément racine du fichier XML que nous voulons transformer.
L’élément racine du fichier XSL-FO est déclaré, avec une précision pour le processeur (xmlns:fo=” http://www.w3.org/1999/XSL/Format”), qui devra utiliser le « Namespace » « Format » pour la transformation FO.

<fo:layout-master-set>
<fo:simple-page-master master-name=”expdf” page-height=”29.7cm” page-width=”21cm” margin-top=”2cm” margin-bottom=”2cm” margin-left=”2cm” margin-right=”2cm”>
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>

Nous déclarons le « fo:layout-master-set » contenant le « simple-page-master » dont le « master-name » est « expdf » . Nous y décrivons le format de page qui sera utilisé : une feuille A4 (21 * 29,5 cm).
Les marges seront de 2cm.

<fo:page-sequence master-reference=”expdf”> <fo:flow flow-name=”xsl-region-body”>

Le « page-sequence-master-reference » est déclaré, il fait référence à « expdf ». Le flow (qui génère le contenu des pages) écrira dans la région « body ».

<fo:block border=”2 px solid black” padding=”4mm” space-after=”18mm” > <fo:block font-weight=”bold” font-family= “Helvetica”
font-size=”24pt” text-align=”center”
border=”3px outset olive” space-before = “8mm” space-after=”18mm” padding=”2mm”> Résultats financiers de la commande
</fo:block>

Ici commence la sélection de ce qui devra être affiché en sortie de traitement.
La notion de « block-level » que nous évoquions plus haut est utilisée.
Dans la première ligne, nous déclarons que l’ensemble du contenu devra être encadré d’une bordure noire épaisse de 2px.

Cette première balise sera refermée après la déclaration de tous les blocs suivants.
Puis en seconde ligne nous déclarons le premier « block » qui sera le titre « Résultats financiers de la commande ».
La police, sa taille, son épaisseur, le mode d’alignement du texte sont déclarés; ce titre devra être encadré en couleur « olive ».

<fo:block font-weight=”bold” font-family= “Helvetica”
font-size=”18pt” text-align=”center” border=”2px double darkolivegreen”
space-after=”10mm” padding=”2mm”>
Commande
</fo:block>
<fo:block border=”2 px solid black” padding=”2mm” space-after=”28mm” >
<fo:block font-size=”16pt” space-before=”14pt” space-after=”2mm” line-height=”20pt” text-align=”left” start-indent=”2mm” >
– Référence Commande: <xsl:value-of select=”commande/id_commande”/>
</fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> – Client: <xsl:value-of select=”commande/nom”/>
</fo:block>
<fo:block font-size=”16pt” start-indent=”2mm” space-after=”2mm” line-height=”20pt”> – Détail de la commande: <xsl:value-of select=”commande/descriptif”/>
</fo:block>
</fo:block>

Puis vient une zone portant le titre « Commande », suivi d’une zone reprenant les informations de l’arbre XML de départ: “commande/id_commande”, “commande/nom”, et “commande/descriptif”. Nous sélectionnons ces éléments via l’instruction « xsl:value-of select » suivi d’une expression Xpath
« commande/id_commande ».
Chaque élément sélectionné est précédé d’un commentaire: « – Référence Commande: », « – Client: », « – Détail de la commande: » dont le but est de faciliter la compréhension et d’enrichir la présentation des éléments XML de départ.

<fo:block font-weight=”bold” font-family= “Helvetica”
font-size=”18pt” text-align=”center” border=”3px ridge darkolivegreen” space-after=”10mm” padding=”2mm”>
Calcul de rentabilité
</fo:block>
<fo:block border=”2 px solid black” padding=”2mm” space-after=”8mm”>
<fo:block font-size=”16pt” space-before= “4mm” start-indent=”2mm” space-after=”2mm” line- height=”20pt”>
Chiffre d’affaire de la commande: <xsl:value-of select=”resultats/chiffre_affaire”/> Euro </fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> ( – ) Charge Directe: <xsl:value-of select=”charges/cout_direct”/> Euro
</fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> ( = ) Marge Brute: <xsl:value-of select=”resultats/marge_brute”/> Euro
</fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”>
( – ) Charge indirecte (ou coût ABC): <xsl:value-of select=”charges/cout_indirect_commande”/> Euro </fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”
padding=”1mm” border=”2px solid red”>
( = ) Marge Nette: <xsl:value-of select=”resultats/marge_nette”/> Euro
</fo:block> </fo:block> </fo:block>
<fo:block font-weight=”bold” font-family= “Helvetica”
font-size=”18pt” text-align=”center” border=”3px ridge darkolivegreen” space-after=”4mm” padding=”2mm”> Présentation sous forme de ratios

</fo:block>
<fo:block border=”2 px solid black” padding=”2mm” space-after=”8mm”>
<fo:block font-size=”14pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> Proportion Charges Directes dans le chiffre d’affaire: <xsl:value-of select=”ratios/a”/> % </fo:block>
<fo:block font-size=”14pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> Proportion Marge Brute dans le chiffre d’affaire: <xsl:value-of select=”ratios/b”/> % </fo:block>
<fo:block font-size=”14pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> Proportion Charges Indirectes dans le chiffre d’affaire: <xsl:value-of select=”ratios/c”/> % </fo:block>
<fo:block font-size=”14pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”>
Proportion Marge Nette dans le chiffre d’affaire: <xsl:value-of select=”ratios/d”/> %
</fo:block>
</fo:block>

</fo:flow>
</fo:page-sequence> </fo:root>
</xsl:template>
</xsl:stylesheet>

Nous créons une zone similaire à la précédente selon exactement les mêmes principes.
Le titre encadré devient « Calcul de rentabilité », les données sélectionnées dans l’arbre XML de résultat sont “resultats/chiffre_affaire”, “charges/cout_direct”, “resultats/marge_brute”, “charges/cout_abc_ commande”, “resultats/marge_nette”.

Les commentaires sont : « Chiffre d’affaire de la commande: », « ( – ) Charge Directe: », « ( = ) Marge Brute: », « ( – ) Charge indirecte (ou coût ABC): » et « ( = ) Marge Nette: ».
La ligne dédiée à l’élément « resultats/marge_nette » est encadrée de rouge.
Enfin, un commentaire est placé à la suite de chaque élément sélectionné afin de préciser l’unité monétaire: « Euro ».
Enfin, en une troisième zone, identique, nous présentons les données issues du calcul de ratios. Le titre: « Présentation sous forme de ratios ».

Nous présentons également les éléments: « ratios/a », « ratios/b », « ratios/c », et « ratios/d ». Nous commentons chacun des éléments: « Proportion Charges Directes dans le chiffre d’affaire: »,
« Proportion Marge Brute dans le chiffre d’affaire: », « Proportion Charges Indirectes dans le chiffre d’affaire: », et « Proportion Marge Nette dans le chiffre d’affaire: ».
Chaque élément est suivi du signe « % ».

Ci-dessous, la « stylesheet » complète.
<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>
<xsl:stylesheet version=”1.0″ xmlns:xsl=” http://www.w3.org/1999/XSL/Transform” xmlns:fo=” http://www.w3.org/1999/XSL/Format”>
<xsl:template match=”presentation”>
<fo:root xmlns:fo=” http://www.w3.org/1999/XSL/Format”>
<fo:layout-master-set>
<fo:simple-page-master master-name=”expdf” page-height=”29.7cm” page-width=”21cm” margin-top=”2cm” margin-bottom=”2cm” margin-left=”2cm” margin-right=”2cm”>
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference=”expdf”> <fo:flow flow-name=”xsl-region-body”>
<fo:block border=”2 px solid black” padding=”4mm” space-after=”18mm” > <fo:block font-weight=”bold” font-family= “Helvetica”
font-size=”24pt” text-align=”center”
border=”3px outset olive” space-before = “8mm” space-after=”18mm” padding=”2mm”> Résultats financiers de la commande
</fo:block>
<fo:block font-weight=”bold” font-family= “Helvetica”
font-size=”18pt” text-align=”center” border=”2px double darkolivegreen” space-after=”10mm” padding=”2mm”>
Commande
</fo:block>
<fo:block border=”2 px solid black” padding=”2mm” space-after=”28mm” >
<fo:block font-size=”16pt” space-before=”14pt” space-after=”2mm” line-height=”20pt” text-align=”left” start-indent=”2mm” >
– Référence Commande: <xsl:value-of select=”commande/id_commande”/> </fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> – Client: <xsl:value-of select=”commande/nom”/>
</fo:block>
<fo:block font-size=”16pt” start-indent=”2mm” space-after=”2mm” line-height=”20pt”> – Détail de la commande: <xsl:value-of select=”commande/descriptif”/>
</fo:block>
</fo:block>
<fo:block font-weight=”bold” font-family= “Helvetica”
font-size=”18pt” text-align=”center” border=”3px ridge darkolivegreen” space-after=”10mm” padding=”2mm”>
Calcul de rentabilité
</fo:block>
<fo:block border=”2 px solid black” padding=”2mm” space-after=”8mm”>
<fo:block font-size=”16pt” space-before= “4mm” start-indent=”2mm” space-after=”2mm” line- height=”20pt”>
Chiffre d’affaire de la commande: <xsl:value-of select=”resultats/chiffre_affaire”/> Euro </fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> ( – ) Charge Directe: <xsl:value-of select=”charges/cout_direct”/> Euro
</fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> ( = ) Marge Brute: <xsl:value-of select=”resultats/marge_brute”/> Euro
</fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”>
( – ) Charge indirecte (ou coût ABC): <xsl:value-of select=”charges/cout_indirect_commande”/> Euro </fo:block>
<fo:block font-size=”16pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt” padding=”1mm” border=”2px solid red”>
( = ) Marge Nette: <xsl:value-of select=”resultats/marge_nette”/> Euro </fo:block>
</fo:block>
</fo:block>
<fo:block font-weight=”bold” font-family= “Helvetica”
font-size=”18pt” text-align=”center” border=”3px ridge darkolivegreen” space-after=”4mm” padding=”2mm”> Présentation sous forme de ratios </fo:block>
<fo:block border=”2 px solid black” padding=”2mm” space-after=”8mm”>
<fo:block font-size=”14pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> Proportion Charges Directes dans le chiffre d’affaire: <xsl:value-of select=”ratios/a”/> % </fo:block>
<fo:block font-size=”14pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> Proportion Marge Brute dans le chiffre d’affaire: <xsl:value-of select=”ratios/b”/> % </fo:block>
<fo:block font-size=”14pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> Proportion Charges Indirectes dans le chiffre d’affaire: <xsl:value-of select=”ratios/c”/> % </fo:block>
<fo:block font-size=”14pt” space-after=”2mm” start-indent=”2mm” line-height=”20pt”> Proportion Marge Nette dans le chiffre d’affaire: <xsl:value-of select=”ratios/d”/> % </fo:block>
</fo:lock> </fo:flow> </fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>

10-Traitement « formatter ».

La suite logicielle <oXygen/> intègre un « formatter ». Nous avons eu recours à cette solution, qui a généré le document .PDF suivant.
Traitement « formatter ».

Nous y retrouvons les éléments du document XML de base, comme le nom du client, le chiffre d’affaire de la commande, la marge nette, etc.. enrichis des commentaires que nous souhaitions.

Sources:
W3C XSL Transformations (XSLT) Version 1.0
Illustrations: W3C XSL Transformations (XSLT) Version 1.0 W3C Extensible Stylesheet Language (XSL) Version 1.1 XSL-FO de Dave Pawson; ISBN : 0-596-00355-2
Elaboration d’une application de la méthode Activity Based Costing utilisant les technologies XML.

Lire le mémoire complet ==> (Application de la méthode Activity Based Costing, technologies XML)
Mémoire présenté en vue de l’obtention du grade de Licencié en Informatique et Sciences humaines
Université libre de Bruxelles, Faculté des sciences sociales politiques et économiques