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 :

transformer mon fichier xml en .txt avec pour séparateur des pipes


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut transformer mon fichier xml en .txt avec pour séparateur des pipes
    Bonjour,

    Débutant dans le xsl je voudrais savoir comment faire pour transformer mon fichier xml qui est assez long en fichier texte avec pour séparateur un pipe et d retour à la ligne pour une nouvelle entrer

    Je vous remercie d'avance

  2. #2
    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
    En lisant des petits tutoriels sur XSLT, en essayant des choses et d'autres, et en venant nous montrer ce que tu obtiens, pour demander comment améliorer.

  3. #3
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut xsl
    j'ai pu donc avancer sur mes recherches et j'ai pu créer mon xsl

    monxsl.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
    <?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="html" encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd" indent="yes" />
     
     <xsl:output method="text"/>
     
     <xsl:variable name="newLine" select="translate('&#xa;','','')"/> 
     
     
     <xsl:template match="submits">
     
      <xsl:value-of select="$newLine" />
      <xsl:apply-templates select="*" />
     </xsl:template>
     
     <xsl:template match="submit">
       <!-- Recuperation des informations du fichier XML -->
       <xsl:variable name="submit-id" select="./submit-id" />
       <xsl:variable name="submit-date" select="./submit-date" />
      <pre> <xsl:variable name="response" select="./response"/></pre>
     
     
       <!-- Generation du contenu -->
       <xsl:value-of select="$submit-id"/>
       <xsl:text>|</xsl:text>
       <xsl:value-of select="$submit-date"/>
       <xsl:text>|</xsl:text>
       <xsl:value-of select="$response"/>
       <xsl:text>¤¤</xsl:text>
      <!-- <xsl:value-of select="$newLine" />-->
     </xsl:template>
     
    </xsl:stylesheet>
    et voici mon xml

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="formulaire_xsl.xsl"?>
    <submits>
    <submit>
    <submit-id>2</submit-id>
    <submit-date>15/02/12</submit-date>
    <submit-ip/>
    <questions>
    <question>
    <question-title><![CDATA[Raison Sociale ]]></question-title>
    <responses>
    <response><![CDATA[Test]]></response>
    </responses>
    </question>
    <question>
    <question-title><![CDATA[Votre société est une : ]]></question-title>
    <responses>
    <response><![CDATA[EF]]></response>
    </responses>
    </question>
    <question>
    <question-title><![CDATA[Forme Juridique entreprise française]]></question-title>
    <responses>
    <response><![CDATA[1200]]></response>
    </responses>
    </submit>
    </submits>
    Mon problème est que je n'arrive pas à afficher le contenu de mes réponses

    Je vous remercie d'avance

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    C'est normal car dans ton XSL tu considères que l'élément "response" est un fils de "submit", au même titre que "submit-id" ou "submit-date" or ce n'est pas du tout le cas dans ton XML :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="formulaire_xsl.xsl"?>
    <submits>
    	<submit>
    		<submit-id>2</submit-id>
    		<submit-date>15/02/12</submit-date>
    		<submit-ip />
    		<questions>
    			<question>
    				<question-title><![CDATA[Raison Sociale ]]></question-title>
    				<responses>
    					<response><![CDATA[Test]]></response>
    				</responses>
    			</question>
    			<question>
    				<question-title><![CDATA[Votre société est une : ]]></question-title>
    				<responses>
    					<response><![CDATA[EF]]></response>
    				</responses>
    			</question>
    			<question>
    				<question-title><![CDATA[Forme Juridique entreprise française]]></question-title>
    				<responses>
    					<response><![CDATA[1200]]></response>
    				</responses>
    			</question>
    		</questions>
    	</submit>
    </submits>
    Tu vas devoir faire un <apply-templates select="descendant::response"/> ou bien un <xsl:for-each select="descendant::response"> pour parcourir tous les éléments response.

  5. #5
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut xsl
    Merci pour ta réponse elle m'a permis de bien avancée
    donc j'ai refait mon code

    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
     
    <?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="html" media-type="text/html; charset=ISO-8859-1"/>
      <xsl:template match="/">
        <html>
          <head>
            <title>xsl
            </title>
          </head>
    		<body>
    			<xsl:for-each select="/form/submits/submit">
    				<xsl:text>|</xsl:text>
    					<xsl:value-of select="submit-id"/>
    				<xsl:text>|</xsl:text>
    					<xsl:value-of select="submit-date"/>
    				<xsl:text>|</xsl:text>
    			</xsl:for-each>	
    			<xsl:for-each select="/form/submits/submit/questions/question">
    				<xsl:text>|</xsl:text>
    					<xsl:value-of select="responses"/>
    				</xsl:for-each>		
    		</body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    Maintenant mon problème c'est que cela m'affiche d'abord tous les submit-id puis les submit-date et ensuite toutes les réponses, alors que moi je voudrais avoir submit-id| submit-date| responses | retour à la ligne submit-id| submit-date| responses | retour à la ligne
    submit-id| submit-date| responses | etc etc...

    Je vous remercie d'avance

  6. #6
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut xsl
    ah c'est bon j'ai trouvé
    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
    <?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="html" media-type="text/html; charset=ISO-8859-1"/>
      <xsl:template match="/">
        <html>
          <head>
            <title>
            </title>
          </head>
    		<body>
    			<xsl:for-each select="/form/submits/submit">
    				<xsl:text>|</xsl:text>
    					<xsl:value-of select="submit-date"/>	
    				<xsl:text>|</xsl:text>
    					<xsl:value-of select="submit-id"/>
    				<xsl:text>|</xsl:text>
    					<xsl:for-each select="/form/submits/submit/questions/question">
    						<xsl:text>|</xsl:text>
    							<xsl:value-of select="responses"/>
    					</xsl:for-each>	
    			</xsl:for-each>					
    		</body>
        </html>
      </xsl:template>
    </xsl:stylesheet>

  7. #7
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Voilà.

    Il ne te manque plus qu'un retour à la ligne à la fin de ton premier for-each.

    Par contre je ne comprends pas pourquoi tu mets la sortie en HTML alors que tu veux écrire un fichier texte. Accessoirement, dans le fichier HTML tu devras mettre un <br/> alors que pour un fichier texte, il faut un "&#10;".

  8. #8
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut xsl
    oui en effet mais c'était juste pour voir le résultat aller petit à petit
    (je sais pas encore comment faire )

  9. #9
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut xsl
    j'aurais une autre question par contre
    Est-il possible de faire un retour chariot par rapport à une réponse c'est à dire
    j'ai mon affichage

    submit-date| submit-id| response| response| et je voudrais qu'à la troisième response il fasse un retour chariot et continue a afficher les responses met à la ligne
    response| response| response| response| response| response| response| response| etc. etc...

    Je vous remercie d'avance

  10. #10
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Tu peux faire un test sur la position :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:for-each select="questions/question/responses/response">
    	<xsl:text>|</xsl:text>
    	<xsl:if test="position() = 3">
    		<xsl:text>
    </xsl:text>
    	</xsl:if>
    	<xsl:value-of select="."/>
    </xsl:for-each>
    Par contre si tu veux faire un fichier "normalisé" genre CSV c'est étrange de mettre une partie des données d'une même "entrée" sur une ligne différente

  11. #11
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Je te remercie de ta réponse j'ai déjà bien avancé. (désolé pour le temps de réponse vacance ).

    Par contre je voulais également te demander comment fait-on au final le traitement qui permettra a mon document XML de devenir un TXT?

    Merci d'avance

  12. #12
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Il n'y a normalement rien à faire de spécial, la sortie est du texte. Par contre tu peux spécifier spécifiquement que tu veux une sortie en mode texte en utilisant l'élément output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:output method="text"/>

  13. #13
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Ah d'accord merci.

    Par contre je voulais revenir sur la partie du saut de ligne,
    je voudrais finalement faire un saut de ligne à chaque fois que mon xml trouve

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <question-title><![CDATA[Pays ]]></question-title>
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="position() = 23">
    mais en affichant toujours mes <response>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <response><![CDATA[FR]]></response>
    .

    Merci.

  14. #14
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Et du coup tu comptes t'y prendre comment ?

  15. #15
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Ba justement je ne sais pas comment faire car j'ai mon fichier xslt
    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
    <?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 match="/">
    				<xsl:for-each select="/form/submits/submit">
    					<xsl:text>|</xsl:text>
    					<xsl:variable name="Date" select="submit-date"/>
    					<xsl:value-of select="$Date"/>	
    						<xsl:text>|</xsl:text>
    					<xsl:value-of select="submit-id"/>
    						<xsl:text>|</xsl:text>
    						<xsl:for-each select="/form/submits/submit/questions/question/responses/response">
    							<xsl:if test ="position()13">
    								<xsl:text>
    </xsl:text>
    								<xsl:text>|</xsl:text>
    							</xsl:if >
    							<xsl:if test="position() = 23">
    								<xsl:text>
    </xsl:text>
    								<xsl:text>|</xsl:text>
    							</xsl:if >
    							<xsl:if test="position() = 39">
    								<xsl:text>
    </xsl:text>
    								<xsl:text>|</xsl:text>
    							</xsl:if >
    								<xsl:value-of select="."/><xsl:text>|</xsl:text>
    						</xsl:for-each>
    						<xsl:text>
    </xsl:text>
    				</xsl:for-each>	
    			</xsl:template>
    	</xsl:stylesheet>
    Mais à la place des positions j'aurais voulu faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:if test ="<![CDATA[Pays ]]>">
    <xsl:text>
    </xsl:text>
    <xsl:text>|</xsl:text>
    </xsl:if >

  16. #16
    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
    On peut envisager :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test ="../../question-title = 'Pays '">
    Je trouve pas de manière bien propre de gérer ça.

  17. #17
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:for-each select="/form/submits/submit/questions/question/responses/response">
    							<xsl:if test ="../../question-title = 'Pays'">
    								<xsl:text>
    </xsl:text>
    								<xsl:text>|</xsl:text>
    							</xsl:if >
    Malheureusement ça ne marche pas

  18. #18
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Normal, tu as oublié l'espace après 'Pays'. Soit tu mets le contenu réel de la balise (avec les espaces, sauts de lignes, ...) soit tu le normalises avec la fonction normalize-space :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:if test ="normalize-space(../../question-title/text()) = 'Pays'">
    	<xsl:text>
    </xsl:text>
    	<xsl:text>|</xsl:text>
    </xsl:if >

  19. #19
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    ah merci en effet ça marche bien
    mais malheureusement (décidément je n'ai pas de chance )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:if test ="../../question-title ='Nature de l'offre'">
    								<xsl:text>
    </xsl:text>
    								<xsl:text>|</xsl:text>
    							</xsl:if >
    pour cette partie ça ne marche pas car il y a une cote "l'offre"

  20. #20
    Membre du Club
    Homme Profil pro
    Etudiant en alternance
    Inscrit en
    Février 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant en alternance

    Informations forums :
    Inscription : Février 2011
    Messages : 75
    Points : 44
    Points
    44
    Par défaut
    c'est bon j'ai trouvé le code qui remplace la quote Secteur d&apos;activité

    &apos;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/04/2014, 14h58
  2. Format date pour mon fichier xml qui deviendra un txt
    Par fano97one dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/03/2012, 16h52
  3. Réponses: 2
    Dernier message: 03/04/2007, 14h14
  4. [SimpleXML] Comment faire pour transformer un fichier XML en PHP ?
    Par magic8392 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 23/09/2005, 16h22

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