Support de cours sur les schémas XSD et les transformations XSLT
Le langage de Transformation XSL
Formatage d’un document XML, Le langage XSLT:
Définition,
Principe de fonctionnement,
Structure d’une feuille de style,
Format d’une règle de transformation, Tri, Choix et Filtre avec XSLT
Prof. M.D.RAHMANI Technologies XML Master IT 2013-2014
Formatage d’un document XML
CSS:
CSS1 et CSS2 (Cascading Style Sheets) sont des feuilles de style dédiées à la présentation visuelle de documents XML.
XSL:
Le langage XSL eXtensible Stylesheet Language), permet d’effectuer des transformations sur un document XML.
API:
Une autre façon de formater un document consiste à modifier son contenu par un programme (Java, C++, PERL,…), pour aboutir à un document HTML ou un format de sortie donnée.
Les deux principales catégories d’API sont (SAX pour Simple API XML et DOM pour Document Object Model)
Le langage XSLT
Le langage XSL (eXtensible Style Language) a été conçu pour transformer des documents XML en d'autres formats comme PDF ou des pages HTML.
Il est constitué de 2 langages:
XSLT (pour XML Stylesheet Language Transformation) est un langage de transformation de documents XML.
XSL-FO (pour XML Stylesheet Language - Formatting Objets) est un langage de mise en page de document.
Ces 2 langages sont des applications XML.
Définition
XSLT est un langage qui permet d’appliquer des règles de transformation sur un document XML donné en entrée, et de générer en sortie un document XML, HTML ou une autre forme.
Le processus de transformation d'un document XML en un document imprimable, au format PDF par exemple, est donc découpé en deux phases:
1- le document XML est transformé en un document XSLFO à l'aide de feuilles de style XSLT.
2- Dans la seconde phase, le document FO obtenu à la première phase est converti par un processeur FO en un document imprimable.
Principe de fonctionnement
Une transformation XSLT- appelée une feuille de style – consiste en une série de règles pour transformer un arbre source(source tree) XML en un arbre résultant(result tree).
La transformation se fait en associant des motifs(patterns) à des modèles(templates)et en les appliquant aux éléments de l’arbre source.
Exemple
Soit un document XML:
<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href=""?>
<Catalogue> <CD>
<!-- Bon CD -->
<Titre> Best of Bob Dylan<Titre>
<Jacket NOM=""/ >
<?audio dylan.mp3?>
</CD>
</Catalogue>
Exemple: L’ arbre associé
Structure d’une feuille de style XSLT
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="; version="1.0">
<!-- les règles de transformations --> .
</xsl:stylesheet>
Remarque:
Toutes les instructions XSL appartiennent à l’espace de noms xsl, elles commencent toutes par xsl:
Format d’une règle de transformation
Un motif est une expression qui identifie le/les nœud(s) XML du document qui est/sont concerné(s) par la règle et sur le(s) quel(s) il faut appliquer une action
Une action est une opération qui réalise la transformation et/ou spécifie les caractéristiques de la présentation
<xsl:template match=‘un motif’>[action]
</xsl:template>
Exemple 1: document
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href=""?>
<demoXML>
<message>
Voici du XML
</message> </demoXML>
Exemple1: le document xsl associé
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="; version="1.0">
<xsl:template match="/">
<html>
<body>
<xsl:value-of select="demoXML/message"/> </body>
</html>
</xsl:template>
</xsl:stylesheet>
Remarques:
La balise <xsl:value-of> permet de sélectionner un élément du fichier XML pour le traiter dans le fichier XSL.
Dans l'attribut select, on détermine le chemin d'accès vers la balise XML souhaitée.
La balise template indique le format de transformation
L’attribut match mentionne les éléments qui sont concernés par la transformation,
/ indique l'élément racine et tous les sous éléments
<?xml version="1.0" encoding="ISO- 8859-1"?> <?xml-stylesheet href="" type="text/xsl"?> <enfants> <enfant> | <?xml version="1.0" encoding="ISO-8859-1"?> <html xmlns:xsl=";> <body style="font-family:Arial; fontsize:12pt;"> <xsl:for-each select="enfants/enfant"> <div style="background-color:teal; color:white;"> <span style="font-weight:bold; color:white; |
Exemple 2: (IE!)
<nom>Ali</nom>
<lien>garçon</lien>
<date>07/11/83</date>
<data>Une tête brulée!</data>
</enfant>
<enfant>
<nom>Samia</nom>
<lien>fille</lien>
<date>20/12/85</date>
<data>La petite fille chérie à son papa.</data>
</enfant>
</enfants>
padding:4px"> <xsl:value-of select="nom"/>
<xsl:value-of select="lien"/> </span>
</div>
<div style="margin-left:20px; fontsize:10pt">
<span> Anniversaire le <xsl:value-of select="date"/>
</span>
<span style="font-style:italic"> -
<xsl:value-of select="data"/>
</span>
</div>
</xsl:for-each>
</body>
</html>
Le langage XSLT: exemple
Exemple 3:
<?xml version="1.0"?> <mp3>
<?xml-stylesheet type="text/xsl" <titre>Pourtant</titre> href=""?> <artiste>Vanessa Paradis</artiste>
<compilation> </mp3>
<mp3> <mp3>
<titre>Foule sentimentale</titre> <titre>Chambre avec vue</titre>
<artiste>Alain Souchon</artiste> <artiste>Henri Salvador</artiste>
</mp3> </mp3>
<mp3> </compilation>
<titre>Solaar pleure</titre>
<artiste>MC Solaar</artiste>
</mp3>
<mp3>
<titre>Le baiser</titre>
<artiste>Alain Souchon</artiste>
</mp3>
Exemple 3:
<?xml version="1.0" encoding="ISO8859-1"?> <?xml-stylesheet type="text/xsl" href=""?> <films> <film> | <film> <titre>Le tableau noir</titre> <realisateur>Samira Makhmalbaf</realisateur> </film> <film> <titre>Chat noir chat blanc</titre> |
<titre>Papa est en vayage d'affaires</titre> <realisateur>Emir Kusturica</realisateur> </film> <film> <titre>Matador</titre> <realisateur>Pedro Almodovar</realisateur> </film> | <realisateur>Emir Kusturica</realisateur> </film> <film> <titre>Amores perros</titre> <realisateur>Alejandro gonzales</realisateur> </film> </films> |
Exemple 3: La feuille associée
<?xml version='1.0' encoding="ISO8859-1"?> <xsl:stylesheet xmlns:xsl=" /XSL/Transform" version="1.0"> <xsl:template match="/"> | <td> <xsl:value-of select="films/film/titre"/> </td> <td> <xsl:value-of |
<html> <body> <table border="1" cellspacing="0" cellpadding="3"> <tr bgcolor="#FFFF00"> <td>Titre</td> <td>Réalisateur</td> </tr> | select="films/film/realisateur"/> </td> </tr> </table> </body> </html> </xsl:template> |
</xsl:stylesheet> <tr>
Le résultat
Sélection de tous les titres:
Pour afficher tous les éléments, on ajoute la balise: xsl:for-each(pour chaque) avec comme attribut select="films/film"
<?xml version='1.0' encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="; version="1.0">
<xsl:template match="/">
<html>
<body>
<table border="1" cellspacing="0" cellpadding="3">
<tr bgcolor="#FFFF00"> <td>Titre</td>
<td>Réalisateur</td>
</tr>
<xsl:for-each select="films/film"> <tr> <td><xsl:value-of select="titre"/></td> <td><xsl:value-of select="realisateur"/></td> </tr> </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Le résultat
Les autres possibilités du langage XSLT
Le langage XSLT permet aussi de :
trier les données XML en ordre croissant ou
décroissant.
filtrer des éléments XML en fonction de certains
critères.
choisir des éléments. retenir des éléments par des tests conditionnels.
Trier avec XSLT
1- il suffit d'ajouter l'attribut:
order-by="+balise" pour trier en ordre croissant et order-by="-balise" pour trier en ordre décroissant. pour l'espace de nom:
xmlns:xsl="
2- Ou bien, l'attribut:
order="ascending" pour trier en ordre croissant et order="descending" pour trier en ordre décroissant. pour l'espace de nom: xmlns:xsl="; version="1.0"
Trier avec XSLT:
Trier en ordre alphabétique croissant du nom des réalisateurs <?xml version='1.0' encoding="ISO8859-1"?> <xsl:stylesheet xmlns:xsl=";> | <xsl:for-each select="films/film" orderby="+realisateur"> <tr> <td><xsl:value-of select="realisateur"/> </td> |
<!-- xsl:stylesheet xmlns:xsl=" SL/Transform" version="1.0"--> <xsl:template match="/"> <html> <body> <table border="1" cellspacing="0" cellpadding="3"> <tr bgcolor="#FFFF00"> <td>Réalisateur</td> <td>Titre</td> | <td><xsl:value-of select="titre"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> |
</tr>
Le résultat
Trier avec XSL:
<xsl:for-each
Trier en ordre alphabétique croissant select="films/film"> du nom des artistes. <xsl:sort
<?xml version='1.0' select="realisateur" encoding="ISO-8859-1"?> order="descending" />
<xsl:stylesheet
<tr>
xmlns:xsl="
/1999/XSL/Transform" <td><xsl:value-of version="1.0"> select="realisateur"/>
<xsl:template match="/"> </td>
<html> <td><xsl:value-of
<body> select="titre"/></td>
<table border="1" </tr>
cellspacing="0"
cellpadding="3"> </xsl:for-each>
<tr bgcolor="#FFFF00"> </table>
<td>Réalisateur</td> </body>
<td>Titre</td> </html>
</tr> </xsl:template>
</xsl:stylesheet>
Le résultat
Filtrer avec XSLT
Le langage XSLT permet de filtrer les données du fichier XML associé selon les critères:
égal, pas égal, plus grand que, plus petit que
Pour ce faire, on utilise l'attribut:
select="chemin_d'accès[balise='xxx']"
Les opérateurs possibles sont :
= pour égal.
!= pour différent.
> pour plus grand que.
< pour plus petit que.
Filtrer avec XSLT:
La sélection des titres de l'artiste Alain Souchon.
L'attribut select devient:
select="films/film[realisateur='Emir Kusturica']"
<?xml version='1.0' encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="; version="1.0">
<xsl:template match="/">
<html>
<body>
<table border="1" cellspacing="0" cellpadding="3">
<tr bgcolor="#FFFF00">
<td>Titre</td>
<td>Réalisateur</td>
</tr>
<xsl:for-each select="films/film[realisateur='Emir Kusturica']">
<tr>
<td><xsl:value-of select="titre"/></td>
<td><xsl:value-of select="realisateur"/></td> </tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Filtrer avec XSLT:
Le Choix avec XSLT
La balise <xsl:if> </xsl:if> permet
d'effectuer un choix dans les données du fichier XML.
On ajoute l'attribut match où l'on indique l'élément choisi.
<xsl:if match=".[balise='xxx']"> balises Html
</xsl:if>
Le choix avec XSLT:
<?xml version='1.0' encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl=";>
<!--xsl:stylesheet xmlns:xsl="; version="1.0"-->
<xsl:template match="/">
<html>
<body>
<table border="1" cellspacing="0" cellpadding="3"> <tr bgcolor="#FFFF00">
<td>Titre</td>
<td>Réalisateur</td>
</tr>
<xsl:for-each select="films/film">
<xsl:if match=".[realisateur='Samira Makhmalbaf']"> <tr>
<td><xsl:value-of select="titre"/></td>
<td><xsl:value-of select="realisateur"/></td> </tr>
</xsl:if>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Le choix avec XSLT: résultat
Le choix conditionnel:
Le choix conditionnel se fait avec:
<xsl:choose>.
<xsl:when une action xsl:otherwise une autre action
</xsl:choose>
<xsl:choose>
<xsl:whentest=".[artiste='Emir Kusturica']">
<tr bgcolor="#00FF00">
<td><xsl:value-of select="titre"/></td>
<td><xsl:value-of select="realisateur"/></td> </tr>
</xsl:when>
<xsl:otherwise> <tr>
<td><xsl:value-of select="titre"/></td>
<td><xsl:value-of select="realisateur"/></td> </tr>
</xsl:otherwise> </xsl:choose>
XSLT: Choix conditionnel
<?xml version='1.0' encoding="ISO8859-1"?> <xsl:stylesheet xmlns:xsl=" D-xsl"> <xsl:template match="/"> <html> <body> <table border="1" cellspacing="0" cellpadding="3"> | <xsl:otherwise> <tr> <td><xsl:value-of select="titre"/></td> <td><xsl:value-of select="realisateur"/></td> </tr> </xsl:otherwise> |
<tr bgcolor="#FFFF00"> <td>Réalisateur</td> <td>Titre</td> </tr> <xsl:for-each select="films/film"> <xsl:choose> <xsl:when test=".[realisateur='Emir | </xsl:choose> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> |
Kusturica']">
<tr bgcolor="#00FF00">
<td><xsl:value-of select="titre"/></td>
<td><xsl:value-of select="realisateur"/></td>
</tr>
</xsl:when>
Le choix conditionnel: résultat
Tous les titres d'Alain Souchon seront affichés dans une colonne verte, les autres seront affichés normalement.
Plusieurs choix sur la sélection
<xsl:choose>
<xsl:when test="quelque-chose"> [action]
</xsl:when>
<xsl:when test="autre-chose"> [action]
</xsl:when>
<xsl:otherwise> [action]
</xsl:otherwise>
</xsl:choose>