IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

problème de boucle


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Décembre 2005
    Messages : 117
    Par défaut problème de boucle
    D'abord, bonjour à vous,

    J'ai un petit souçi en xslt. Je vous explique mon problème.
    J'ai une chaine de caractère séparée par des '|'.
    Je voudrai tester chaque champ séparés par le signe '|'.

    j'ai donc déclaré une variable qui me retourne la 1ère sous chaine.
    Mais comment faire pour faire une boucle jusqu'a tester tout, c'est à dire toute la chaine NiveauxAutorise?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:variable name="NiveauxAutorise"><xsl:value-of select="current()/@N" /></xsl:variable> 
       <xsl:choose>
          <xsl:when test="contains($NiveauxAutorise,'|')">
              <xsl:variable name="expressionCoupee"><xsl:value-of select="substring-before($NiveauxAutorise,'|')"/></xsl:variable>
          </when>
          ....
       </xsl:choose>
    Est ce que quelqu'un pourrait m'aider svp ?
    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 83
    Par défaut
    Bonjour,

    Les boucles indexées n'existent pas en XSLT, il faut donc appeller un modèle de traitement de façon récursive.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     <xsl:template name="boucle">
            <xsl:param name="maChaine"/>
     
    <!--mon traitement-->
     
     <xsl:call-template name="boucle">
      <xsl:with-param name="maChaine"> 
      <xsl:value-of select="$maNouvelleSousChaine"/> 
      </xsl:with-param>
     ou
      <xsl:with-param name="maChaine" select="$maNouvelleSousChaine" />
     </xsl:call-template>
    </xsl:template>
    Voilà
    @+
    Xavier

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 83
    Par défaut
    Re,

    Je me suis posé la question de savoir si je ne t'avais pas dis de bétise .

    Donc, j'ai bêtement essayé, voici mon résultat ::

    XML ::
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?xml version="1.0" encoding="UTF-8"?>
    <liste_nombres>
      <nombre>1|2|3|rty|3131231|</nombre>
      <nombre>1|2|3|rty|3131231|</nombre>
      <nombre>1|2|3|rty|3131231</nombre>
      <nombre>1|2|3|rty|3131231</nombre>
      <nombre>a|b|c|d|e|</nombre>
      <nombre></nombre>
    </liste_nombres>
    XSL ::
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output
      method="html"
      encoding="UTF-8"
      doctype-public="-//W3C//DTD HTML 4.01//EN"
      doctype-system="http://www.w3.org/TR/html4/strict.dtd"
      indent="yes" />
     
    <xsl:template match="liste_nombres">
      <html><body>
        <ul>
          <xsl:for-each select="nombre">
           <xsl:call-template name="decoupeChaine">
            <xsl:with-param name="chaine" select="."/>
           </xsl:call-template>
          </xsl:for-each>
        </ul>
      </body></html>
    </xsl:template>
     
    <xsl:template name="decoupeChaine">
    <xsl:param name="chaine"/>
     <xsl:element name="h4">
      <xsl:text>la chaine testee vaut </xsl:text>
      <xsl:value-of select="$chaine"/>
     </xsl:element><!-- END :: H4 -->
      <xsl:call-template name="testChaine">
       <xsl:with-param name="chaineATester" select="substring-before($chaine, '|')"/>
       <xsl:with-param name="chaineRestante" select="substring-after($chaine, '|')"/>
      </xsl:call-template>
    </xsl:template>
     
    <xsl:template name="testChaine">
    <xsl:param name="chaineATester"/>
    <xsl:param name="chaineRestante"/>
     
     <xsl:choose>
      <xsl:when test="$chaineATester='1'">
       <xsl:text>la sous-chaine vaut 1 </xsl:text>
      </xsl:when>
      <xsl:when test="$chaineATester='rty'">
       <xsl:text>la sous-chaine vaut rty </xsl:text>
      </xsl:when>
      <xsl:when test="$chaineATester='3131231'">
       <xsl:text>la sous-chaine vaut 3131231 </xsl:text>
      </xsl:when>
      <xsl:otherwise>
       <xsl:text>la sous-chaine vaut </xsl:text><xsl:value-of select="$chaineATester"/><xsl:text>, et ne répond à aucun des tests</xsl:text>
      </xsl:otherwise>
     </xsl:choose>
     
     <xsl:if test="string-length($chaineRestante)!=0">
      <xsl:call-template name="decoupeChaine">
       <xsl:with-param name="chaine" select="$chaineRestante"/>
      </xsl:call-template>
     </xsl:if>
     
    </xsl:template>
    </xsl:stylesheet>
    Il fait noter le | à la fin dans le XML car la fonction substring-before($chaine, '|') à la dernière itération, ne trouvant pas de | renvoie une chaîne vide.

    Si un aimable contributeur à une proposition plus élégante, je suis preneur.

    Voilà,
    @+
    Xavier

Discussions similaires

  1. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  2. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39
  3. Problème de boucle
    Par TheUltimaSephiroth dans le forum C
    Réponses: 8
    Dernier message: 10/10/2005, 13h58
  4. Problème de boucle
    Par Louis-Guillaume Morand dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/09/2005, 09h10
  5. Problème de boucle
    Par basclln dans le forum C++
    Réponses: 19
    Dernier message: 02/04/2005, 09h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo