V. La transformation des documents XML

 

         Vous disposez maintenant des outils pour créer un document XML ainsi, quíéventuellement, ceux pour créer la DTD associée.

Et alors, maintenant jíen fais quoi de tout cela, le XML níétant pas directement utilisable par les navigateurs         ?

Il est donc nécessaire de passer par une nouvelle phase qui est la transformation des documents en un format utilisable, xhtml, texte, pdf Ö

 

V.1 XSLT

 

         Il est donc nécessaire díutiliser ´ un traducteur ª de XML vers autre chose. XSLT est un des langages qui le  permettent.

 

a. Principe

 

A ce jour très peu díoutils permettent de lire du XML dans ´ le texte ª cíest le moins que líon puisse dire.

Il est donc obligatoire de transformer le document XML en un document dans un format lisible et utilisable.

Les créateurs du langage XML y ont pensé et propose un outils du nom de XSLT (eXtensible Stylesheet Langage for Transformation).

Ce langage permet de créer un filtre qui est alors utilisé par un logiciel de transformation comme Saxon, Xalan pour ne citer que ces logiciels libres. Ils permettent de ´ traduire ª le document XML en un document dans un autre langage. Ce langage est définit par le concepteur du filtre.

 

 

Multidocument: Document au format XML Multidocument: Document au format xhtml, texte, ps Ö
 

 

 

 

 

 

 

 

 

 

 

 


Le site internet de référence est géré par le w3c. Son adresse est la suivante :

http://www.w3.org/TR/xslt

 

Remarque

 

Le document au format XSL est aussi un document XML. Il doit donc respecter les mêmes règles de construction vues précédemment.

 

b. Construction díune feuille de style (stylesheet) au format XSL

 

La feuille de style (le ficher filtre) va proposer un ensemble de règles qui vont permettre à partir díun élément source (document XML) de créer un élément cible (document au format désiré).

Les éléments à prendre en compte dans un document XML sont les éléments les plus bas dans líarbre représentant la structure du document XML (élément, texte, attribut Ö).

Les règles (ou template) vont donc síappliquer à ces éléments.

Ces règles et instructions commencent par le préfixe xsl (<xsl: Ö).

 

ÿ    Instructions dans le document XML

 

Pour que la transformation puisse se faire, il faut inclure dans le document XML, après la déclaration habituelle, la ligne suivante :

<?xml:stylesheet type="text/xml" href="fichier.xsl" ?>

 

Vous devez donc avoir une entête de document XML qui ressemble à ceci :

 

<?xml version=".0" encoding="ISO-8859-1" ?>

<?xml:stylesheet type="text/xml" href="fichier.xsl" ?>

 

ÿ    Instructions dans le document XSL

 

Avant de définir les templates, vous devez insérer dans votre fichier XSLT les deux premières lignes ainsi que la dernière ligne suivante dans ce document :

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="html" indent="yes"/>

Ö

</xsl:stylesheet>

 

La deuxième ligne correspond à ce qui a déjà été vu dans la partie concernant les espaces de noms. Elle permet de définir líentête du document xsl.

Entre ces lignes vont se trouver les règles de transformation.

Dans votre document XSL vont être inclus deux types díinformations :

ÿ    les templates

ÿ    les résultats de la transformation dans le ´ langage ª du document final (html, texte, Ö)

 

Remarque

 

Le mot clé transform peut remplacer dans líentête le terme stylesheet. Le résultat est identique. Níoubliez pas de le modifier aussi à la fin du document </xsl:transform>

 

c. Construction des règles de transformation (template)

 

Il existe plusieurs règles qui peuvent contenir des expressions qui permettent díeffectuer des transformations selon certaines conditions. Ces expressions seront étudiées dans le point 2 où il est question de la syntaxe Xpath. Cette syntaxe permet la construction de ces expressions.

 

Rappel

 

Votre document XML est organisé comme un arbre. Pour transformer ce document, le langage XSLT et notamment líune de ses composantes le langage Xpath va parcourir cet arbre selon vos indications pour récupérer les contenus. Il est donc fortement conseiller avant de vous lancer dans la traduction, de réaliser le schéma de cette arborescence, votre travail en sera plus facile.

 

Remarque

 

Lorsquíune règle est rencontrée, tous les núuds de líarbre sont testés à partir de líendroit définit. 

 

ÿ    Règle 1 match

 

La syntaxe de cette règle est la suivante :

 

<xsl:template match="expression">

 chaîne de remplacement ou autres éléments XSLT

</xsl:template>

 

Cette règle permet de rechercher un núud défini dans "expression" et de le remplacer par des éléments résultats (html, texte Ö) ou à nouveau proposer un ensemble de règles XSLT. Cette règle est líune des plus importantes.

 

