IV - Au cœur du langage XSLT
        Structure d'un programme XSLT
                Eléments XSLT, instructions, et instructions de premier niveau
                Règles de transformation
                Forme d'une règle XSLT
                        Modèle de transformation
                        Modèle de transformation littéral
                Un premier exemple de programme XSLT
                Lancement du processeur XSLT
        Principe de fonctionnement d'un processeur XSLT
                Construction - sérialisation
                Les trois phases du processus complet
                Spécification d'une transformation
                Modèle de traitement
                        Traitement du document XML source
                        Traitement d'une liste de nœuds source
                        Traitement d'un nœud source membre d'une liste de nœuds source
                        Instanciation d'un modèle de transformation relativement à un nœud courant et une liste courante
        Motifs (patterns)
                Concordance de motifs
                Recherche de la concordance de motifs (pattern matching)
                Syntaxe et contrainte pour un motif XSLT
                Exemples de motifs
        Priorités entre règles
                Algorithme de calcul des priorités par défaut
                Forçage de la priorité
        Résumé
        Instruction xsl:value-of
                Exemple
                Déroulement du processus de traitement sur cet exemple
                        Constitution d'une liste ne contenant que la racine
                        Traitement de cette liste
                        Traitement du nœud
                        Instanciation du modèle
                        Valeur des différents node-sets
        Instruction xsl:apply-templates
                Exemple
                Déroulement du processus de traitement sur cet exemple
                        Constitution d'une liste ne contenant que la racine
                        Traitement de cette liste
                        Traitement du nœud
                        Instanciation du modèle de transformation
                        Traitement du nœud <Saison>
                        Instanciation du modèle de transformation
                        Première branche du traitement (nœud <Concert>)
                        Deuxième branche du traitement (nœud <Théâtre>)
                        Troisième branche du traitement (nœud <Théâtre>)
                        Synthèse de ces trois traitements indépendants
        Règles par défaut
                Règles par défaut pour la racine d'un arbre XML ou un élément
                Règles par défaut pour un nœud de type text ou attribute
                Règles par défaut pour un nœud de type comment ou processing-instruction
                Exemples
                Comportement inattendu d'un programme XSLT


Chapitre IV - Au cœur du langage XSLT

Structure d'un programme XSLT

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

Eléments XSLT, instructions, et instructions de premier niveau

<?xml version="1.0" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- instructions de premier niveau -->
    ...
    <!-- fin des instructions de premier niveau -->
</xsl:stylesheet>
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    
    <xsl:import href="..."/> 
    <xsl:include href="..."/> 
    <xsl:strip-space elements="..."/> 
    <xsl:preserve-space elements="..."/> 
    <xsl:output method="..."/> 
    <xsl:key name="..." match="..." use="..."/> 
    <xsl:decimal-format name="..."/>
     
    <xsl:namespace-alias 
        stylesheet-prefix="..." 
        result-prefix="..."/> 
    
    <xsl:attribute-set name="..."> 
        ... 
    </xsl:attribute-set> 
    
    <xsl:variable name="...">...</xsl:variable> 
    <xsl:param name="...">...</xsl:param> 
    
    <xsl:template match="..."> 
        ... 
    </xsl:template> 
    
    <xsl:template name="..."> 
        ... 
    </xsl:template> 
    
</xsl:stylesheet>
<?xml version="1.0" encoding="UCS-2"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output  method='html' encoding='ISO-8859-1' />

    <xsl:template match="/">
        <html>
            <head>
                <title><xsl:value-of select="/Concert/Entête"/></title>
            </head>
            <body bgcolor="white" text="black">
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="Entête">
        <p> <xsl:value-of select="."/> présentent </p>
    </xsl:template>
    
    <xsl:template match="Date">
        <H1 align="center"> Concert du <xsl:value-of select="."/> </H1>
    </xsl:template>
    
    <xsl:template match="Lieu">
        <H4 align="center"> <xsl:value-of select="."/> </H4>
    </xsl:template>
    
    <xsl:template match="Ensemble">
        <H2 align="center"> Ensemble <xsl:value-of select="."/></H2>
    </xsl:template>
    
    <xsl:template match="Compositeurs">
        <H3 align="center"> Oeuvres de <br/> <xsl:value-of select="."/> </H3>
    </xsl:template>
    
