[XSLT] - changer des < en CDATA
J'ai un fichier XML avec des bouts du genre :
Code:
1 2 3
| <violation line="132" rule="AvoidDuplicateLiterals" ruleset="String and StringBuffer Rules" package="fr.sigma.base.page" class="Admin" method="executerAction" externalInfoUrl="http://pmd.sourceforge.net/rules/strings.html#AvoidDuplicateLiterals" priority="3">
The String literal "</TD>" appears 6 times in this file; the first occurrence is on line 132
</violation> |
Mon problème est vis-à-vis de l'interprétation des "<".
J'ai ajouté dans mon code ceci pour qu'il n'interprète pas les < :
Code:
1 2 3
| <xsl:template name="message">
<xsl:value-of disable-output-escaping="yes" select="."/>
</xsl:template> |
Mais ma feuille XSL a pour but de réaliser un transfert au format HTML. Et donc, si je laisse mes < le navigateur va les interpréter.
Je voudrais donc les remplacer en les imbriquant dans des CDATA.
Mais je ne trouve pas la syntaxe.
Je suis parti sur une piste avec du JavaScript, mais ça ne fonctionne pas.
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
| <script language="javascript">
function decode () {
var divs = document.getElementsByTagName('div');
for(var i = 0; i<![CDATA[<]]>divs.length; i++) {
var div = divs[i];
if (div.className.equals("encoded")) {
div.innerHTML = div.firstChild.nodeValue;
changeBalises(div);
}
}
}
function changeBalises(e) {
alert(e.firstChild);
var chaine = e.firstChild.nodeValue;
var regDeb = new RegExp("<", "gi");
var cdataD = <![CDATA["<![C" + "DATA[<";]]>
chaine.replace(regDeb,cdataD);
var regFin=new RegExp(">", "gi");
var cdataF = <![CDATA[">]]" + ">"]]>
chaine.replace(regFin,cdataF);
document.write("Chaine finale :" + chaine + "-"+"<BR/>");
}
</script> |
Code:
1 2 3
| <td style="padding: 3px" align="left" width="100%"><xsl:if test="@externalInfoUrl"><a><xsl:attribute name="href"><xsl:value-of select="@externalInfoUrl"/></xsl:attribute>
<div class="encoded"><xsl:call-template name="message"/></div>
</a></xsl:if><xsl:if test="not(@externalInfoUrl)"><div class="encoded"><xsl:call-template name="message"/></div></xsl:if></td> |
Le fait que c'est mon XSL qui ajoute le message que je dois traiter via le Javascript, c'est tordu, car il faut que j'attende le chargement de la page... Et même après : il se perd.
Lancement via :
Code:
<a href="javascript:;" onClick="decode();">lala</a>
Une autre méthode ? Ou une résolution de celle-ci ?
Je me suis inspiré de ceci
Je n'avais pas vu, mais...
Mon output est en HTML et, j'ai eut beau ajouter :
Code:
1 2
| <xsl:output method="html" encoding="UTF-8" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
doctype-system="http://www.w3.org/TR/html4/loose.dtd" indent="yes" cdata-section-elements="e"/> |
Il prend bien en compte la création de mes balises <e>, mais n'ajoute pas de CDATA :-(
=>
Code:
1 2 3 4 5 6
| </td><td style="padding: 3px" align="right">451</td><td style="padding: 3px" align="left">genererListe</td><td style="padding: 3px" align="left" width="100%"><a href="http://pmd.sourceforge.net/rules/strings.html#AvoidDuplicateLiterals">
<e>
The String literal "\")'><IMG SRC='" appears 4 times in this file; the first occurrence is on line 451
</e>
</a></td>
</tr> |