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 :

Saut de ligne automatique dans la boucle foreach [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Points : 177
    Points
    177
    Par défaut Saut de ligne automatique dans la boucle foreach
    Bonjour,

    Je viens vers vous aujourd'hui car je rencontre un problème de saut de ligne automatique.

    En effet, je me suis aperçu qu'a chaque boucle de mon foreach un saut de ligne est effectué.

    Auriez-vous une idée pour qu'aucun saut de ligne ne soit effectué?


    Mon document XSL me sert à transformer un document XML en .text.

    Mon doc.xsl :
    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="ISO-8859-1"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="no"/>
    <xsl:template match="/">
    <xsl:for-each select="Portion/Lignes/Ligne/Données">
    M707000  VE000<xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  D      <xsl:value-of select="./Donnée[@Nom='VenteHTPretAPorter']"/>                                                         VE
    M445710  VE000<xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  D      <xsl:value-of select="./Donnée[@Nom='MontantTVA']"/>                                                         VE
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    et le résultat obtenu apres traitement (c'est un .txt):


    M707000 VE00003052011 JOURNEE 03/05/2011 D 1050.17 VE
    M445710 VE00003052011 JOURNEE 03/05/2011 D 187.89 VE

    M707000 VE00004052011 JOURNEE 04/05/2011 D 570.24 VE
    M445710 VE00004052011 JOURNEE 04/05/2011 D 100.49 VE

    M707000 VE00005052011 JOURNEE 05/05/2011 D 959.87 VE
    M445710 VE00005052011 JOURNEE 05/05/2011 D 172.08 VE

  2. #2
    Membre habitué Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Points : 177
    Points
    177
    Par défaut
    J'ai trouver une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="ISO-8859-1"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="no"/>
    <xsl:template match="/">
    <xsl:for-each select="Portion/Lignes/Ligne/Données">M707000  VE000<xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  D      <xsl:value-of select="./Donnée[@Nom='VenteHTPretAPorter']"/>                                                         VE
    M445710  VE000<xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  D      <xsl:value-of select="./Donnée[@Nom='MontantTVA']"/>                                                         VE
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    Par contre je ne trouve pas cela très propre donc si vous avez une solution moins "bricolage" je suis preneur..

    (je laisse donc le fil en "non-résolu" pendant quelque temps)

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    C'est à cause de la fin de ligne entre <xsl:for-each> et M707000 VE000 ; et de la fin de ligne entre VE et </xsl:for-each>. Ça fait une fin de ligne au début, une fin de ligne à la fin, donc deux fins de ligne, donc saut de ligne.

    Il faudrait encadrer tes textes littéraux de <xsl:text> ... </xsl:text> pour éviter ça.
    Ce qui va enlever toutes les fins de lignes. Pour en remettre, un truc genre &#xA; là où tu veux une fin de ligne.

  4. #4
    Membre habitué Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Points : 177
    Points
    177
    Par défaut
    Héhé encore merci à toi thelvin !

    Cela fonctionne parfaitement .

  5. #5
    Membre habitué Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Points : 177
    Points
    177
    Par défaut
    Je réouvre mon post car j'ai une question d'organisation encore :

    je voudrais que mon document XSLT soir plus lisible. Je l'ai donc organiser comme ceci :

    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
    <xsl:output method="text"/>
    <xsl:template match="/">
     
     
    <xsl:for-each select="Portion/Lignes/Ligne/Données">
    	<xsl:choose>
    		<xsl:when test="contains(./Donnée[@Nom='VenteHTPretAPorter'], '-')=true">
    			<xsl:text>M707000  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  D<xsl:value-of select="substring(concat(' ','                '),1,13 - string-length(./Donnée[@Nom='VenteHTPretAPorter']))"/><xsl:value-of select="./Donnée[@Nom='VenteHTPretAPorter']"/>                                                         VE
    			<xsl:text>M445710  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  D<xsl:value-of select="substring(concat(' ','                '),1,13 - string-length(./Donnée[@Nom='MontantTVA']))"/><xsl:value-of select="./Donnée[@Nom='MontantTVA']"/>                                                         VE
    			<xsl:if test="./Donnée[@Nom='RemiseHTPretAPorter']!=0">
    				<xsl:text>M707900  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  C<xsl:value-of select="substring(concat(' ','                '),1,13 - string-length(./Donnée[@Nom='RemiseHTPretAPorter']))"/><xsl:value-of select="./Donnée[@Nom='RemiseHTPretAPorter']"/>                                                         VE
    			</xsl:if>
    		</xsl:when>
    		<xsl:when test="contains(./Donnée[@Nom='VenteHTPretAPorter'], '-')=false">
    			<xsl:text>M707000  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  C<xsl:value-of select="substring(concat(' ','                '),1,14 - string-length(./Donnée[@Nom='VenteHTPretAPorter']))"/><xsl:value-of select="translate(./Donnée[@Nom='VenteHTPretAPorter'],'-', '')"/>                                                         VE
    			<xsl:text>M445710  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  C<xsl:value-of select="substring(concat(' ','                '),1,14 - string-length(./Donnée[@Nom='MontantTVA']))"/><xsl:value-of select="./Donnée[@Nom='MontantTVA']"/>                                                         VE
    			<xsl:if test="./Donnée[@Nom='RemiseHTPretAPorter']!=0">
    				<xsl:text>M707900  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/> JOURNEE <xsl:value-of select="./Donnée[@Nom='DateFacture']"/>  D<xsl:value-of select="substring(concat(' ','                '),1,13 - string-length(./Donnée[@Nom='RemiseHTPretAPorter']))"/><xsl:value-of select="./Donnée[@Nom='RemiseHTPretAPorter']"/>                                                         VE
    			</xsl:if>
    		</xsl:when>
    	</xsl:choose>
    </xsl:for-each>
    </xsl:template>
    Le problème est que dans mon fichier texte, les lignes sont décalés à part la 1ere.

    Un exemple est plus parlant :

    M707000 VE00006052011 JOURNEE 30/30/2030 D 607.02 VE
    M445710 VE00006052011 JOURNEE 30/30/2030 D 107.39 VE
    M707900 VE00006052011 JOURNEE 30/30/2030 C 59.11 VE
    M707000 VE00007052011 JOURNEE 30/30/2030 D 1086.96 VE

    (ps: il n'y a cependant aucun saut de ligne entre la 1er et la 2ème ligne dans mon fichier texte.)

    Je voudrais que toutes les lignes soit aligner sans avoir de décalement.
    Est-ce possible?

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Tu n'as pas mis de <xsl:text> autour de VE.
    Comme je te l'ai déjà dit, mets <xsl:text> autour de tous tes textes. Ce qui te permettra d'ailleurs d'éclater tout ça sur plusieurs lignes.

  7. #7
    Membre habitué Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Points : 177
    Points
    177
    Par défaut
    Bonjour,

    J'ai mis les balises <xsl:text> autour de tout mes texte brut.

    Voici donc un bout de mon 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
    <?xml version="1.0" encoding="ISO-8859-1"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
     
     
    <xsl:template name="FormatNombre">
    	<xsl:param name="nombre" select="0" />
    	<xsl:param name="compte" select="0"/>
    	<xsl:param name="etat"/>
     
    	<xsl:choose>
    		<xsl:when test="string-length(substring-after($nombre, '.'))=0">
    			<xsl:text>M</xsl:text><xsl:value-of select="$compte"/>
    			<xsl:text>  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/>
    			<xsl:text> JOURNEE </xsl:text><xsl:value-of select="./Donnée[@Nom='DateFacture']"/>
    			<xsl:text>  </xsl:text><xsl:value-of select="$etat"/><xsl:value-of select="substring(concat(' ','                '),1,10 - string-length($nombre))"/><xsl:value-of select="concat($nombre, '.00')"/>                                                         VE
    		</xsl:when>
    		<xsl:when test="string-length(substring-after($nombre, '.'))=1">
    			<xsl:text>M</xsl:text><xsl:value-of select="$compte"/>
    			<xsl:text>  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/>
    			<xsl:text> JOURNEE </xsl:text><xsl:value-of select="./Donnée[@Nom='DateFacture']"/>
    			<xsl:text>  </xsl:text><xsl:value-of select="$etat"/><xsl:value-of select="substring(concat(' ','                '),1,12 - string-length($nombre))"/><xsl:value-of select="concat($nombre, '0')"/>                                                        VE
    		</xsl:when>
    		<xsl:when test="string-length(substring-after($nombre, '.'))=2">
    			<xsl:text>M</xsl:text><xsl:value-of select="$compte"/>
    			<xsl:text>  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/>
    			<xsl:text> JOURNEE </xsl:text><xsl:value-of select="./Donnée[@Nom='DateFacture']"/>
    			<xsl:text>  </xsl:text><xsl:value-of select="$etat"/><xsl:value-of select="substring(concat(' ','                '),1,13 - string-length($nombre))"/><xsl:value-of select="$nombre"/>                                                        VE
    		</xsl:when>
    	</xsl:choose>
    </xsl:template>	
     
     
     
    <xsl:template match="/">
    	<xsl:for-each select="Portion/Lignes/Ligne/Données">
    		<xsl:choose>
    			<xsl:when test="contains(./Donnée[@Nom='VenteHTPretAPorter'], '-')=0">
    				<xsl:if test="./Donnée[@Nom='VenteHTPretAPorter']!=0">
    					<xsl:call-template name="FormatNombre">
    						<xsl:with-param name="nombre" select="./Donnée[@Nom='VenteHTPretAPorter']"/>
    						<xsl:with-param name="compte" select="707000"/>
    						<xsl:with-param name="etat" select="'D'"/>
    					</xsl:call-template>
    				</xsl:if>
     
                                        ....
    J'ai toujours un problème de mise en forme de mon texte. A savoir un décalage des lignes (sauf la première).

    (edit : Je n'ai pas mis le 'VE' entre les balise <xsl:text> car je souhaite qu'il y ait une retour à la ligne après celui-ci. Le problème vient surement de là.)

    Encore merci.

  8. #8
    Membre habitué Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Points : 177
    Points
    177
    Par défaut
    J'ai trouver la solution. Il suffit de rajouter
    avec des balises <xsl:text> au VE final afin que la ligne soit sauté.

    Mon code pour être plus explicite :

    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
    <xsl:template name="FormatNombre">
    	<xsl:param name="nombre" select="0" />
    	<xsl:param name="compte" select="0"/>
    	<xsl:param name="etat"/>
     
    	<xsl:choose>
    		<xsl:when test="string-length(substring-after($nombre, '.'))=0">
    			<xsl:text>M</xsl:text><xsl:value-of select="$compte"/>
    			<xsl:text>  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/>
    			<xsl:text> JOURNEE </xsl:text><xsl:value-of select="./Donnée[@Nom='DateFacture']"/>
    			<xsl:text>  </xsl:text><xsl:value-of select="$etat"/><xsl:value-of select="substring(concat(' ','                '),1,10 - string-length($nombre))"/><xsl:value-of select="concat($nombre, '.00')"/><xsl:text>                                                         VE
    </xsl:text>
    		</xsl:when>
    		<xsl:when test="string-length(substring-after($nombre, '.'))=1">
    			<xsl:text>M</xsl:text><xsl:value-of select="$compte"/>
    			<xsl:text>  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/>
    			<xsl:text> JOURNEE </xsl:text><xsl:value-of select="./Donnée[@Nom='DateFacture']"/>
    			<xsl:text>  </xsl:text><xsl:value-of select="$etat"/><xsl:value-of select="substring(concat(' ','                '),1,12 - string-length($nombre))"/><xsl:value-of select="concat($nombre, '0')"/><xsl:text>                                                        VE
    </xsl:text>
    		</xsl:when>
    		<xsl:when test="string-length(substring-after($nombre, '.'))=2">
    			<xsl:text>M</xsl:text><xsl:value-of select="$compte"/>
    			<xsl:text>  VE000</xsl:text><xsl:value-of select="translate(./Donnée[@Nom='DateFacture'], '/', '')"/>
    			<xsl:text> JOURNEE </xsl:text><xsl:value-of select="./Donnée[@Nom='DateFacture']"/>
    			<xsl:text>  </xsl:text><xsl:value-of select="$etat"/><xsl:value-of select="substring(concat(' ','                '),1,13 - string-length($nombre))"/><xsl:value-of select="$nombre"/><xsl:text>                                                        VE
    </xsl:text>
    		</xsl:when>
    	</xsl:choose>
    </xsl:template>

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    &#xA; te répugne donc à ce point ?
    Il y a une raison particulière à ça ?

    Tu sais, il est aussi possible de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="'&#xA;'"/>
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:variable name="end-of-line">&#xA;</xsl:variable>
     
    <!-- et plus loin -->
     
    <xsl:value-of select="$end-of-line"/>

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

Discussions similaires

  1. saut à la ligne automatique dans un textview
    Par nurenai dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 09/02/2009, 17h46
  2. retour à la ligne automatique dans un TCanvas
    Par richard038 dans le forum API, COM et SDKs
    Réponses: 12
    Dernier message: 27/03/2006, 21h39
  3. Retour à la ligne automatique dans les div
    Par Delphy113 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 15/02/2006, 10h42
  4. détecter le nbre de saut de ligne (VbCrLf) dans un textarea
    Par yoda_style dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/04/2005, 14h54
  5. Insérer une ligne automatiquement dans une autre tab
    Par davyd dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/03/2005, 17h08

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