Exemple 

 

Le premier núud rencontré dans un document xml est le noeud racine. Il est le plus souvent symboliser par le signe / mais peut aussi líêtre par son nom. Reprenons líexemple simple sncf.xml vu lors du chapitre précédent. La DTD est externe nous reverrons cet exemple complet lors du chapitre VI.

 

sncf.xml

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>

<!DOCTYPE SNCF PUBLIC "sncf/DTD" "sncf.dtd">

<SNCF>

</SNCF>

 

 

 

Le fichier XSL qui permet de le traduire en html peut être le suivant :

 

sncf.xslt

<?xml version="1.0" encoding :"ISO-8859-1" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/999/XSL/transform" version="1.0">

<xsl:output method="html" indent="yes"/>

<xsl:template match="/">  ou <xsl:template match="SNCF">

<HTML><HEAD><TITLE>

Les trains

</TITLE></HEAD>

<BODY BGCOLOR="#FFFFFF">

La Société nationale des Chemins de Fer

</BODY></HTML>

</xsl:template>

</xsl:stylesheet>

 

Pour effectuer la transformation vous pouvez utiliser Xalan et la syntaxe suivante :

 

Xalan sncf.xml sncf.xslt

OU

Xalan ño sncf.html sncf.xml sncf.xslt

 

Vous obtenez alors le code html suivant :

 

<HTML><HEAD><TITLE>

Les trains

</TITLE></HEAD>

<BODY BGCOLOR="#FFFFFF">

La Société nationale des Chemins de Fer

</BODY></HTML>

 

La première syntaxe vous envoie le résultat à líécran, la deuxième dans le fichier indiqué après líoption ño à savoir sncf.html.

 

ÿ    Règle 2 apply-templates

 

Une fois le premier núud traité (racine), vous devez indiquer au programme de transformation de continuer à appliquer les autres règles pour effectuer la suite des transformation.

 

Les syntaxes les plus habituelles de cette règle sont :

 

<xsl:apply-templates/>

OU

<xsl:apply-templates> Ö </xsl:apply-templates>

OU

<xsl:apply-templates select="expression"/>

OU

<xsl:apply-templates select="expression">

 Ö

</xsl:apply-templates>

 

La première syntaxe indique que toutes les règles suivantes doivent être appliquées à tous les núuds.

La troisième et quatrième règle indiquent que toutes les règles suivantes doivent être appliquées mais seulement aux núuds décrits par líexpression Xpath "expression".

 

Remarque

 

Si vous oubliez cette règle, la transformation síarrête au traitement du premier núud.

 

Remarque

 

Si la règle ne possède pas de contenu elle est directement fermée (/ à la fin).

 

Attention

 

Dès que cette règle est trouvée, les règles qui suivent sont appliquées. Une fois toutes les règles exécutées, le traitement recommence après la fermeture de la règle apply-templates (là où le traitement síétait interrompu pour ´ dérouler ª les autres règles).

 

ÿ    Règle 3 for-each

 

La syntaxe de cette règle est :

 

<xsl:for-each select="expression">

Ö

</xsl:for-each>

 

Cette règle permet de répéter une transformation díun ensemble de núuds définit par "expression".

Lors des transformations html, elle permet notamment la création simple de tableau.

 

Remarque

 

Cette règle ne peut être utilisée quíà líintérieur díune règle <xsl:template Ö si vous ne respectez pas cela vous aurez une erreur.

 

ÿ    Règle 4 value-of select

 

La syntaxe de cette règle est :

 

<xsl:value-of select="expression">

Ö

</xsl:value-of>

 

Cette règle permet de récupérer le contenu du texte décrit entre le début du núud (élément) et sa fin. Le núud est identifié par expression.

 

Attention

 

Síil existe des sous éléments à cet élément, le texte qui leur est associé est aussi extrait et écrit.

 

ÿ    Règle 5 if test

 

La syntaxe de cette règle est :

 

<xsl:if test="expression">

Ö

</xsl:if>

 

Cette règle permet de traiter un núud (ou un ensemble de núuds) selon sa valeur et ceci de manière conditionnelle.

Il est ainsi possible díobtenir une transformation différente en fonction des critères intégrés dans ce test.

 

ÿ    Règle 6 choose

 

La syntaxe de cette règle est la suivante :

 

<xsl:choose>

<xsl:when test="expression 1"> Ö</xsl:when>

<xsl:when test="expression 2"> Ö</xsl:when>

Ö

<xsl:when test="expression n"> Ö</xsl:when>

