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 :

[XSLT] Utilisation d'une "boucle"


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut [XSLT] Utilisation d'une "boucle"
    bonjour,
    j'ai une question à propos de ce tuto xslt.
    http://haypo.developpez.com/tutoriel...mation/#LIII.A

    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
    <xsl:template name="boucle">
      <xsl:param name="debut" select="0" />
      <xsl:param name="fin" select="0" />
     
      <xsl:text>i = </xsl:text>
      <xsl:value-of select="$debut" />
      <br/>
     
      <xsl:if test="$debut < $fin">
        <xsl:call-template name="boucle">
          <xsl:with-param name="debut" select="($debut)+1" />
          <xsl:with-param name="fin" select="$fin" />
        </xsl:call-template>
      </xsl:if>
    </xsl:template>
    Le probleme c'est que je ne sais pas l'utiliser.
    j'ai enregistré ce code dans un fichier lib.xslt

    dans ma feuille j'importe la librairie qui contient les fonctions ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:include href="lib.xslt"/>
    puis je l'utilise ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:call-template name="boucle">
    <xsl:with-param name="debut" select="0" />
    <xsl:with-param name="fin" select="$nb_rows" />
    // là je fais le traitement ????
    </xsl:call-template>
    Le problème c'est que ça ne marche pas et je ne sais pas pourquoi..
    Aussi comment récupérer l'element courant i dans cette boucle?
    grand merci à celui qui m'aidera...je continue de chercher de mon côté.

    Cassy.

  2. #2
    Membre émérite
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Par défaut
    je pense pas que tu as compris.

    ton traitement il faut le faire ICI

    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
    <xsl:template name="boucle">
      <xsl:param name="debut" select="0" />
      <xsl:param name="fin" select="0" />
      
      <xsl:text>i = </xsl:text>
      <xsl:value-of select="$debut" />
      <br/>
    ICI
      <xsl:if test="$debut < $fin">
        <xsl:call-template name="boucle">
          <xsl:with-param name="debut" select="($debut)+1" />
          <xsl:with-param name="fin" select="$fin" />
        </xsl:call-template>
      </xsl:if>
    </xsl:template>
    et quand tu souhaite faire deux fois ton traitement tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:call-template name="boucle">
    <xsl:with-param name="debut" select="0" />
    <xsl:with-param name="fin" select="1" />
    </xsl:call-template>

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    je pensais utiliser "boucle" comme une fonction d'une librairie qu'on pourrais appeller plusieurs fois pour faire des traitement différents dans la même feuille xsl...

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    je pense à trouver un moyen de contourner le problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <table border="0" cellspacing="0" cellpadding="0">
      <tr>
       <xsl:for-each select=".">
        <td>
          <table>
            ...
          </table>
         </td>
         <xsl:if test="position() mod 3 =0">
           </tr><tr> (* corrigé)
         </xsl:if>
       </tr>
    </table>

    En gros je veux que toutes les 3 cellules il crée une nouvelle ligne au tableau.
    Le probleme c'est qu'il n'aime pas mes j'ai essayé rien à faire...ça m'affiche bien mais pas interpreté comme étant du code HTML mais comme un string...une idée?

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Par défaut
    c normal

    tes tr sont au mauvais endroit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <table border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td>
          <table>
            ...
          </table>
         </td>
    
           <tr></tr>
    
       </tr>
    </table>
    ici tu imbrique des <tr> ce qui n'est pas correct en html. un tr doit avoir comme parent direct un <table>!

    peux tu envoyer ton xsl complet?

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    j'ai supprimé car ça t'aurais fait perdre ton temps...
    je repost + tard...
    je retente avec les boucles car sans l'algo est faux.

    EDIT:
    J'ai fait pourtant comme tu avais dis pour les boucles...ça ne marche toujours pas...
    vois-tu où est l'erreur?

    le xml ressemble à ça:
    (fruits est un exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <root>
     <fruits>
      <fruit></fruit>
      <fruit></fruit>
      <fruit></fruit>
      <fruit></fruit>
      <fruit></fruit>
     </fruits>
    </root>
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:template match="/">
    		<xsl:variable name="nb_fruits"
    			select="count(root/fruits/fruit)" />
    		<input type="hidden" name="nb_fruits" value="{$nb_fruits}" />
     
    		<xsl:if test="$nb_fruits &gt; 0">
    			<table border="0" cellspacing="0" cellpadding="0">
    				<xsl:choose>
    					<xsl:when test="$nb_fruits mod 3 =0">
    						<xsl:variable name="nb_rows"
    							select="$nb_fruits div 3" />
    						<input type="hidden" name="nb_rows"
    							value="{$nb_rows}" />
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:variable name="nb_rows"
    							select="ceiling($nb_fruits div 3)" />
    						<input type="hidden" name="nb_rows"
    							value="{$nb_rows}" />
    					</xsl:otherwise>
    				</xsl:choose>
     
     
    				<xsl:call-template name="boucle">
    					<xsl:with-param name="debut" select="0" />
    					<xsl:with-param name="fin" select="$nb_rows" />
    				</xsl:call-template>
     
    			</table>
    		</xsl:if>
     
    		<script type="text/javascript"
    			src="js/listeFruitsCallback.js">
    		</script>
    	</xsl:template>
     
     
    	<xsl:template name="boucle">
    		<xsl:param name="debut" select="0" />
    		<xsl:param name="fin" select="0" />
     
    		<xsl:text>i =</xsl:text>
    		<xsl:value-of select="$debut" />
     
    		<tr>
     
    			<xsl:for-each select="root/fruits/fruit">
    				<xsl:variable name="fruits_id" select="fruits_id" />
    				<xsl:variable name="fruits_name"
    					select="fruits_name" />
     
     
    				<td width="190">
    					<table name="vignetteToClick">
    						<tr>
    							<td align="center">
    								<a>
    									<img
    										src="source"
    										alt='alt' />
    								</a>
    							</td>
    						</tr>
    						<tr>
    							<td align="center" bgcolor="#FFFFFF">
    								<a>
    									<xsl:value-of
    										select="fruits_name" />
    								</a>
    								<br />
    								<b>
    									<xsl:value-of
    										select="fruits_price" />
    								</b>
    							</td>
    						</tr>
    					</table>
    				</td>
    				<input type="hidden" name="fruits_id"
    					value="{$fruits_id}" />
    			</xsl:for-each>
     
    		</tr>
     
    		<xsl:if test="$debut &lt; $fin">
    			<xsl:call-template name="boucle">
    				<xsl:with-param name="debut" select="($debut)+1" />
    				<xsl:with-param name="fin" select="$fin" />
    			</xsl:call-template>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
    merci pour ta patience.
    Cassy

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    bon j'ai trouvé pourquoi ça ne marchait pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:with-param name="fin" select="$nb_rows" />
    on ne peut pas mettre une variable ici?
    pourquoi en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:with-param name="fin" select="2" />
    ça marche ?

    pourtant $nb_rows vaut bien 2 dans le champ hidden:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="nb_rows" value="{$nb_rows}" />
    une idée?

    edit: comment récupérer une variable d'un autre template?

  8. #8
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    tu declare tes variables au mauvais endroit d'ou disparition de celle-ci , une variable est locale au noeud ou elle est déclarée > tutoriel variable xslt

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    ton lien est mort.

    le pb c'est que pour calculer cette variable j'ai besoin du match="/"...
    je pensais initiliser cette variable au dessus du match="/" pour qu'elle soit connu des deux templates...
    puis de redefinir cette variable dans le template principal pour la réutiliser dans le second template "boucle"...
    mais visiblement on ne peut pas redefinir une variable...

  10. #10
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    Citation Envoyé par cassy
    ton lien est mort.
    problème de serveur


    Dans ton cas on est obligé de passer par une varaible type fragment node (quand le lien refonctionnera va jeter un oeil, c'est pas hypersimple à résumer les variables )

    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
    <xsl:template match="/">
    	<xsl:variable name="nb_fruits" select="count(root/fruits/fruit)"/>
    	<input type="hidden" name="nb_fruits" value="{$nb_fruits}"/>
    	<xsl:if test="$nb_fruits &gt; 0">
    		<table border="0" cellspacing="0" cellpadding="0">
    			<xsl:variable name="nb_rows">
    				<xsl:choose>
    					<xsl:when test="$nb_fruits mod 3 =0">
    						<xsl:xsl:value-of select="$nb_fruits div 3"/>
    					</xsl:when>
    					<xsl:otherwise>
    						<xsl:value-of select="ceiling($nb_fruits div 3)"/>
    					</xsl:otherwise>
    				</xsl:choose>
    			</xsl:variable>
    			<input type="hidden" name="nb_rows" value="{number($nb_rows)}"/>
    			<xsl:call-template name="boucle">
    				<xsl:with-param name="debut" select="0"/>
    				<xsl:with-param name="fin" select="number($nb_rows)"/>
    			</xsl:call-template>
    		</table>
    	</xsl:if>
    	<script type="text/javascript" src="js/listeFruitsCallback.js">
    		</script>
    </xsl:template>

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    merci beaucoup!

+ Répondre à la discussion
Cette discussion est résolue.

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