Module BD et Sites Web
Plan
– Instructions XSLT (suite) – Chemins complexes
– Exécution des règles – Passage de paramètres – Priorités
Copie de noeuds
• Copier des nœuds du document source vers le document résultat :
<xsl:copy> copie un seul nœud, sans ses descendants
<xsl:copy-of> copie en profondeur, c-à-d copie le nœud et ses descendants, y compris les attributs
Branchement conditionnel
• Instruction <xsl:if >
– Possède un attribut test dont la valeur est une expression Xpath. L’expression est évaluée et renvoie un booléen. Le contenu de l’élément <xsl:if> est instancié si l’expression est évaluée à true.
• Instruction <xsl:choose>
– S’utilise avec les éléments <xsl:when> et <xsl:otherwise>
Exemple
<xsl:stylesheet version’1.0’
xmlns:xsl=‘http://www.W3.org/1999/XSL/Transform’> <xsl:output method=‘xml’ encoding=‘ISO-8859-1’/>
<xsl:template match=‘FILMS’>
<xsl:apply-templates select=‘FILM’/> </xsl:template>
<xsl:template match=‘FILM’>
<xsl:if test=‘ANNEE < 1970’> <xsl:copy-of select=‘.’/> </xsl:if>
</xsl:template> </xsl:stylesheet>
Exemple
<xsl:template match=‘FILM’>
<xsl:choose>
<xsl:when test=‘ANNEE < 1970’>
‘<xsl:value-of select=‘TITRE’/>’ est ancien
</xsl:when>
<xsl:when test=‘ANNEE > 1970’>
‘<xsl:value-of select=‘TITRE’/>’ est récent
</xsl:when>
<xsl:otherwise>
de quand date ‘<xsl:value-of select=‘TITRE’/>’?
</xsl:otherwise> </xsl:choose>
Boucle
• Instruction <xsl:for-each>
• S’utilise avec l’attribut select
• L’itération s’effectue sur l’ensemble de nœuds constitué par l’expression Xpath de l’attribut
select. Le contenu de l’élément xsl:for-each
est instancié successivement pour chaque nœud de l’ensemble.
Création de nœuds (élément et attribut)
• XSLT permet de construire des nœuds dans le document résultat:
• <xsl:attribute name=‘xx’> permet
d’ajouter un attribut de nom ‘xx’ à un élément. Le contenu de l’élément xsl:attribute définit la
valeur de l’attribut (c’est un corps de règle qui doit envoyer un noeud de type Text.)
• <xsl:element name=‘yy’> permet d’insérer
Création de nœuds
• <xsl:comment> permet de créer des
commentaires
• <xsl:processing-instruction> crée des
instructions de traitement
• <xsl:text> crée un nœud de type text
Chemins complexes
Jusqu’à présent, on accédait aux fils d’un nœud. On peut aussi
accéder à tous les descendants
accéder aux parents, aux frères, aux neveux, … accéder aux attributs
effectuer des boucles
Exemple : Document XML
1 <?xml version=‘1.0’ encoding=‘ISO-8959-1’?>
2 <?xml-stylesheet href=‘Salle.xsl’type=‘text/xsl’?> 3 <?cocoon-process type=‘xslt’?>
4 <SALLE NO=‘1’ PLACES=‘320’> 5 <FILM> 6 <TITRE>Alien</TITRE> 7 <AUTEUR>Ridley Scott</AUTEUR> 8 <ANNEE>1979</ANNEE> 9 <GENRE>Science-Fiction</GENRE> 10 <PAYS>Etats-Unis</PAYS>
11 <RESUME>près d’un vaisseau spatial… </RESUME> 12 </FILM> 13 <REMARQUE>réservation conseillée</REMARQUE> 14 <SEANCES> 15 <SEANCE>15:00</SEANCE> 16 <SEANCE>18:00</SEANCE> 17 <SEANCE>21:00</SEANCE> 18 </SEANCES> 19 </SALLE>
Exemple: traduction de Salle
1 <xsl:template match=‘SALLE’>
2 <h2>Salle No
3 <xsl:value-of select=‘@NO’/></h2>
4 Film: <xsl:value-of select=‘FILM/TITRE’/>
5 de <xsl:value-of select=‘FILM/AUTEUR’/>
6 <ol> <xsl:for-each select=‘SEANCES/SEANCE’>
7 <li><xsl:value-of select=‘.’/></li> 8 </xsl:for-each>
9 </ol>
Le résultat
Appliqué au fichier Salle.xml :
1 <h2>Salle No1 </h2> 2 Film: Alien 3 De Ridley Scott 4 <ol> 5 <li>15:00</li> 6 <li>18:00</li> 7 <li>21:00</li> 8 </ol>
Chemins complexes
• Descendants : le titre du film est désigné par
select=‘FILM/TITRE’
• Attributs : le numéro de la salle est désigné par
select=‘@NO’
• Boucles : avec xsl:for-each sur l’ensemble des
séances désignées par
select=‘SEANCES/SEANCE’
Appels de 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
Exemple
Cadre HTML, puis appel de la règle CINEMA <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>
Règle CINEMA
Exploitation de l’élément CINEMA, puis appel à la règle SALLE
1 <xsl:template match=‘CINEMA’> 2 <h1><i> 3 <xsl:value-of select=‘NOM’/> 4 </i></h1><hr/> 5 <xsl:value-of select=‘ADRESSE’/> 6 <i>Métro: </i> 7 <xsl:value-of select=‘METRO’/> 8 <hr/> 9 <xsl:apply-templates select=‘SALLE’/> 10 </xsl:template>
Arbre XML à transformer
Salle Film Seances Adresse Metro Cinema NomVue d’ensemble
xsl:template match=‘/’ html body head title xsl:value-of xsl:apply-templates xsl:template match=‘CINEMA’ h1 i hr xsl:value-of xsl:apply-templates xsl:value-of i xsl:value-of ‘Métro:’ hrExécution des règles
• La première règle, appliquée à la racine du document XML, produit un « squelette » du document HTML (balises html,
head, body), puis lance l’exécution de la règle CINEMA
(qui s’applique aux éléments CINEMA).
• La deuxième règle (CINEMA) produit les informations globales sur le cinéma (nom, adresse, métro), puis lance l’exécution de la règle SALLE
• La règle SALLE s’applique aux éléments SALLE du
Sélection d’une règle
• Que faire quand plusieurs règles sont candidates pour un même noeud ?
• il existe des priorités implicites qui permettent au processeur de choisir
• on peut aussi donner explicitement une priorité • si le choix est impossible : le processeur s’arrête.
Règles par défaut
• Quand aucune règle n’est sélectionnée, XSLT applique des règles par défaut :
– La 1ère s’applique à la racine et à tous les éléments. Elle déclenche un appel de règle pour tous les fils du nœud courant (apply-templates sans attribut select équivaut à la sélection de tous les fils du nœud courant) – La 2ème s’applique aux nœuds de texte et aux attributs. Elle insère le
contenu textuel de ces nœuds dans le document résultat.
– La 3ème s’applique aux commentaires et aux instructions, et elle ne fait
rien.
Un programme minimal (sans règle), produira le contenu textuel du document auquel il s’applique.
Priorité implicite
Intuition : plus c’est « spécifique », plus c’est prioritaire On utilise l’attribut priority.
Priorité 0 : les patterns 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() , * )
Mode
• Permet de guider le processeur dans le choix d’une règle à appliquer.
• En l’absence d’un attribut mode, la règle est
concernée par tout les apply-templates (qui
n’utilisent pas alors leur attribut mode). Sinon, le
mode de la règle et le mode de apply-templates
Algorithme de sélection d’une règle
• Pour un nœud sélectionné par apply-templates, toutes les règles ayant un attribut match sont potentiellement concernées.
– On restreint cette liste aux règles qui ont le même mode que apply-templates (s’il y en a)
– On teste le pattern de l’attribut match pour déterminer si le nœud satisfait la règle
– S’il y a plusieurs règles, on garde celles qui ont la plus grande préséance d’importation (ordre d’importation)
Exemple
1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <FILM> 3 <TITRE>Vertigo</TITRE> 4 <ANNEE>1958</ANNEE><GENRE>Drame</GENRE> 5 <MES>Alfred Hitchcock</MES>6 <RESUME>Scottie Ferguson, ancien inspecteur de 7 police, est sujet au vertige depuis qu’il a vu 8 </RESUME> 9 </FILM> 10 <FILM> 11 <TITRE>Alien</TITRE> 12 <ANNEE>1979</ANNEE><GENRE>Science-fiction</GENRE> 13 <MES>Ridley Scott</MES>
Programme XSLT
Une règle pour <RESUME > qui ne fait rien...
1 <xsl:template match="/"> 2 <xsl:apply-templates/> 3 </xsl:template> 4 5 <xsl:template match="RESUME"/> 6
7 <xsl:template match="@ * |node()" priority="-1"> 8 <xsl:copy>
9 <xsl:apply-templates select="@ * |node()"/> 10 </xsl:copy>
11 </xsl:template>
... moins prioritaire que les autres.
Résultat
Résultat : on obtient tout le document, sauf les nœuds RESUME.
1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <FILM> 3 <TITRE>Vertigo</TITRE> 4 <ANNEE>1958</ANNEE><GENRE>Drame</GENRE> 5 <MES>Alfred Hitchcock</MES> 6 </FILM> 10 <FILM> 11 <TITRE>Alien</TITRE> 12 <ANNEE>1979</ANNEE><GENRE>Science-fiction</GENRE> 13 <MES>Ridley Scott</MES> 14 </FILM>
29
Paramètres
L’élément xsl:param permet de passer des paramètres aux règles. 1. Indiquer (dans la règle) le nom du paramètre et sa valeur par défaut
<xsl:param name=nom select=expression/> Name : nom du paramètre
Select (optionnel) : expression XPath qui donne la valeur par défaut (convertie en chaîne de caractères)
<xsl:template name="message">
<xsl:param name="texte" select="string(salut)" /> <xsl:value-of select= "$texte" />
</xsl:template>
Si l’attribut select est absent, la valeur par défaut est le contenu de l’élément
xsl:param.
Passage de paramètres
Passer des paramètres à une règle :
<xsl:with-param name= "texte" select="string(coucou)"/>
Cet élément suit un call-template ou un apply-templates
<xsl:template match=‘/’>
<xsl:call-template name="message">
<xsl:with-param name="texte" select="string(coucou)" /> </xsl:call-template>
Instructions classiques
<xsl:apply-templates/>
– La liste des nœuds à traiter est constituée des nœuds fils du nœud contexte.
– Appliquer les règles.
<xsl:apply-templates select="p"/>
– La liste des nœuds à traiter est constituée des nœuds atteints par le chemin p depuis le nœud contexte.
– Appliquer les règles.
<xsl:value-of select="p"/>
– Recopier dans le flot de sortie la valeur-chaîne de chaque nœud atteint par le chemin p depuis le nœud contexte.
<xsl:copy-of select="p"/>
– Recopier dans le flot de sortie le fragment du document à transformer dont la racine est le nœud atteint par le chemin p depuis le nœud
contexte.
<xsl:text> t </xsl:text>
Conclusion
XSLT est un langage adapté au traitement de documents XML :
Parcours d’un document vu comme un arbre Déclenchement de règles sur certains nœuds
association de plusieurs programmes à un même document
Bibliographie
• B. Amann et P. Rigaux : Comprendre XSLT, O’Reilly, 2002
Traitement des paramètres
<xsl:param name=‘titre’/> <xsl:param name=‘séance’/> <xsl:param name=‘ville’/> <xsl:template match="MOTEUR"> <xsl:for-each select="CINEMA"> <xsl:if test="CINEMA//TITRE = $titre) and
CINEMA//HEURE >= $seance) and CINEMA/VILLE = $ville)">
<xsl:apply-templates select="." /><p/> </xsl:if>