<xsl:otherwise> Ö</xsl:otherwise>

</xsl:choose>

 

Cette règle permet díeffectuer plusieurs tests. Les développeurs utilisant des langages de programmation reconnaîtront une structure proche du switch. Les parties case sont représentées par <xsl:when>.

 

ÿ    Règle 7 sort

 

La syntaxe de cette règle est la suivante :

 

<xsl:sort select="expr" data-type="type" order="ordre">

Ö

</xsl:sort>

 

Cette règle ne peut síutiliser quíaprès une règle 2 (<xsl :apply-templates Ö>) ou une règle 3 (<xsl:for-each Ö>).

Elle permet díeffectuer un tri des éléments en cours de traitements.

 

select="expr"

Permet de sélectionner la base du tri.

data-type="type"

Permet díindiquer le type des éléments à trier. Deux valeurs sont possibles :

ß      test

ß      number

order="ordre"

Permet de définir líordre de tri croissant ou décroissant.

Si vous omettez order le tri est croissant (ascending).

En remplaçant la valeur représentée par ordre par descending, líordre est décroissant.

 

 

ÿ    Règle 8 number

 

La syntaxe de cette règle est la suivante :

 

<xsl:number value="expr" format="type"/>

 

Cette règle permet díinsérer des numérotations dans un format indiqué dans líoption format="type".

type peut prendre les valeurs suivantes :

 

Valeur de type

Signification

1

Chiffre arabe (1, 2, Ö)

I

Chiffre romain majuscule (I, II, Ö)

i

Chiffre romain minuscule (i, ii, Ö)

A

Alphabet miajuscule (A, B, Ö)

a

Alphabet minuscule (a, b, Ö)

 

On retrouve le même système de numérotation dans líoption type de la balise OL en html. Cette balise permet de créer des listes ordonnées (Ordre List).

 

Code html

Résultat visuel

<Ol type=a>

<LI> Introduction

<LI>Deuxième Partie

Ö

</OL>

 

a.   Introduction

b.   Deuxième Partie

Ö

 

Remarque

 

Si vous définissez format="c", le format sera de líalphabet minuscule et le début de la numérotation commencera par la lettre c. Le système est le même pour les autres formats.

 

Remarque

 

Si vous désirez effectuer la numérotation i,j,k Ö vous devez utiliser líoption format="i". Mais, le problème est que cette notation représente celle en chiffre romain minuscule. Alors,  comment faire la distinction entre les deux ? Vous devez alors ajouter líoption letter-value="alphabetique".

 

<xsl:number value="expr" format="i"

letter-value="alphabetique"/>

 

Il existe díautres options :

 

ß      Grouping-separator="seprator" associé à grouping-size="nb"

Ces deux options permettent de définir un séparateur (caractère , . ..) qui à líaffichage sépare chaque paquet de nb chiffres.

 

<xsl:number value="expr" format="1"  grouping-size="." grouping-size="3"/>

Cette ligne renvoie la numérotation 1,2, Ö, 998,999,1.000, Ö

 

ß      count="noeud"

Cela permet de réaliser une numérotation, en fonction du nombre de núuds appelé núud rencontrés.

 

ÿ    Règle 9 <xsl:text>

 

Cette règle permet díinsérer du texte en conservant la structure (espaces Ö).

Vous pouvez ajouter líoption disable-output-escaping="yes" qui permet díinclure des caractères réservés sans les interpréter (&lt; Ö).

 

<xsl:text>trois espaces   : </xsl:text>

 

 

ÿ    Règle 10 <xsl:attribute>

 

Cette règle permet díassocier à une balise un attribut.

 

Exemple

 

Vous voulez, lors de la transformation de votre document en html, inclure un lien hypertexte dont la source est récupérée dans votre document xml au niveau de líélément URL. La syntaxe html qui doit résulter de la transformation est

<A href="lien">zone cliquable</A>.

 

Comment faire pour insérer les caractères < et > ? Les coder avec &gt; et &lt; mais dans ce cas lors du chargement de votre document html vous obtiendrez à líécran

<A href="lien">zone</A> et non líinsertion de la zone cliquable.

 

Le plus simple est alors díutiliser cette règle.

 

Ö

<A>

<xsl:attribute name="href">

<xsl:value-of select="URL">

</xsl:attribute>

zone cliquable

</A>

Ö

 

Le résultat de la transformation est alors :

<A href="lien">zone cliquable</A>

 

Ce qui est bien interprété par un navigateur :

zone cliquable

 

 

V.2 Xpath

 

         Les expressions qui se trouvent dans les différentes règles vues précédemment sont constituées en respectant elle même un syntaxe précise. Cette syntaxe est définie dans un langage : Xpath.

 

