Bonjour,
Débutant dans le xsl je voudrais savoir comment faire pour transformer mon fichier xml qui est assez longen fichier texte avec pour séparateur un pipe et d retour à la ligne pour une nouvelle entrer
Je vous remercie d'avance![]()
Bonjour,
Débutant dans le xsl je voudrais savoir comment faire pour transformer mon fichier xml qui est assez longen fichier texte avec pour séparateur un pipe et d retour à la ligne pour une nouvelle entrer
Je vous remercie d'avance![]()
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.
j'ai pu donc avancer sur mes recherches et j'ai pu créer mon xsl
monxsl.xsl
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
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('
','','')"/> <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>
Mon problème est que je n'arrive pas à afficher le contenu de mes réponses
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>
Je vous remercie d'avance
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 :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.
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>
Merci pour ta réponse elle m'a permis de bien avancée
donc j'ai refait mon code
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
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>
submit-id| submit-date| responses | etc etc...
Je vous remercie d'avance
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>
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 " ".
oui en effet mais c'était juste pour voir le résultat aller petit à petit![]()
(je sais pas encore comment faire)
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
Tu peux faire un test sur la position :
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
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>
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
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"/>
Ah d'accordmerci.
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
à la place de
Code : Sélectionner tout - Visualiser dans une fenêtre à part <question-title><![CDATA[Pays ]]></question-title>mais en affichant toujours mes <response>
Code : Sélectionner tout - Visualiser dans une fenêtre à part <xsl:if test="position() = 23">
.
Code : Sélectionner tout - Visualiser dans une fenêtre à part <response><![CDATA[FR]]></response>
Merci.
Et du coup tu comptes t'y prendre comment ?
Ba justement je ne sais pas comment faire car j'ai mon fichier xslt
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
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>
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 >
On peut envisager :
Je trouve pas de manière bien propre de gérer ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part <xsl:if test ="../../question-title = 'Pays '">
Malheureusement ça ne marche pas
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 >![]()
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 >
ah merci en effet ça marche bien
mais malheureusement (décidément je n'ai pas de chance )
pour cette partie ça ne marche pas car il y a une cote "l'offre"
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 >![]()
c'est bon j'ai trouvé le code qui remplace la quote Secteur d'activité
'
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager