Bonjour à tous,
j'aimerais pouvoir utiliser des balises html en sortie en combinant XML et XSLT.
Mon but premier était de pouvoir intégrer des retours chariots dans mes noeuds de texte XML.
- En mentionnant des "<br />" en dur dans le code ils sont supprimés par XSL.
- En ajoutant les balises "cdata" ils sont présents mais convertis et non interprétés par le navigateur en tant que balise html mais comme texte, on peut donc lire le "<br />" à l'écran.
Pour palier à cela, j'ai mis en place une fonction de remplacement de chaîne au sein du fichier XSL. Le remplacement fonctionne, je peux remplacer la chaine "monBR" récupérer dans le XML par une autre chaine de mon choix. Toutefois, cela ne me permet pas de mettre des balises du type "<br />" (qui n'est pas perçue comme une chaine banale).
Du coup, savez-vous comment je peux faire pour remplacer un pattern (provenant du XML) par du html (via une fonction dans le xsl) qui sera interprété en sortie par le navigateur.
Remarque : mon but n'est pas seulement de faire un retour chariot, en effet, par la suite, j'aimerais enrichir ma fonction de remplacement de chaine pour créer une liste à puce en remplaçant par exemple tous les pattern "monUlOuvrant" par "<ul>" etc ...
Merci d'avance pour vos suggestions.
1) mon fichier xml (test.xml)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="test.xsl"?> <record> <textDescription> Levels in the levels node are L1 toto L2 toti myBR bidule suite du texte a la ligne <u>salut</u> </textDescription> </record>
2) Mon fichier xslt (test.xsl):
3)
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 <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:scr="urn:scr.this"> <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> <!-- fonction de remplacement avec 3 parametres : text brut, pattern a rechercher, texte de remplacement --> <xsl:template name="string-replace-all"> <xsl:param name="text" /> <xsl:choose> <xsl:when test="contains($text, 'myBR')"> <xsl:value-of select="substring-before($text,'myBR')" /> <xsl:value-of select="theBR" /> <xsl:call-template name="string-replace-all"> <xsl:with-param name="text" select="substring-after($text,'myBR')" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$text" /> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- debut nouvelles fonctions --> <!-- appel successif de la fonction string-replace-all pour des patterns connus a remplacer --> <xsl:template name="quote.string"> <!-- Chaîne reçue en paramètre --> <xsl:param name="string"/> <xsl:choose> <xsl:when test="contains($string, 'myBR')"> <xsl:call-template name="string-replace-all"> <xsl:with-param name="text" select="$string"/> <!-- <xsl:with-param name="replace" select="'"'"/> --> <xsl:with-param name="replace" select="'myBR'"/> <xsl:with-param name="by" select="'RetourLigne'"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$string"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- fonction de remplacement de caractere qui prend en parametre : le texte brut, la valeur a rechercher, la valeur a remplacer --> <xsl:template name="string-replace-all"> <xsl:param name="text" /> <xsl:param name="replace" /> <xsl:param name="by" /> <xsl:choose> <xsl:when test="contains($text, $replace)"> <xsl:value-of select="substring-before($text,$replace)" /> <xsl:value-of select="$by" /> <xsl:call-template name="string-replace-all"> <xsl:with-param name="text" select="substring-after($text,$replace)" /> <xsl:with-param name="replace" select="$replace" /> <xsl:with-param name="by" select="$by" /> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$text" /> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- fin nouvelles fonctions --> <xsl:template match="/"> <!-- on lance le template ci-dessous --> <xsl:for-each select="record"> <xsl:for-each select="textDescription"> <xsl:call-template name="quote.string"> <xsl:with-param name="string" select="current()" /> </xsl:call-template> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Partager