a. Pourquoi faire ?

 

Nous avons vu comment, à partir du langage XSLT transformer, par le biais de règles, les documents XML. Dans ces règles sont insérées des expressions ou des mots-clés (pattern).

Les expressions prennent en compte la structure du document, la position de tel núud dans líarborescence.

Le mot-clé, dés quíil est trouvé, quelque soit le contexte, est traité.

Xpath est un langage à part entière. Il est très complet. Níhésitez pas à consulter le site du w3c.

Xpath travaille essentiellement sur deux notions :

ß      les núuds

ß      les axes (chemin qui conduit au núud)

 

Xpath propose des éléments qui vont permettre de travailler sur ces deux notions pour se déplacer dans le document et effectuer les sélectionner.

 

Remarque

 

Le terme ´ núud contextuel ª est souvent employé. Ce terme désigne tout simplement le núud courant, cíest-à-dire le núud en cours de traitement.

 

b. Les expressions Xpath de selection et de localisation

 

Il faut bien garder en tête que le traitement se fait núud par núud. Le positionnement se fait donc relativement à la position du núud courant ou de manière absolue par rapport à la racine de líarborescence ou díun núud explicitement nommé. Souvent par rapport au núud définit dans la règle 1 (<xsl:template match="expression"> Ö).

Les expressions sont constituées de différents éléments qui permettent de se déplacer (axes) et de sélectionner (núud).

 

ÿ    Les symboles.

 

Symboles

Signification ñ Utilisation

/

./

../

Ö

/ représente le parent de líélément sélectionné. Vous spécifiez un chemin de manière absolue en utilisant ce symbole.

Par contre, ce symbole peut aussi représenter un chemin relatif si vous tapez avant le caractère . ou .. . Ce système est identique au déplacement dans une arborescence UNIX. Par exemple, le symbole ../TGV sélectionne le parent du núud courant appelé train.

//

.//

..//

Ö

Permet de sélectionner tous les descendants. Ici aussi vous pouvez spécifier cela de manière absolue // ou de manière relative .//, ..// Ö

Par exemple, .//TGV sélectionne tous les descendants à partir du núud où nous sommes (.//) mais ne prend en compte que le núud appelé TGV, tous les autres sont ignorés.

*

