Forum Programmation.web Problème dans un template XSLT

Posté par .
Tags : aucun
0
24
fév.
2006
Bonjour (enfin bonsoir mais bon ce sera sûrement bonjour quand vous lirez ça :)),

Je mets au point actuellement un template xslt pour mon site, et je débute dans le domaine.
Je suis confronté à un problème où l'usage de variables au sens courant des langages de programmation m'aurait été utile, mais comme cela n'existe pas en XSLT, et comme je ne vois pas d'autres solutions, je me tourne vers vous ...

J'ai un fichier XML que je veux transformer dont voici un morceau type (je ne mets que le morceau important, et des [ ] à la place de < >)


[games]
[game]
[title]Sonic The Hedgehog[/title]
[/game]
[game]
[title]Super Mario World[/title]
[/game]
[/games]



Le morceau de XSLT correspondant est celui-là :

[xsl:template match="games"]
[div id="gamesWrapper"]
[xsl:apply-templates select="game"]
[xsl:sort order="ascending" select="title" /]
[/xsl:apply-templates]
[/div]
[/xsl:template]

[xsl:template match="game"]
[xsl:if test="not($filter) or (not($number) and starts-with(title,$letter)) or ($number and starts-with(translate(title, '0123456789', '9999999999'), '9'))"]
[div class="game"]
blablablabla
[/div]
[/xsl:if]
[/xsl:template]


Voilà donc en gros, si la condition est remplie, on crée un div pour le jeu, sinon on ne fait rien ...

Le problème est que je voudrais pouvoir faire un div annonçant qu'il n'y a aucun résultat dans le cas où la condition if ne soit jamais remplie et donc, qu'on affichera aucun jeu ...

Au début je m'étais dit "c'est simple, faisons une variable booléenne, et puis on la change dès qu'on est entré dans le if" mais ce n'est de toute évidence pas possible ...
Alors comment faire ?

Merci
  • # Effectivement

    Posté par . Évalué à 3.

    Ce n'est pas possible.
    Tu ne peux pas modifier une variable en XSL (langage fonctionel => pas d'effet de bord ...).

    Une façon de faire est de compter le nombre de noeuds qui satisfont ta condition, formulée sous le forme d'un prédicat XPath.
    Puis tu fait un xsl:choose contennant un xsl:when pour le cas ou la variable vaut zéro et un dans l'autre cas.

    en gros:

    <code>
    <xsl:variable name="yenA">
    <xsl:value-of select="count(//game[starts-with(./title, $letter)][other predicates])"/>
    </xsl:variable>


    <xsl:template match="/">
    <xsl:choose>
    <xsl:when test="$yenA = 0">
    Non, rien de rien ...
    </xsl:when>
    <xsl:when test="$yenA != 0">
    <xsl:apply-templates select="//B"/>
    </xsl:when>
    </xsl:choose>
    </xsl:template>

    </code>
    • [^] # Re: Effectivement

      Posté par . Évalué à 0.

      Je croit que si c'est juste histoire de choper le premier noeud y'a une fonction first().


      <xsl:template match="/">
      <xsl:if test="not first()">
      <xsl:apply-templates select="//B"/>
      </xsl:if>
      </xsl:template>

    • [^] # Re: Effectivement

      Posté par . Évalué à 1.

      Oui oui je sais bien qu'on peut pas modifier la variable (c'est ce que j'ai essayé d'exprimer, c'était p'tet pas clair :))

      Mais je peux mettre mes 3 conditions dans le prédicat XPATH ?

      Et puis je trouve ça un peu bête de devoir refaire tourner une condition, mais bon si ya pas d'autres solutions ...

      Merci
    • [^] # Re: Effectivement

      Posté par . Évalué à 1.

      Merci beaucoup, je suis parvenu à faire ce que je voulais grâce à toi (modulo une ou deux modifs ;))

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.