TD 10: XSLT

Rappels / Outils

Exercice : Calcul et xsl:call-template

  1. Que fait points.xslt lorsqu’il est appliqué à points.xml ?
    points.xml points.xslt
    <points>
      <semaine>
        <jour>1</jour>
        <jour>3</jour>
        <jour>2</jour>
        <jour>1</jour>
      </semaine>
      <semaine>
        <jour>2</jour>
        <jour>8</jour>
        <jour>20</jour>
      </semaine>
      <semaine>
        <jour>1</jour>
        <jour>3</jour>
      </semaine>
    </points>
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
      <xsl:output method="text"/>
    
      <xsl:template match="/">
        <xsl:apply-templates select="*/*"/>
      </xsl:template>
      
      <xsl:template match="*">
        <xsl:text>Il y a </xsl:text>
        <xsl:call-template name="comptage">
          <xsl:with-param name="total">0</xsl:with-param>
          <xsl:with-param name="index_courant">1</xsl:with-param>
        </xsl:call-template>
        <xsl:text> points cette semaine.&#xa;</xsl:text>    
      </xsl:template>
      
      <xsl:template name="comptage">
        <xsl:param name="total"/> 
        <xsl:param name="index_courant"/> 
        <xsl:choose> 
          <xsl:when test="$index_courant = count(*) + 1"> 
            <xsl:value-of select="$total"/>
          </xsl:when> 
          <xsl:otherwise> 
            <xsl:variable name="un_nombre"><xsl:value-of select="*[position() = $index_courant]"/></xsl:variable>
            <xsl:call-template name="comptage"> 
              <xsl:with-param name="total"><xsl:value-of select="$total + $un_nombre"/></xsl:with-param> 
              <xsl:with-param name="index_courant"><xsl:value-of select="$index_courant + 1"/></xsl:with-param> 
            </xsl:call-template> 
          </xsl:otherwise>
        </xsl:choose>
      </xsl:template>
    
    </xsl:stylesheet>

  2. Modifiez points.xslt pour qu'il affiche deux nouvelles lignes:
    Attention! Faites-le sans utiliser foreach ni une library externe! On peut tout faire comme l'exemple, à coup de template. C'est l'objet du TD!

    RENDU: 1.2.xsl

  3. Refaites la question précédente, sans utiliser count()!
    Et toujours sans foreach ni library.

    RENDU: 1.3.xsl

  4. Ajoutez l'affichage du nombre maximal de points obtenu en un jour.
    Et toujours sans foreach ni library.

    RENDU: 1.4.xsl

  5. Ajoutez l'affichage de la variance du nombre de points par jour.
    Et toujours sans foreach ni library.

    RENDU: 1.5.xsl

  6. Ecrivez maintenant votre propre fichier XSLT, qui transforme points.xml en un autre fichier XML (en sortie standard), où les balises <jour> sont recopiées, de manière à ce que le(s) jour(s) avec le maximum de points aient un attribut remarque="max", et que les autres jours aient un attribut remarque="plus" ou remarque="moins" selon leur position par rapport à la moyenne.
    Et toujours sans foreach ni library.

    RENDU: 1.6.xsl

Corrigé