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 :

Boucle infinie xsl


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut Boucle infinie xsl
    Bonjour ami(e)s développeurs,
    Je souhaite chercher une sous-chaine dans une chaine (Je voudrais chercher les retours chariot et les remplacer par des </br>.
    J'ai cherché sur le net et j'ai trouvé une façon pour faire mais ça fait planter mon programme.
    Voilà comment j'ai procédé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <!-- récuperer la chaine et appeler la méthode de traitement-->       
           <xsl:for-each select="./attribut[@nom='compteRendu']" >
                 <xsl:call-template name="convertCrToBr">                
                     <xsl:with-param name="texte">
                            <xsl:value-of select="./compteRendu"/>
                     </xsl:with-param>  
                  </xsl:call-template>     
           </xsl:for-each>
    Pour l'instant, je tente de remplacer la chaine 'ligne' par la chaine 'modification'
    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 name="convertCrToBr">
            <xsl:param name="texte"/>
     
            <xsl:variable name="strARemplacer">
            <xsl:value-of select="ligne" />
            </xsl:variable>
     
            <xsl:variable name="strRemplacerPar">
            <xsl:value-of select="modification" />
            </xsl:variable>
     
            <xsl:choose>
                <xsl:when test="contains($texte,$strARemplacer)">
                    <xsl:value-of select="substring-before($texte,$strARemplacer)"/>
                    <xsl:value-of select="$strRemplacerPar"/>
                    <xsl:call-template name="convertCrToBr">
                        <xsl:with-param name="texte" select="substring-after($texte,$strARemplacer)"/>            
                    </xsl:call-template>
                </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$texte"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:template>
    Le soucis c'est que j'ai une exception de ce genre : Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError


    J'ai l'impression que j'ai une boucle infinie mais je ne trouve pas.
    Je vous remercie pour votre aide.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Dude.
    Comme l'a sûrement indiqué le gars qui t'a filé ce code, il faut remplacer "ligne" et "modification" par ce qui compte comme une fin de ligne, et ce que tu veux mettre à la place.

    Dans le cas présent, vu que tu veux mettre un <br/>, il ne faudra pas utiliser value-of. Il faut le mettre tel que dans la variable strRemplacerPar, et utiliser <xsl:copy-of> au lieu de <xsl:value-of> pour l'écrire sur la séparation.

    Enfin bon, il faudrait essayer de comprendre comment ça marche, en fait.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut
    Bonjour,
    A vrai dire je ne comprends pas grand chose malgré toute ma volonté. J'ai tenté cette expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:value-of select="translate($lettre, '
    ', '&lt;br/&gt;')"/>
    mais j'ai des '<' à la place de mes retours chariots.
    Avez-vous une idée, je galère depuis hier.
    Merci bcp.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Translate ne peut pas t'aider. Ça ne peut que remplacer un caractère par un autre, et toi tu veux remplacer un caractère par une balise. Rien à voir.

    Citation Envoyé par allouchi Voir le message
    A vrai dire je ne comprends pas grand chose malgré toute ma volonté.
    Le code que tu as montré au début est proche de la solution. Il faut juste l'adapter à ton cas.
    Le plus simple, c'est d'étudier comment ça marche, petit bout par petit bout.

    Ça, là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:variable name="strARemplacer">
      <xsl:value-of select="ligne" />
    </xsl:variable>
    Est-ce que tu comprends ce que ça fait ?
    Si oui, on passe à la suite.
    Si non, il faut que tu étudies tes tutoriels, à propos de <xsl:variable>, de <xsl:value-of> et de XPath dans le cas où on lui passe un truc genre "ligne".
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut
    Merci pour ta réponse,
    Pour moi le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:variable name="strARemplacer">
      <xsl:value-of select="ligne" />
    </xsl:variable>
    Veut dire initialiser la variable (en d'autres langages ) String strARemplacer = "ligne";

    Est-ce bien ça?
    Merci.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut
    En gros je dois faire comme ça :
    Méthode :
    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
     
    <xsl:template name="convertCrToBr">
            <xsl:param name="texte"/>        
            <xsl:variable name="strARemplacer">
                <xsl:copy-of select="ligne" />
            </xsl:variable>
     
            <xsl:variable name="strRemplacerPar">
                <xsl:copy-of select="modification" />
            </xsl:variable>
     
            <xsl:choose>
                <xsl:when test="contains($texte,$strARemplacer)">
                    <xsl:value-of select="substring-before($texte,$strARemplacer)"/>
                    <xsl:value-of select="$strRemplacerPar"/>
                    <xsl:call-template name="convertCrToBr">
                        <xsl:with-param name="texte" select="substring-after($texte,$strARemplacer)"/>            
                    </xsl:call-template>
                </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$texte"/>
            </xsl:otherwise>
          </xsl:choose>
    </xsl:template>
    et l'appel comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     <xsl:variable name="chaineModif">
    	<xsl:call-template name="convertCrToBr">
    		<xsl:with-param name="lettre">					
                        <xsl:for-each select="./attribut[@nom='compteRendu']" >  
                            <xsl:value-of select="./compteRendu"/>
                        </xsl:for-each>         
    		</xsl:with-param>                           
    	</xsl:call-template>            
    </xsl:variable>    
     <!-- pour l'affichage des résultats -->        
    <xsl:value-of select="$chaineModif"/>
    Merci pour ton aide.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par allouchi Voir le message
    Veut dire initialiser la variable (en d'autres langages ) String strARemplacer = "ligne";

    Est-ce bien ça?
    Pas vraiment. <xsl:value-of> fonctionne partout pareil, que ce soit dans une variable ou ailleurs.

    Or ça fait quoi, <xsl:value-of select="ligne"/> ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Pas vraiment. <xsl:value-of> fonctionne partout pareil, que ce soit dans une variable ou ailleurs.

    Or ça fait quoi, <xsl:value-of select="ligne"/> ?
    ça doit sélectionner l'élément et l'afficher à l'écran.
    C'est ça?

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut
    J'ai adapté mon code mais cette fois-ci j'ai directement des <br/> à l'écran :
    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
     
    <xsl:template name="convertCrToBr">        
          <xsl:param name="text"/>
          <xsl:param name="replace"/>
          <xsl:param name="with"/>
          <xsl:choose>
            <xsl:when test="contains($text,$replace)">
              <xsl:value-of select="substring-before($text,$replace)"/>
              <xsl:value-of select="$with"/>
              <xsl:call-template name="convertCrToBr">
                <xsl:with-param name="text" select="substring-after($text,$replace)"/>
                <xsl:with-param name="replace" select="$replace"/>
                <xsl:with-param name="with" select="$with"/>
              </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
              <xsl:value-of select="$text"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:template>
    et je l'appelle comme ç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
    16
    17
     
     
     
    <xsl:variable name="chaineModif">
    	<xsl:call-template name="convertCrToBr">
    		<xsl:with-param name="text">					
                        <xsl:for-each select="./attribut[@nom='compteRendu']" >  
                            <xsl:value-of select="./compteRendu"/>
                        </xsl:for-each>         
    	</xsl:with-param>                
             <xsl:with-param name="replace" select="'
    '"/>
             <xsl:with-param name="with" select="'&lt;br /&gt;'"/>                            
    	</xsl:call-template>            
    	 </xsl:variable>    
            <!-- pour l'affichage --> 
    	 <xsl:value-of select="$chaineModif"/>

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Ouaip, tu as réglé le problème des fins de ligne, et avec lui la récursion infinie.
    C'est bien.

    Maintenant, il reste à les remplacer par des <br/>.
    <br/> n'est pas un texte, c'est une balise. Tu ne peux pas le créer en faisant un select.
    À la place il faut la mettre directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:with-param><br/></xsl:with-param>
    Et comme je l'ai déjà dit, pour envoyer les balises, il ne faut pas faire xsl:value-of, mais xsl:copy-of.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ouaip, tu as réglé le problème des fins de ligne, et avec lui la récursion infinie.
    C'est bien.

    Maintenant, il reste à les remplacer par des <br/>.
    <br/> n'est pas un texte, c'est une balise. Tu ne peux pas le créer en faisant un select.
    À la place il faut la mettre directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:with-param><br/></xsl:with-param>
    Et comme je l'ai déjà dit, pour envoyer les balises, il ne faut pas faire xsl:value-of, mais xsl:copy-of.
    Tu veux dire à l'appel de la fonction?
    comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:variable name="chaineModif">
    	<xsl:call-template name="convertCrToBr">
    		<xsl:with-param name="text">					
                        <xsl:for-each select="./attribut[@nom='compteRendu']" >  
                            <xsl:copy-of select="./compteRendu"/>
                        </xsl:for-each>         
    	</xsl:with-param>                
              <xsl:with-param name="replace" select="'
    '"/>
             <xsl:with-param name="with"><br/></xsl:with-param>                           
    	</xsl:call-template>            
    </xsl:variable>

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut
    Je sèche et je n'arrive pas à trouver la solution. Mes retours chariot sont supprimés et remplacés par rien du tout.
    Tu peux me donner un coup de main, je te remercie pour ton aide.

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par allouchi Voir le message
    Tu veux dire à l'appel de la fonction?
    comme ça :
    C'est quoi, ce truc ?
    Non.

    Je veux dire, dans ta fonction, tu fais <xsl:value-of select="$with"/>. Ça ne peut pas marcher. value-of n'envoie que du texte, pas des balises.
    Pour les balises, c'est <xsl:copy-of>

    Citation Envoyé par allouchi Voir le message
    Je sèche et je n'arrive pas à trouver la solution. Mes retours chariot sont supprimés et remplacés par rien du tout.
    Tu peux me donner un coup de main, je te remercie pour ton aide.
    Du calme, s'il te plaît, on me paie pas pour t'aider. On me laisse le faire quand j'ai rien d'autre à faire, mais ce n'est que de temps en temps.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut
    Déjà un grand merci pour ta dispo.

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 152
    Par défaut Résolu
    thelvin : écoute tout simplement merci sans ton aide, je y serai encore.
    ça marche et pour peut-être d'autre qui galèrent comme moi, je poste la solution 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
    16
     
     
    <!-- récuperer la chaine --> 
            <xsl:variable name="chaineModif">
    			<xsl:call-template name="convertCrToBr">
    				<xsl:with-param name="text">					
                        <xsl:for-each select="./attribut[@nom='compteRendu']" >  
                            <xsl:copy-of select="./compteRendu"/>
                        </xsl:for-each>         
    				</xsl:with-param>                
                    <xsl:with-param name="replace" select="'
    '"/>
                    <xsl:with-param name="with"><br/></xsl:with-param>                           
    			</xsl:call-template>            
    		 </xsl:variable>         
    		 <xsl:copy-of select="$chaineModif"/>
    et la méthode qui fait le changement est :
    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
     
     
     <xsl:template name="convertCrToBr">        
          <xsl:param name="text"/>
          <xsl:param name="replace"/>
          <xsl:param name="with"/>
          <xsl:choose>
            <xsl:when test="contains($text,$replace)">
              <xsl:copy-of select="substring-before($text,$replace)"/>
              <xsl:copy-of select="$with"/>
              <xsl:call-template name="convertCrToBr">
                <xsl:with-param name="text" select="substring-after($text,$replace)"/>
                <xsl:with-param name="replace" select="$replace"/>
                <xsl:with-param name="with" select="$with"/>
              </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
              <xsl:copy-of select="$text"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:template>
    Encore merci.

  16. #16
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Très honnêtement, on ne peut pas se servir de ce genre de code sans le comprendre grosso-modo.

    Mais bon, merci d'avoir donné la version finale.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [XSL] Boucle infinie dû à une utilisation de "contains"
    Par nicolas.pied dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 25/09/2009, 11h01
  2. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 13h10
  3. Réponses: 15
    Dernier message: 24/05/2005, 09h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 15h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 01h04

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