XSLT : structures de contrôle


Conditionnelle
  • Si condition alors instruction 
    Il n'y a pas d'instruction xsl:else. Pour une traduction de la conditionnelle "si alors sinon", on peut écrire :
    <xsl:if test="cond">instr si vrai</xsl:if>
    <xsl:if test="not(cond)">instr si faux</xsl:if>
    ou utiliser plutôt l'instruction choose.
<xsl:if test="expression booléenne XPath"> 
    instructions
</xsl:if>
  • Si condition1alors instruction1
    sinon si condition2 alors instruction2
    ...
    sinon instruction par défaut

    Le processeur évalue dans l'odre les conditions et instancie un bloc d'instruction dès qu'une condition est vraie. Si les conditions ne sont pas exclusives (si plusieurs conditions sont vraies), seul le bloc correspondant à la première condition vérifiée est instancié.
    Dans le cas où toutes les conditions sont fausses et qu'un élément otherwise (facultatif) est présent, le bloc d'instructions correspondant est instancié.
<xsl:choose>
    <xsl:when test="expr_bool1"> 
        instr1
    </xsl:when>
    <xsl:when test="expr_bool2"> 
        instr2
    </xsl:when>
    ...
    <xsl:otherwise> 
        instr_defaut
    </xsl:otherwise>
</xsl:choose>

Boucle
  • Pour tout  élément tel que (expression XPath) faire instructions
    Cette structure crée la liste des éléments qui satisfont certaines conditions (exprimées dans l'expression XPath) et instancie le bloc d'instruction en faisant en sorte qu'un nouvel élément de la liste devienne l'élément courant à chaque itération.
<xsl:for-each test="expression XPath"> 
    instructions
</xsl:for-each>
  • Tri
    La liste des éléments créée par une instruction for-each peut être triée.
    Dans la syntaxe ci-contre, l'attribut select spécifie sur quel élément doit porter le tri (souvent un élément fils, mais pas nécessairement). Cet attribut est facultatif, de même que l'arttibut order qui indique si le tri doit être croissant ou décroissant.
    Une même instruction for-each peut comporter plusieurs instructions sort.
<xsl:for-each test="expression XPath"> 
    <xsl:sort select="xpath" order="ascending|descending"/>
    instructions
</xsl:for-each>

Exemples
  • Choix multiple : voir l'exemple "génération de HTML"
  • Itération et tri :
    XML    XSL
    <liste-seminaires>
        <seminaire>
            <desc>
                <titre>Communauté, un terme polémique ?</titre>
                <salle>D31</salle>
            </desc>
            <date>
                <jour>06</jour>
                <mois>01</mois>
            </date>
        </seminaire>
        <seminaire>
            <desc>
                <titre>Théorie Sens-Texte. La base de données DiCo</titre>
                 <salle>D30</salle>
            </desc>
            <date>
                <jour>25</jour>
                <mois>02</mois>
            </date>
        </seminaire>
        <seminaire>
            <desc>
                <titre>Structuration XML pour la fouille de données textuelles</titre>
                <salle>D155</salle>
            </desc>
            <date>
                <jour>07</jour>
                <mois>04</mois>
             </date>
        </seminaire>
    </liste-seminaires>
       <xsl:template match="/">
        <xsl:for-each select="//titre">
            <xsl:sort select="../../date/mois" order="descending"/>
            <xsl:sort select="../../date/jour" order="descending"/>

            <xsl:apply-templates select="../../date"/> :
             <xsl:value-of select="."/>
            <xsl:text>
            </xsl:text>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="date">
        <xsl:value-of select="jour"/>/<xsl:value-of select="mois"/>
    </xsl:template>

    Résultat   
    07/04 : Structuration XML pour la fouille de données textuelles
    25/02 : Théorie Sens-Texte. La base de données DiCo
    06/01 : Communauté, un terme polémique ?
    Remarque : en présence de plusieurs instructions sort, l'ordre dans lequel elles apparaîssent est important. Dans l'exemple ci-dessus, si les deux éléments sort avaient été inversés, les séminaires auraient été triés d'abord par jour, puis par mois.

Précédent... ] Sommaire... ] Suivant... ]