Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP > XSL/XSLT/XPATH
XSL/XSLT/XPATH XPath, XSLT, XSL-FO et tout ce qui permet de les mettre en oeuvre . Avant de poster -> FAQ XML, Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/12/2012, 17h20   #1
supertotal
Invité de passage
 
Inscription : septembre 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 30
Points : 3
Points : 3
Par défaut interpretation code HTML issu d'un fichier XML sans être échappé par XSLT

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 :
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):
Code :
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>
3)
supertotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 00h46   #2
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 268
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 268
Points : 10 587
Points : 10 587
Envoyer un message via Skype™ à thelvin
Tout cela est inutile, <br/> fonctionnant parfaitement, bien que souvent moins pratique que <p> ... </p>.

Prouve-nous le contraire.

Dans le xml :

Code :
<text>Ceci est un texte <br/>sur plusieurs lignes</text>
Dans le XSLT :

Code :
1
2
3
4
5
6
7
8
9
10
11
<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>
 
<xsl:template match="text">
  <p><xsl:apply-templates/></p>
</xsl:template>
 
<xsl:template match="br">
  <br/>
</xsl:template>
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2013, 18h19   #3
supertotal
Invité de passage
 
Inscription : septembre 2008
Messages : 30
Détails du profil
Informations forums :
Inscription : septembre 2008
Messages : 30
Points : 3
Points : 3
Effectivement, ta solution fonctionne très bien.

Pas toujours facile de faire simple.
supertotal est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h53.


 
 
 
 
Partenaires

Hébergement Web