</xsl:stylesheet>

Règles de transformation

Forme d'une règle XSLT

<xsl:template match="...pattern...">
    <!-- modèle de transformation -->
    ...
    <!-- fin du modèle de transformation -->
</xsl:template>

Modèle de transformation

<!-- modèle de transformation -->
bla bla ...
bla bla ...
<!-- fin du modèle de transformation -->
<!-- modèle de transformation -->
bla bla ... 
ici, une instruction XSLT qui va provoquer l'insertion, 
à cet endroit, de la valeur de l'attribut "nom" de l'élément <personne> 
qui se trouve à tel endroit dans l'arbre XML du document
bla bla ...
<!-- fin du modèle de transformation -->
<!-- modèle de transformation -->
bla bla ... 
insérer ici le contenu de l'élément <description> qui se trouve à
tel endroit dans l'arbre XML du document
bla bla ...
<!-- fin du modèle de transformation -->
<!-- modèle de transformation -->
bla bla ... 
insérer ici la somme des valeurs des attributs "prix" 
des éléments <produit> qui se trouvent à
tels et tels endroits dans l'arbre XML du document
bla bla ...
<!-- fin du modèle de transformation -->
<!-- modèle de transformation -->
<BR/> bla bla ... 
<p>
insérer ici la somme des valeurs des attributs "prix" 
des éléments <produit> qui se trouvent à
tels et tels endroits dans l'arbre XML du document
</p>
<H1>bla bla ...</H1>
<!-- fin du modèle de transformation -->

Modèle de transformation littéral

Exemple
<xsl:template match="...pattern...">
    <!-- modèle de transformation littéral-->
    Détail du rez-de-chaussée :
    <RDC>
        <cuisine surface='12m2'>
            Evier inox. Mobilier encastré.
        </cuisine>
        <WC>
            Lavabo. Cumulus 200L.
        </WC>
        <séjour surface='40m2'>
            Cheminée en pierre. Poutres au plafond. 
            Carrelage terre cuite. Grande baie vitrée.
        </séjour>
    </RDC>
    <!-- fin du modèle de transformation littéral-->
</xsl:template>

Un premier exemple de programme XSLT

Lancement du processeur XSLT