Sélectionne tous les enfants du núud courant (*) ou du núud indiqué (train/*).

Ce symbole est aussi valide pour les attributs, axes Ö

@

Sélectionne líattribut donc le nom suit ce caractère.

Par exemples, TGV/@photo permet de sélectionner líattribut photo de líélément TGV.

TGV/@* sélectionne tous les attributs de líélément TGV.

[ ]

Ces crochets permettent díinsérer une expression (prédicat) pour préciser une sélection.

Par exemple, TGV[@photo=ílocomotiveí] permet de ne sélectionner que les attributs photo de líélément TGV qui ont pour valeur locomotive.

 

ÿ    Définition des axes

 

Terme

Signification ñ Utilisation

ancestor

Représente tous les núuds ancêtres du núud courant ou du núud indiqué (parent, parent du parent Ö). ancestor::wagon permet de se déplacer sur les axes et de sélectionner tous les núuds appelés wagon qui sont les ´ ancêtres ª du núud courant.

ancestor-or-self

Représente tous les núuds ancêtres du núud courant ou du núud indiqué ainsi que le núud lui-même.

attribute

Représente les attributs du núud courant ou du núud sélectionné. attribute::* équivaut à @*

child

Représente les enfants du núud courant ou du núud indiqué. child::train permet de sélectionner tous les núuds enfants appelés train à partir du núud courant.

child-or-self

Représente les enfants du núud courant ou du núud indiqué ainsi que le núud lui-même.

following

Représente tous les núuds suivants le núud courant ou le núud indiqué, quelque soit leur position dans líarbre.

following-sibling

Représente tous les núuds suivants le núud courant ou le núud indiqué, quelque soit leur position dans líarbre qui ont le même parent.

parent

Représente le parent direct du núud courant ou du núud indiqué.

preceding

Représente tous les núuds précédents le núud courant ou le núud indiqué, quelque soit leur position dans líarbre.

preceding-sibling

Représente tous les núuds précédents le núud courant ou le núud indiqué, qui ont le même parent.

self

Représente le núud courant.

 

La syntaxe pour líutilisation de ces termes qui spécifient des axes doit être suivi des caractères :: comme dans les exemples présentés ci-dessus.

 

Exemple

 

Ö

<xsl:value-of select="child::famille[enfant="victor" | @garcon="victor"]/>

Ö

A partir du núud courant on recherche un núud fils du nom de famille qui possède soit :

ÿ    Un núud fils enfant qui possède pour valeur victor

ÿ    Un attribut garcon ayant pour valeur victor

 

 

c. Les tests sur les noeuds

 

Il est souvent nécessaire díeffectuer des tests sur les núuds, leur contenu, pour effectuer des sélections précises.

Pour cela Xpath met à notre disposition un certain nombre de tests.

Ces tests se retrouvent notamment dans les règles <xsl:if testÖ, <xsl:when test Ö, <xsl:value-of Ö

 

ÿ    Les opérateurs de comparaison

 

Opérateur

Signification

=

Egalité entre la partie droite et la partie gauche

!=

Différence entre la partie droite et la partie gauche

&gt;

La valeur de gauche est plus grande que la valeur de droite

&lt;

La valeur de gauche est plus petite que la valeur de droite

&gt;=

La valeur de gauche est plus grande ou égale à la valeur de droite

&lt;=

La valeur de gauche est plus petite ou égale à la valeur de droite

 

Il est nécessaire de coder les signes > et < du fait quíils font parties du code xml.

 

ÿ    Les opérateurs booléens

 

Opérateur

Signification

and

Et logique

or

Ou logique

not(expr)

Négation

true()

Vrai

false()

Faux

 

Remarque

 

Il ne faut pas confondre líopérateur or et le signe | que líon retrouve dans les expressions. Le deuxième signe permet de sélectionner plusieurs valeurs, éléments Ö Ce níest pas un opérateur logique.

 

ÿ    Les opérateurs arithmétiques

 

Opérateur

Signification

+

addition

-

soustraction

*

multiplication

div

division (le signe / est utilisé dans le langage xml)

mod

modulo (reste de la division)

round(expr)

arrondi à líentier le plus proche

floor(expr)

arrondi à líentier inférieur

ceilling(expr)

arrondi à líentier supérieur

sum(expr)

somme (total) des valeurs des núuds sélectionnés par líexpression expr

 

ÿ    Quelques fonctions de test importantes

 

Fonctions

Signification

text()

Cíest un núud qui ne contient que du texte

comment()

Cíest un núud qui ne contient que des commentaires

node()

Cíest un núud. Ce test ne tient compte que du núud (pas des attributs). Ce test ne peut se faire sur le núud racine.

 

Exemples

 

Ö

<xsl:template match="text()">

<xsl:value-of select=". "/>

</xsl:template>

Ö

 

Ces trois lignes permettent de sélectionner le noeud courant ne contenant que du texte et de récupérer ce texte. Ils sont souvent utilisés pour traiter les contenus textes des feuilles du document xml. Souvenez vous que cette règle traite tous les núuds rencontrès à partir du núud courant de départ. Si 15 núuds de la descendance ne possèdent que du texte, le texte de ces 15 núuds sera affiché. 

 

Ö

<xsl:template match="comment()/">

Ö

 

Cette ligne permet de sélectionner le noeud courant qui contient des commentaires mais de ne pas en tenir compte.

 

ÿ    Autres fonctions utiles

 

Fonctions

Signification

count(expr)

Renvoie le nombre de núuds qui satisfont à expr

generate-id(expr)

Crée un identifiant unique pour le premier núud défini par líexpression expr.

last()

Renvoie le numéro du dernier núud courant défini par une expression.

position()

Renvoie la position (numéro) du núud courant dans líensemble de núuds courants.

name()

Renvoie le nom du núud courant.

 

Exemple

 

 

1

2

3

4

5

6

Ö

<xsl:template match="train">

 <xsl:for-each select="destination">

  <xsl:number value="position()" format="A"/>.

  <xsl:value-of select="depart"/>

 </xsl:for-each>

</xsl:template>

Ö

 

Si vous possédez un document xml décrivant une liste de train contenant la gare de départ, vous pouvez transformer ce document en fichier texte sous forme paragraphes numérotés en lettres alphabétiques majuscules.

A.    Nantes

B.    Paris

C.   Ö

Une fois le núud possédant le nom train trouvé (Ligne 1), une boucle va parcourir tous les núuds nommés destination (Ligne 2). A chaque núud destination trouvé, sa position est récupérée (Ligne 3). Cette position est alors transformée en numérotation avec le format alphabétique majuscule. Ensuite la valeur du núud nommé depart (Ligne 4) est récupérée et insérée dans le document transformé.

 

 

Tous les éléments sont maintenant connus pour pouvoir créer une application complète comprenant

ÿ    un document xml

ÿ    une dtd

ÿ    un fichier xsl pour la transformation

 

Les chapitres suivants proposent des exemples.