Bonjour,
J'aurais une petite question pour les connaisseurs. Est-il possible avec mon xslt de regarder dans mes balises xml si il y a des retours chariots et si oui les remplacer par un autre caractère par exemple "¤¤" ?
Je vous remercie d'avance
Bonjour,
J'aurais une petite question pour les connaisseurs. Est-il possible avec mon xslt de regarder dans mes balises xml si il y a des retours chariots et si oui les remplacer par un autre caractère par exemple "¤¤" ?
Je vous remercie d'avance
Possible oui.
Mais en XLST 1.0 sans EXSLT, facile non.
Le problème, c'est pour modifier le texte. La seule manière de faire est d'appeler un template récursif sur le texte à modifier, qui va chercher s'il y a un retour chariot dedans.
Si non, le texte est renvoyé tel quel.
Si oui, utilisation de substring-before() et substring-after() pour séparer avant le premier retour chariot et après. Le texte renvoyé est ce qu'il y a avant, suivi des caractères de remplacement, suivi de l'appel récursif sur ce qu'il y a après.
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
j'ai effectué cette manip mais apparemment ça ne marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <xsl:variable name="response" select="."/> <xsl:value-of select="translate($responses,' ','non')"/>
j'ai réussi à remplacer le retour chariot par un autre caractère qui est ¤ voici le code.
si vous avez d'autre proposition de code pour faire cela je suis preneur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <xsl:value-of select="translate(.,' ','¤¤')"/>
La fonction translate travaille caractère par caractère. C'est quelque chose dont on (moi en tout cas) n'a pas vraiment l'habitude en programmation :
signifie :
1
2 translate(..., ' ', 'non')
- remplace le caractère '\r' par 'n'.
- remplace le caractère '\n' par 'o'.
le dernier 'n' est ignoré car il ne correspond à aucun caractère en entrée.
Malheureusement en XPath 1.0 c'est la seule fonction de remplacement qui existe. Pour remplacer un string (resp. un ou plusieurs caractère(s)) par un autre (resp. plusieurs ou un caractère(s)), il te faut passer par un template récursif. Ce n'est pas bien compliqué mais c'est relativement lourd.
Un template récursif est un template nommé (template name="..." et non template match="...") qui s'appelle lui-même (call-template). Tu trouveras un exemple ici : http://xml.developpez.com/faq/?page=3#xslt_compteur.
Dans ton cas il faudra utiliser substring-before(...) et substring-after(...) pour découper ta chaîne aux bons endroits et la passer au template "suivant".
Pour info, il existe déjà sur le net des bouts de code qui font cette opération.
j'ai trouvé un code
serait-ce le bonne exemple?
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="string-replace"> <xsl:param name="str" /> <xsl:param name="search" /> <xsl:param name="replace" /> <xsl:choose> <xsl:when test="$search and contains($str, $search)"> <xsl:value-of select="substring-before($str, $search)" /> <xsl:value-of select="$replace" /> <xsl:call-template name="string-replace"> <xsl:with-param name="str" select="substring-after($str, $search)" /> <xsl:with-param name="search" select="$search" /> <xsl:with-param name="replace" select="$replace" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$str" /> </xsl:otherwise> </xsl:choose> </xsl:template>
Si oui il faut le placer avant leComment définit-on les
Code : Sélectionner tout - Visualiser dans une fenêtre à part <xsl:template match="/">
Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <xsl:param name="str" /> <xsl:param name="search" /> <xsl:param name="replace" />
le template de remplacement
l'attribution de valeur
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 <xsl:template name="string-replace"> <xsl:param name="str" /> <xsl:param name="search" /> <xsl:param name="replace" /> <xsl:choose> <xsl:when test="$search and contains($str, $search)"> <xsl:value-of select="substring-before($str, $search)" /> <xsl:value-of select="$replace" /> <xsl:call-template name="string-replace"> <xsl:with-param name="str" select="substring-after($str, $search)" /> <xsl:with-param name="search" select="$search" /> <xsl:with-param name="replace" select="$replace" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$str" /> </xsl:otherwise> </xsl:choose> </xsl:template>
Bizarrement quand je l'affiche directement avec mon navigateur ça marche on voit que les retours chariots sont remplacés par les ¤
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 <xsl:call-template name="string-replace"> <xsl:with-param name="str"> <xsl:value-of select="."/> </xsl:with-param> <xsl:with-param name="search"> <xsl:text> </xsl:text> </xsl:with-param> <xsl:with-param name="replace"> <xsl:text>¤</xsl:text> </xsl:with-param> </xsl:call-template> <xsl:text>|</xsl:text>
mais quand je fais le vrai traitement c'est à dire que mon xml devient un txt alors il me laisse les retours chariots je ne comprend plus rien
Faudrait qu'on voie tout ton XSL, le problème doit être ailleurs.
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template name="string-replace"> <xsl:param name="str" /> <xsl:param name="search" /> <xsl:param name="replace" /> <xsl:choose> <xsl:when test="$search and contains($str, $search)"> <xsl:value-of select="substring-before($str, $search)" /> <xsl:value-of select="$replace" /> <xsl:call-template name="string-replace"> <xsl:with-param name="str" select="substring-after($str, $search)" /> <xsl:with-param name="search" select="$search" /> <xsl:with-param name="replace" select="$replace" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$str" /> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- commencement a la racine --> <xsl:template match="/"> <!-- Parcourt tous les attributs d'un formulaire (chemin form/submits/submit) --> <xsl:for-each select="/form/submits/submit"> <!-- Selectionne les attributs submit-date --> <xsl:variable name="Date" select="submit-date"/> <!-- Changement du format date de JJ/MM/AA en AAAA/MM/JJ --> <xsl:variable name="Date_Final" select="concat(20, substring($Date, 7,2), substring($Date, 4, 2), substring($Date,1,2))"/> <!--Affiche valeur $Date_Final--> <xsl:value-of select="$Date_Final"/> <xsl:text>|</xsl:text> <!-- Selectionne les attributs submit-id numero du formulaire qui se trouveront dans la variable $id--> <xsl:variable name="id" select="submit-id"/> <!-- affiche la variable $id--> <xsl:value-of select="$id"/> <!-- Affiche le texte brut --> <xsl:text>|</xsl:text> <xsl:text>A</xsl:text> <xsl:text>|</xsl:text> <!-- boucle for qui Parcourt toutes les response--> <xsl:for-each select="questions/question/responses/response"> <!--condition if par rapport aux question-title : si question egale au texte entre quotes, alors --> <xsl:if test ="normalize-space(../../question-title/text()) = 'Adresse de la société'"> <!-- retour chariot--> <xsl:text> </xsl:text> <!-- Affiche la valeur $Date_Final--> <xsl:value-of select="$Date_Final"/> <xsl:text>|</xsl:text> <!--Affiche la valeur id--> <xsl:value-of select="$id"/> <!-- Affiche le texte brute--> <xsl:text>|</xsl:text><xsl:text>B</xsl:text><xsl:text>|</xsl:text> </xsl:if ><!--fin de la condition--> <!--condition if par rapport aux question-title si question egale au texte entre quotes, alors--> <xsl:if test='normalize-space(../../question-title/text()) ="Secteur d'activité"'> <!-- retour chariot--> <xsl:text> </xsl:text> <!-- Affiche la valeur $Date_Final--> <xsl:value-of select="$Date_Final"/><xsl:text>|</xsl:text> <!--Affiche la valeur id--> <xsl:value-of select="$id"/> <!-- Affiche le texte brute--> <xsl:text>|</xsl:text><xsl:text>C</xsl:text><xsl:text>|</xsl:text> </xsl:if ><!--fin de la condition--> <!--condition if par rapport aux question-title sisi question egale au texte entre quotes, alors--> <xsl:if test="normalize-space(../../question-title/text()) ='Nom'"> <!-- retour chariot--> <xsl:text> </xsl:text> <!-- Affiche la valeur $Date_Final--> <xsl:value-of select="$Date_Final"/><xsl:text>|</xsl:text> <!--Affiche la valeur id--> <xsl:value-of select="$id"/> <!-- Affiche le texte brute--> <xsl:text>|</xsl:text><xsl:text>D</xsl:text><xsl:text>|</xsl:text> </xsl:if ><!--fin de la condition--> <!-- affiche toutes les responses de mon document xml--> <xsl:call-template name="string-replace"> <xsl:with-param name="str"> <xsl:value-of select="."/> </xsl:with-param> <xsl:with-param name="search"> <xsl:text> </xsl:text> </xsl:with-param> <xsl:with-param name="replace"> <xsl:text>¤¤</xsl:text> </xsl:with-param> </xsl:call-template> <xsl:text>|</xsl:text> </xsl:for-each><!--fin de la 2eme boucle --> <xsl:text>|</xsl:text> <xsl:text> </xsl:text><!-- retour chariot--> </xsl:for-each> <!--fin de la 1ere boucle --> </xsl:template> </xsl:stylesheet>
Vu comment c'est écrit, il est possible que tu aies des "\n" tout seuls ou des "\r" tout seuls ce qui fait que tu aurais quand même des retours chariot qui traînent vu que tu remplaces la chaîne '\r\n'.
Essaye en appellant 2 fois le replace : 1 avec '\r' et 1 avec '\n'.
A part ça, je ne vois vraiment aucune raison pour qu'il y'ait un problème.
Il y a plusieurs facteurs qui interviennent tacitement ou explicitement: mac/windows/nix ont leur convention de nouvelle ligne (\r, \r\n, \n) et puis quand l'engin d'xml charge un fichier il fait son bouleau de normalisation aussi....
En tout cas quand on fait les cherches et remplacements successivement \r et \n (l'ordre ne soit pas important), il devrait marcher pour tous les cas.
Si ce dernier ne marche pas, je soupçon que le script ne soit pas s'écrit correctement. Le bloc de code concernant doit s'écrire quelque peu comme ça, grosso modo.
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 <!-- ... etc etc --> <!-- affiche toutes les responses de mon document xml--> <xsl:variable name="string-intermediate"> <xsl:call-template name="string-replace"> <xsl:with-param name="str" select="." /> <xsl:with-param name="search" select="'&_#13;'" /> <!-- &_# sans underscore --> <xsl:with-param name="replace" select="'&_#164;'" /> <!-- &_# sans underscore --> </xsl:call-template> </xsl:variable> <xsl:variable name="string-processed"> <xsl:call-template name="string-replace"> <xsl:with-param name="str" select="$string-intermediate" /> <xsl:with-param name="search" select="'&_#10;'" /> <!-- &_# sans underscore --> <xsl:with-param name="replace" select="'&_#164;'" /> <!-- &_# sans underscore --> </xsl:call-template> </xsl:variable> <!-- puis montrer le résultat --> <xsl:value-of select="$string-processed" /> <xsl:text>|</xsl:text> <!-- etc etc... -->
Je viens de remarquer vous utilisez une construction comme ceci:
Je dirais non. C'est de chercher de problème pour soi-même et il devient implémentation dépendante: certain xslt engin le prend très mal. Il vaut mieux toujours s'écrire soit comme ceci<!-- &_# lire comme &# -->
<xsl:with-param name="search">
<xsl:text>&_#13;&_#10;</xsl:text>
</xsl:with-param>
soir comme cela
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <!-- &_# lire comme &# --> <xsl:with-param name="search" select="'&_#13;&_#10;'" />
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <!-- &_# lire comme &# --> <xsl:with-param name="search"> <xsl:value-of select="'&_#13;&_#10;'" /> </xsl:with-param>
[HS]
@tsuji: tu peux écrire &#[B][/B]10; pour que ça s'affiche bien (cf ce post)
[/HS]
Sinon je ne savais pas que le <text>...</text> pouvait être mal interprété, ceci dit je l'utilise extrèmement rarement. ^_^
Je vous remercie pour vos réponses
mais malheureusement lors de la saisie de vos code
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <xsl:with-param name="search"> <xsl:value-of select="' '"/> </xsl:with-param>
je recois un message d'erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <xsl:with-param name="search"> <xsl:value-of select="'&_#13;&_#10;'" /> </xsl:with-param>
Erreur d'analyse XML : mal formé
Emplacement : file:///E:/mairie%20de%20paris/xsl/test/form/Lutece-sourcing.xsl
Numéro de ligne 96, Colonne 37 : <xsl:value-of select="' '
J'espère que vous aviez enlever le "underscore" (_) au moins dans le second cas dans le code réel?
Mais pour le premier, c'est tout de même m'étonner. C'est de jamais vu. Avez-vous essayé l'autre version?
Il se peut que le message provenait de par d'autre raison syntactique ailleurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <xsl:with-param name="search" select="' '" />
@Loceka: salut Tlouye, merci pour le truc et l'effort d'alerter le management.
En ce qui concerne la syntaxe utilisant xsl:text, je peux proposer un petit document xslt autonome pour faire tester.
Il ne donne pas les même résultats pas MSXML2 ou msxsl.exe. Le second cas, result-text, rien n'est remplacé... Pour xerces, saxon, par exemple, ça va. En tout cas, ce sont des petites détailles qui lient probablement avec seulement des caractères invisibles comme cr, lf...
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:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="utf-8" /> <xsl:param name="s" select="'cr: etc cr: etc'" /> <xsl:template match="/"> <root> <result-select> <xsl:call-template name="string-replace"> <xsl:with-param name="str" select="$s" /> <xsl:with-param name="search" select="' '" /> <xsl:with-param name="replace" select="'¤'" /> </xsl:call-template> </result-select> <result-text> <xsl:call-template name="string-replace"> <xsl:with-param name="str" select="$s" /> <xsl:with-param name="search"> <xsl:text> </xsl:text> </xsl:with-param> <xsl:with-param name="replace" select="'¤'" /> </xsl:call-template> </result-text> </root> </xsl:template> <!-- ajouter to template nommé aussi... --> </xsl:stylesheet>
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