ligne de commande (d'un seul tenant)
java -classpath "C:\Program Files\JavaSoft\SAXON\saxon.jar;"
              com.icl.saxon.StyleSheet  -o Concert.html Concert.xml Concert.xsl

Principe de fonctionnement d'un processeur XSLT

Construction - sérialisation

Les trois phases du processus complet

Spécification d'une transformation

Modèle de traitement

Traitement du document XML source

Traitement d'une liste de nœuds source

Traitement d'un nœud source membre d'une liste de nœuds source

Instanciation d'un modèle de transformation relativement à un nœud courant et une liste courante

Motifs (patterns)

<xsl:template match="child::Théâtre/child::*">
    <!-- modèle de transformation -->
    ...
    <!-- fin du modèle de transformation -->
</xsl:template>
<?xml version="1.0" encoding="UTF-8"?>
<Saison>
    <Concert> 
        <Organisation> Anacréon </Organisation>
        <Date>Samedi 9 Octobre 1999 <Heure> 20H30 </Heure> </Date>
        <Lieu>Chapelle des Ursules</Lieu>
    </Concert> 
    <Théâtre> 
        <Organisation> Masques et Lyres </Organisation>
        <Date>Mardi 19 Novembre 1999 <Heure> 21H </Heure> </Date>
        <Lieu>Salle des Cordeliers</Lieu>
    </Théâtre> 
    <Théâtre> 
        <Organisation> Masques et Lyres </Organisation>
        <Date>Mercredi 20 Novembre 1999 <Heure> 21H30 </Heure> </Date>
        <Lieu>Salle des Cordeliers</Lieu>
    </Théâtre> 
</Saison>

Concordance de motifs

Recherche de la concordance de motifs (pattern matching)

<?xml version="1.0" encoding="UTF-8"?>
<Saison>
    <Concert> 
        <Organisation> Anacréon </Organisation>
        <Date>Samedi 9 Octobre 1999 <Heure> 20H30 </Heure> </Date>
        <Lieu>Chapelle des Ursules</Lieu>
    </Concert> 
    <Théâtre> 
        <Organisation> Masques et Lyres </Organisation>
        <Date>Mardi 19 Novembre 1999 <Heure> 21H </Heure> </Date>
        <Lieu>Salle des Cordeliers</Lieu>
    </Théâtre> 
    <Théâtre> 
        <Organisation> Masques et Lyres </Organisation>
        <Date>Mercredi 20 Novembre 1999 <Heure> 21H30 </Heure> </Date>
        <Lieu>Salle des Cordeliers</Lieu>
    </Théâtre> 
</Saison>

Syntaxe et contrainte pour un motif XSLT

<xsl:template match="...Pattern LocationPath...">
    <!-- modèle de transformation -->
    ...
    <!-- fin du modèle de transformation -->
</xsl:template>

Exemples de motifs

child::chapitre/child::section/child::paragraphe

Forme courte :
chapitre/section/paragraphe
child::chapitre/descendant-or-self::node()/child::paragraphe

Forme courte :
chapitre//paragraphe
chapitre/section | annexe
child::paragraphe/attribute::alignement

Forme courte :
paragraphe/@alignement
paragraphe/processing-instruction()
chapitre/section/paragraphe[@alignement = "centré"]
child::chapitre[following-sibling::annexe]/descendant-or-self::node()/child::paragraphe

Forme courte :
chapitre[following-sibling::annexe]//paragraphe
child::chapitre[position() = last()] | child::annexe

Forme courte :
chapitre[last()] | annexe
<xsl:template select="chapitre/section[ position() &lt; 3 ]">

Priorités entre règles

Algorithme de calcul des priorités par défaut

<xsl:template match="Heure">
    ...
</xsl:template>
<xsl:template match="*">
    ...
</xsl:template>>
<?xml version="1.0" encoding="UTF-8"?>
<Saison>
    <Concert> <Organisation> Anacréon </Organisation>
              <Date>Samedi 9 Octobre 1999 <Heure> 20H30 </Heure> </Date>
              <Lieu>Chapelle des Ursules</Lieu>
              </Concert> 
    <Théâtre> <Organisation> Masques et Lyres </Organisation>
              <Date>Mardi 19 Novembre 1999 <Heure> 21H </Heure> </Date>
              <Lieu>Salle des Cordeliers</Lieu>
              </Théâtre> 
    <Théâtre> <Organisation> Masques et Lyres </Organisation>
              <Date>Mercredi 20 Novembre 1999 <Heure> 21H30 </Heure> </Date>
              <Lieu>Salle des Cordeliers</Lieu>
              </Théâtre> 
</Saison>

Forçage de la priorité

<xsl:template match='Théâtre//Heure' priority="2">
    ...
</xsl:template>
<xsl:template match='Heure' priority="1">
    ...
</xsl:template>

Résumé

<xsl:template match="... motif (pattern) ...">
    <!-- modèle de transformation -->
    ... 
    mélange de texte et d'instructions XSLT du genre
        <xsl:xxx ...> ... </xsl:xxx>
    ...
    <!-- fin du modèle de transformation -->
 </xsl:template> 

Instruction xsl:value-of

<xsl:template match="... motif (pattern) ...">
    <!-- modèle de transformation -->
    ... 
    mélange de texte et
    d'instructions XSLT de la forme :
    
        <xsl:value-of select="... chemin de localisation ..." />
    
    ...
    <!-- fin du modèle de transformation -->
</xsl:template> 

Exemple

Saison.xml
<?xml version="1.0" encoding="UTF-8"?>
<Saison>
    <Concert> 
        <Organisation> Anacréon </Organisation>
        <Date>Samedi 9 Octobre 1999 <Heure> 20H30 </Heure> </Date>
        <Lieu>Chapelle des Ursules</Lieu>
    </Concert> 
    <Théâtre> 
        <Organisation> Masques et Lyres </Organisation>
        <Date>Mardi 19 Novembre 1999 <Heure> 21H </Heure> </Date>
        <Lieu>Salle des Cordeliers</Lieu>
    </Théâtre> 
    <Théâtre> 
        <Organisation> Masques et Lyres </Organisation>
        <Date>Mercredi 20 Novembre 1999 <Heure> 21H30 </Heure> </Date>
        <Lieu>Salle des Cordeliers</Lieu>
    </Théâtre> 
</Saison>
Saison.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
 
    <xsl:output method='text' encoding='UTF-8'/>

    <xsl:template match='/'>
        Date Concert : <xsl:value-of select="Saison/Concert/Date"/>
        Date Théâtre : <xsl:value-of select="Saison/Théâtre[1]/Date"/>
        Date Théâtre : <xsl:value-of select="Saison/Théâtre[2]/Date"/>
    </xsl:template>
    
</xsl:stylesheet>
        Date Concert : Samedi 9 Octobre 1999  20H30  
        Date Théâtre : Mardi 19 Novembre 1999  21H  
        Date Théâtre : Mercredi 20 Novembre 1999  21H30  
<?xml version="1.0" encoding="UTF-8"?>

        Date Concert : Samedi 9 Octobre 1999  20H30  
        Date Théâtre : Mardi 19 Novembre 1999  21H  
        Date Théâtre : Mercredi 20 Novembre 1999  21H30  

Déroulement du processus de traitement sur cet exemple

Constitution d'une liste ne contenant que la racine

Traitement de cette liste

Traitement du nœud

Instanciation du modèle

Valeur des différents node-sets

Node-set "Saison/Concert/Date"
Node-set "Saison/Théâtre[1]/Date
Node-set "Saison/Théâtre[2]/Date

Instruction xsl:apply-templates

<xsl:template match="... motif (pattern) ...">
    <!-- modèle de transformation -->
    ... texte ...
    <xsl:apply-templates />
    ... texte ...
    <!-- fin du modèle de transformation -->
 </xsl:template> 

Exemple

Saison.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
    version   = "1.0">
 
    <xsl:output method='text' encoding='UTF-8'/>

    <xsl:template match='/'>
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match='Saison'>
        Manifestations au programme
        <xsl:apply-templates/>
        Réservations 10 jours avant la date.
    </xsl:template>
    
    <xsl:template match='Concert'>
        Concert : <xsl:value-of select="."/>
    </xsl:template>
    
    <xsl:template match='Théâtre'>
        Théâtre : <xsl:value-of select="."/>
    </xsl:template>
    
</xsl:stylesheet>
    Manifestations au programme
    
    
    Concert :  
         Pygmalion 
        Samedi 9 Octobre 1999  20H30  
        Chapelle des Ursules
     
    
    Théâtre :  
         Masques et Lyres 
        Mardi 19 Novembre 1999  21H  
        Salle des Cordeliers
     
    
    Théâtre :  
         Aristophane 
        Mercredi 20 Novembre 1999  21H30  
        Salle des Cordeliers
     

    Réservations 10 jours avant la date.

Déroulement du processus de traitement sur cet exemple

Constitution d'une liste ne contenant que la racine

Traitement de cette liste

Traitement du nœud

Instanciation du modèle de transformation

Traitement du nœud <Saison>

Instanciation du modèle de transformation

Première branche du traitement (nœud <Concert>)

Traitement du nœud <Concert>
Instanciation du modèle de transformation

Deuxième branche du traitement (nœud <Théâtre>)

Traitement du premier nœud <Théâtre>
Instanciation du modèle de transformation

Troisième branche du traitement (nœud <Théâtre>)

Traitement du deuxième nœud <Théâtre>
Instanciation du modèle de transformation

Synthèse de ces trois traitements indépendants

Règles par défaut

Règles par défaut pour la racine d'un arbre XML ou un élément

<xsl:template match='/|*'>
    <xsl:apply-templates/>
</xsl:template>

Règles par défaut pour un nœud de type text ou attribute

<xsl:template match='text()|attribute::*'>
    <xsl:value-of select = "." />
</xsl:template>

Règles par défaut pour un nœud de type comment ou processing-instruction

<xsl:template match='comment() | processing-instruction()'>
</xsl:template>

Exemples

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
    version   = "1.0">
 
    <xsl:output method='text' encoding='UTF-8'/>

</xsl:stylesheet>
         Anacréon 
        Samedi 9 Octobre 1999  20H30 
        
        Chapelle des Ursules
    
    
         Masques et Lyres 
        Mardi 19 Novembre 1999  21H 
        
        Salle des Cordeliers
    
    
         Masques et Lyres 
        Mercredi 20 Novembre 1999  21H30 
        
        Salle des Cordeliers
<xsl:template match='/|*'>
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match='/|*'>
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match='/|*'>
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match='/|*'>
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match='text()|attribute::*'>
    <xsl:value-of select = "." />
</xsl:template>
<xsl:template match='/|*'>
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match='text()|attribute::*'>
    <xsl:value-of select = "." />
</xsl:template>
Saison.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
 
    <xsl:output method='text' encoding='UTF-8'/>

    <xsl:template match='/'>
        Date Concert : <xsl:value-of select="Saison/Concert/Date"/>
        Date Théâtre : <xsl:value-of select="Saison/Théâtre[1]/Date"/>
        Date Théâtre : <xsl:value-of select="Saison/Théâtre[2]/Date"/>
    </xsl:template>
    
</xsl:stylesheet>
Saison.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
    version   = "1.0">
 
    <xsl:output method='text' encoding='ISO-8859-1'/>
    
    <xsl:template match='Concert'>
        Date Concert : <xsl:value-of select="Date"/>
    </xsl:template>
    
    <xsl:template match='Théâtre'>
        Date Théâtre : <xsl:value-of select="Date"/>
    </xsl:template>
    
</xsl:stylesheet>
        Date Concert : Samedi 9 Octobre 1999  20H30 
        
    
        Date Théâtre : Mardi 19 Novembre 1999  21H 
        
    
        Date Théâtre : Mercredi 20 Novembre 1999  21H30

Comportement inattendu d'un programme XSLT

Saison.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" 
    version   = "1.0">
 
    <xsl:output method='text' encoding='ISO-8859-1'/>
    
    <xsl:template match='Concert'>
        Date Concert : <xsl:value-of select="Date"/>
    </xsl:template>
    
    <xsl:template match='Théatre'>
        Date Théâtre : <xsl:value-of select="Date"/>
    </xsl:template>
    
</xsl:stylesheet>
        Date Concert : Samedi 9 Octobre 1999  20H30 
        
    
         Masques et Lyres 
        Mardi 19 Novembre 1999  21H 
        
        Salle des Cordeliers
    
    
         Masques et Lyres 
        Mercredi 20 Novembre 1999  21H30 
        
        Salle des Cordeliers
<xsl:template match='*'>
    erreur : élément non prévu : tag{ <xsl:value-of select="local-name(.)" /> }             
    <xsl:apply-templates/>
</xsl:template>
<xsl:template match='/|*'>
    <xsl:apply-templates/>
</xsl:template>
        erreur : élément non prévu : tag{ Saison }              
        Date Concert : Samedi 9 Octobre 1999  20H30 
    
        erreur : élément non prévu : tag{ Théâtre }             
        
        erreur : élément non prévu : tag{ Organisation }                
         Masques et Lyres 
        
        erreur : élément non prévu : tag{ Date }                
        Mardi 19 Novembre 1999 
        erreur : élément non prévu : tag{ Heure }               
         21H 
        
        erreur : élément non prévu : tag{ Lieu }                
        Salle des Cordeliers
    
        erreur : élément non prévu : tag{ Théâtre }             
        
        erreur : élément non prévu : tag{ Organisation }                
         Masques et Lyres 
        
        erreur : élément non prévu : tag{ Date }                
        Mercredi 20 Novembre 1999 
        erreur : élément non prévu : tag{ Heure }               
         21H30 
        
        erreur : élément non prévu : tag{ Lieu }                
        Salle des Cordeliers
Conclusion
preceding-sibling::*[1] Table following-sibling::*[1]