Discussion sur le style de programmation en XSLT

illustrée par un exemple

On a le choix entre

  1. programmer par règles, en fignolant les filtres
  2. utiliser les structures de contrôle (conditionnelles & boucles, voire procédures...)
    ce qui ramène à un style plus traditionnel.
Ce choix n'est pas toujours évident !
c'est affaire de goût, mais aussi de facilité de lecture et de maintenance.
Pour bien saisir la différence, supposons que, dans l'exemple ci-après,
on veuille modifier le traitement commun à toutes les étapes en ajoutant une ligne horizontale :

Exemple simple traité en style...

  1. par règles (fichier Menu1.xsl)

    <!-- ============ Traitement au niveau "étape" ============== -->

    <xsl:template match="liste/étape[@nom='apéritif']">
        <h3 id='apéritif'><i>Apéritifs</i></h3>
        <blockquote>
           <xsl:apply-templates select="*"/>
         </blockquote>
    </xsl:template>

    <xsl:template match="liste/étape[@nom='entrée']">
        <h3 id='apéritif'><i>Les entrées</i></h3>
        <blockquote>
           <xsl:apply-templates select="*"/>
         </blockquote>
    </xsl:template>

    <xsl:template match="liste/étape[@nom='plat']">
        <h3 id='apéritif'><i>Les plats</i></h3>
        <blockquote>
           <xsl:apply-templates select="*"/>
         </blockquote>
    </xsl:template>

    <xsl:template match="liste/étape[@nom='dessert']">
        <h3 id='apéritif'><i>Les desserts</i></h3>
        <blockquote>
           <xsl:apply-templates select="*"/>
         </blockquote>
    </xsl:template>


    <!-- ===== Traitement au niveau "intérieur à l'étape" ===== -->

    <xsl:template match="choix">
      <p><xsl:value-of select="."/></p>
    </xsl:template>

    <xsl:template match="annonce">
        <!-- ne rien faire -->
    </xsl:template>




  2. par la conditionnelle "choose" (fichier Menu2.xsl)


    <!-- ============ Traitement au niveau "étape" ============== -->

    <xsl:template match="liste/étape">
        <xsl:choose>
              <xsl:when test="@nom='apéritif'">
                 <h3 id='apéritif'><i>Apéritifs</i></h3>
              </xsl:when>
              <xsl:when test="@nom='entrée'">
                 <h3 id='entrée'><i>Les entrées</i></h3>
              </xsl:when>
              <xsl:when test="@nom='plat'">
                 <h3 id='plat'><i>Les plats</i></h3>
              </xsl:when>
              <xsl:when test="@nom='dessert'">
                 <h3 id='dessert'><i>Les desserts</i></h3>
              </xsl:when>
        </xsl:choose>
         <blockquote>
           <xsl:apply-templates select="./*"/>
         </blockquote>
    </xsl:template>

    <!-- ===== Traitement au niveau "intérieur à l'étape" ===== -->

    <xsl:template match="choix">
      <p><xsl:value-of select="."/></p>

    </xsl:template>


    <xsl:template match="annonce">
        <!-- ne rien faire -->
    </xsl:template>