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 d'affichage redondant (genre boucle)


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    EJ
    EJ est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut Problème d'affichage redondant (genre boucle)
    Bon ne m'incendiez pas, j'ai vu qu'il y avait eu plein de réponses sur les boucles, avec les templates tout ça, mais ce n'est pas mon seul problème.
    Voilà en fait je génére des étiquettes que les étudiants colleront sur leur copies (pour l'anonymat): elles ont le numéro d'anonymat et son code barre correspondant (c'est lu avec des douchettes comme au supermarket )
    Donc je voudrais qu'on puisse imprimer la planches des étiquettes de l'étudiant. Sauf que le problème, c'est que pour un étudiant je n'imprime pas forcément le même nombre d'étiquettes, c'est selon le nombre d'épreuves qu'il doit passer.
    Admettons que le nombre d'étiquettes à imprimer est nb_etq
    Je pourrais lui dire de répéter l'étiquette nb_etq fois
    Mais RDM avait l'air de dire que ce n'est pas logique comme manière de procéder. Or si je les mets nb_etq fois dans le xml, ça va alourdir méchament mon fichier? Parce qu'il y en a à chaque fois à peu près 100, des étudiants, si pour chacun c'est 30 fois les 2 numéros... En plus je sais même pas si je pourrais le mettre plusieurs fois, ça suffit d'écrire SELECT MACHIN, MACHIN, MACHIN...? Sachant que le nombre de MACHIN correspond à une autre requête il faudrait que je lies les requêtes et là c'est la requête qui va devenir grave lourde...
    Bref, je ne sais pas trop quelle solution employer.
    En plus de ça je vais mettre 3 étiquettes par lignes, donc je vais devoir tester sans arrêt à combien d'étiquettes j'en suis, j'ai essayé le code devient assez vide bricolé-dégueulasse...

    Voilà, si quelqu'un peut quelque chose pour moi, merci d'avance!

  2. #2
    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
    remet en forme,personnellement je ne comprends pas tout. ton fichier est-il de cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <liste>
    <etudiant nb_etq='2'>
    <nom>pierre<nom>
     
    <prenom>paul</prenom>
    <num_anonymat>100</num_anonymat>
    <code_barre>*********</code_barre>
     
    </etudiant >
    ....
    </liste>

  3. #3
    EJ
    EJ est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    En gros oui, sauf que nb_etq je ne l'ai pas dans le même noeud mais dans un autre, parce que je le compte dans une autre requête, donc flemme = réutilisation
    C'est bon tu débrouilles mon charabia?

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <liste> 
    <etudiant>
    <nb_etq>2</nb_etq> 
    <nom>pierre<nom> 
     
    <prenom>paul</prenom> 
    <num_anonymat>100</num_anonymat> 
    <code_barre>*********</code_barre> 
     
    </etudiant > 
    .... 
    </liste>
    par exemple?
    et tu veux imprimer la totalite avec le bon nombre par etudiant?
    une idee comme ca(pas teste donc attention aux erreurs de syntaxe)
    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
    ....
    <xsl:apply-templates select="liste/etudiant"/>
     
    ...
     
    <xsl:template match='etudiant'>
    <xsl:call-template name='nb_impression'>
      <xsl:with-param name='noeud' select='.'/>
      <xsl:with-param name='nombre' select='nb_etq'/>
    <xsl:call-template>
     
    .....code pour aller a la ligne je presume?
    </xsl:template>
     
    <xsl:template name='nb_impression'>
      <xsl:param name='noeud' />
      <xsl:param name='nombre' />
    <xsl:call-template name='imprimer'>
      <xsl:with-param name='noeud' select='$noeud'/>
    </xsl:call-template>
    <xsl:if test='$nombre&gt;0'>
    <xsl:call-template name='nb_impression'>
      <xsl:with-param name='noeud' select='.'/>
      <xsl:with-param name='nombre' select='$nombre-1'/>
    </xsl:call-template>
    </xsl:if>
    </xsl:template>
     
    <xsl:template name='imprimer'>
    <xsl:param name='noeud' />
    ben je sais pas comment t'imprime une etiquette alors????
    </xsl:template>

  5. #5
    EJ
    EJ est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Heu je pige pas bien ton code... Tu appeles quoi avec le template "imprimer"?
    Nb_etq, c'est le nombre d'étiquettes que je veux coller dans le tableau (enfin dans le tableau je veux mettre nb_etq+1 étiquettes mais c'est pareil)
    Donc je veux que code_anonymat et code_tranformé soient affichés nb_etq+1 fois. Pour l'instant je ne travaille qu'avec 1 seul étudiant présélectionné.
    Mais comme je les veux dans un tableau, mon problème c'est la gestion des retours à la ligne (avec le <tr>)
    J'ai voulu mettre la fermeture du <tr> dans le test: je demande que lorsque le reste de la division modulo 3 donne 0, il affiche </tr> pour fermer la ligne puis <tr> pour rouvrir la suivante. Mais bon le problème c'est que pour XMLSpy j'ai un document mal formé...

  6. #6
    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
    nb:erreur editer le truc du haut

    voila d'apres ce que j'ai compris:
    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
     
    ....
    <xsl:apply-templates select="liste/etudiant"/> 
     
    ... 
     
    <xsl:template match='etudiant'> 
    <tr>
    <xsl:call-template name='nb_impression'> 
      <xsl:with-param name='noeud' select='.'/> 
      <xsl:with-param name='nombre' select='number(nb_etq)+1'/> 
    </tr>
    <xsl:call-template> 
     
    .....code pour aller a la ligne je presume? 
    </xsl:template> 
     
    <xsl:template name='nb_impression'> 
      <xsl:param name='noeud' /> 
      <xsl:param name='nombre' /> 
    <xsl:call-template name='imprimer'> 
      <xsl:with-param name='noeud' select='$noeud'/> 
    </xsl:call-template> 
    <xsl:if test='$nombre&gt;0'> 
    <xsl:call-template name='nb_impression'> 
      <xsl:with-param name='noeud' select='.'/> 
      <xsl:with-param name='nombre' select='$nombre-1'/> 
    </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 
     
    <xsl:template name='imprimer'> 
    <xsl:param name='noeud' /> 
    <td>
    ben je sais pas comment t'imprime une etiquette alors???? 
    <xsl:value-of select='num_anonymat'>
    <br/>
    <xsl:value-of select='code_barre'>
    </td>
    </xsl:template>

  7. #7
    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 EJ
    J'ai voulu mettre la fermeture du <tr> dans le test: je demande que lorsque le reste de la division modulo 3 donne 0, il affiche </tr> pour fermer la ligne puis <tr> pour rouvrir la suivante. Mais bon le problème c'est que pour XMLSpy j'ai un document mal formé...
    j'avais pas compris que tu voulais aller a la ligne tous les 3 etiquettes en effet ca change un peu le code mais je ne comprends pas bien comment tu l'organise avec plusieurs etudiants tu pourrais mettre un exemple de ce que tu veux avec 2-3 etudiants dont au moins 1 a plus de 3 etiquette
    (pas besoin de mettre les balises juste une idee des colonnes et des lignes)

  8. #8
    EJ
    EJ est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Bon je mets pas l'image parce que j'ai rien au bureau et donc c'est du bmp, même en 16 couleurs ça fait 100Ko donc le lien c'est mieux
    http://verennes.univ-tln.fr/telechargement/appli_anonymat.bmp
    En fait dans cette page, je n'ai qu'un seul étudiant, justement.
    Comme tu le vois sur l'image, j'affiche une fois son nom et pis paf les étiquettes, sur plusieurs lignes (dans l'exemple il n'y a qu'une ligne, c'est parce que je travaille dessus, justement ).
    Mon problème, c'est que certains étudiants passent 30 épreuves donc on leur donne une feuille entière, d'autres passent 6 épreuves donc on leur fait que la moitié d'une feuille... c'est pour ça que je dois tester chaque fois que j'appelle cette page quel est le nb_etq à imprimer...
    Et pour ma manière d'imprimer, ben heu j'affiche et après l'utilisateur fait "imrpimer", tu crois pas que j'ai codé un truc pour que l'imprimante se lance toute seule, non?

  9. #9
    EJ
    EJ est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Bon j'ai réfléchis
    Je me demande si ça serait pas plus simple de couper mon nombre d'étiquettes en nb_lignes et nb_reste
    nb_lignes= nb_etq+1 div 3 (donc le nombre de lignes "entières" à 3 étiquettes)
    nb_reste= nb_etq+1 mod 3 (1 ou 2 le nombre d'étiquettes à rajouter)

    du coup j'aurais un code de ce style dans un template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tant que i >= nb_lignes
    debut
    <tr>
    <td> mes valeurs </td> <td> mes valeurs </td> <td> mes valeurs </td> 
    </tr>
    fin
    d'une part et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    si nb_reste diff 0
    tant que u>=nb_reste 
    <td> mes valeurs </td>
    ok je sais là c'est à peine de l'algo mais j'ai déjà assez de mal à conceptualiser pour ne pas aller m'embrouiller dans les templates en plus
    Tu en penses quoi?

  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
    bon avec cette structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <liste> 
    <etudiant>
    <nb_etq>2</nb_etq> 
    <nom>pierre<nom> 
     
    <prenom>paul</prenom> 
    <num_anonymat>100</num_anonymat> 
    <code_barre>*********</code_barre> 
     
    </etudiant > 
    .... 
    </liste>
    code pour le premier etudiant(apres c'est une histoire de parametre)
    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
    ....
    <xsl:call-template name='etudiant>
    <xsl:with-param name='etud' select='liste/etudiant[1]'/>
    </xsl:call-template>
     
    <xsl:template name='etudiant'>
    <xsl:param name='etud' />
    nom prenom:
    <xsl:value-of select='concat($etud/nom,' ',$etud/prenom)/> 
    <br/> 
    ........
    numerod'anonymat:
    <xsl:value-of select='num_anonymat'/> 
     
    <table>
    <xsl:call-template name='nb_impression'>
      <xsl:with-param name='noeud' select='$etud'/>
      <xsl:with-param name='nombre' select='number(nb_etq)+1'/>
     <xsl:with-param name='alaligne' select='1'/>
    <xsl:call-template>
    </table>
    </xsl:template>
     
    <xsl:template name='nb_impression'>
      <xsl:param name='noeud' />
      <xsl:param name='nombre' />
      <xsl:param name='alaligne' />
    <xsl:if test="alaligne mod 3=1">
    <xsl:text><tr></xsl:text>
    </xsl:if> 
    <xsl:call-template name='imprimer'>
      <xsl:with-param name='noeud' select='$noeud'/>
    </xsl:call-template>
    <xsl:if test="alaligne mod 3=0">
    <xsl:text></tr></xsl:text>
    </xsl:if> 
     
    <xsl:if test='$nombre&gt;0'>
    <xsl:call-template name='nb_impression'>
      <xsl:with-param name='noeud' select='.'/>
      <xsl:with-param name='nombre' select='$nombre-1'/>
    <xsl:with-param name='alaligne' select='alaligne mod 3'/>
    </xsl:call-template>
    </xsl:if>
    </xsl:template>
     
    <xsl:template name='imprimer'>
    <xsl:param name='noeud' />
    <td> 
    <xsl:value-of select='num_anonymat'> 
    <br/> 
    <xsl:value-of select='code_barre'> 
    </td> 
     
    </xsl:template>
    il y aune option a actiber/desactiver dans les xsl:text et je ne sait plus s'il ne faut pas remplacer les <> des tr par &lt;&gt;
    enfin c'est l'idee

  11. #11
    EJ
    EJ est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    J'ai testé ta réponse, pour laquelle je te remercie beaucoup.
    Mais c'est toujours le même problème, il crise parce que le <tr> d'ouverture et le </tr> de fermeture sont séparés...
    Heu sinon vu qu'il y avait une ou 2 erreurs qui ont fait hurler XMLSpy, j'en déduis que tu codes au bloc-note... Ca te gonfle pas?
    Et ton activer/desactiver j'ai trouvé sur le site du W3C
    disable-output-escaping yes/no (optional)
    "yes" indicates that special characters (like "<") should be output as is.
    "no" indicates that special characters (like "<") should be output as "&lt;". Default is "no".
    Mais en clair jai pas pigé ce que je devais faire... Si je mets les tests avec ">" et "<" et que je dis rien (donc par défaut c'est non disabled) XMLSpy réclame le code (&lt; &gt
    Ca veut dire que si je mets "yes" je pourrais écrire directement "<" et ">"?

  12. #12
    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
    j'ai deja utilise ce truc mais il y a lgt donc j'ai du mal a me souvenir des details

    je crois qu'il faut que tu ecrive &lt;tr&gt; et apres ca doit etre yes qu'il faut mettre comme ca dans le code xslt il ne le voit pas comme une balise mais une fois le code produit il l'indique comme tel

    je n'ai pas acces a internet sur mon post de travail donc la je n'ai en effet aucun outils(et comme le code est assez simple et que tu as xmlspy pour verifier.... )

  13. #13
    EJ
    EJ est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    C'était pas une critique, c'était de l'admiration pour 1°) ta patience pour en taper autant en bloc-note, 2°) le peu de fautes que j'ai récupérées...
    Bon... Et sinon pour ce <tr> ben je crois que je vais faire mon modulo et mon div, je galère un peu dans les variables mais je l'aurais!

  14. #14
    EJ
    EJ est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 84
    Par défaut
    Alors voilà où j'en suis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:variable name="nb_lignes">15</xsl:variable>
    <xsl:variable name="i" select="0"></xsl:variable>
    En haut de mon doc, je déclare mes variables en global parce que je ne veux pas avoir de problème avec les noeuds et tout ça (j'ai lu quelque chose à ce sujet ici )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:call-template name="boucle_etq"><xsl:with-param name="i" select="0"/></xsl:call-template>
    est l'appel de la "boucle"
    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
    <xsl:template name="boucle_etq"> 
    	<xsl:param name="i" select="0"/>
    		<xsl:if test="$i &lt; $nb_lignes"> 	
    		 <tr>
    		    <td>
    		       <xsl:value-of select="ETIQUETTE/ANO_NUM"/>
    		    </td>
    		    <td>
    		       <xsl:value-of select="ETIQUETTE/ANO_NUM"/>
    		    </td>
    			<td>
    				<xsl:value-of select="ETIQUETTE/ANO_NUM"/>
    			</td>
    		</tr>
    		<tr>
    			<td class="clBarreCode">
    				<xsl:value-of select="ETIQUETTE/ANO_NUM_TRANS"/>
    			</td>
    			<td class="clBarreCode">
    				<xsl:value-of select="ETIQUETTE/ANO_NUM_TRANS"/>
    			</td>
    			<td class="clBarreCode">
    				<xsl:value-of select="ETIQUETTE/ANO_NUM_TRANS"/>
    			</td>
    		</tr>
    			<xsl:call-template name="boucle_etq"> 
    				<xsl:with-param name="i" select="number($i)+1"/> 
    			</xsl:call-template> 
    			</xsl:if>
    </xsl:template>
    est le code qui me permet d'afficher à chaque fois le numéro et le numéro dans la police de code barre.
    C'est bon, merci à tous ceux qui ont répondu un peu partout dans le forum et qui m'ont permis de m'inspirer de leurs réponses

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

Discussions similaires

  1. [2.x] [Twig][Formulaire] Problème d'affichage avec une boucle
    Par ccomarvin dans le forum Symfony
    Réponses: 1
    Dernier message: 31/01/2013, 10h57
  2. [MySQL] Problème d'affichage de requete en boucle
    Par yorosouk dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/03/2008, 17h42
  3. [MySQL] Problème d'affichage dans un boucle while
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/05/2007, 08h31
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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