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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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