J'ai un fichier XML avec des bouts du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 &quot;&lt;/TD&gt;&quot; 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 "&lt;".
J'ai ajouté dans mon code ceci pour qu'il n'interprète pas les &lt; :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 &lt; 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 : 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
    <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("&lt;", "gi");
       var cdataD = <![CDATA["<![C" + "DATA[&lt;";]]>
       chaine.replace(regDeb,cdataD);
 
       var regFin=new RegExp("&gt;", "gi");
       var cdataF = <![CDATA["&gt;]]" + ">"]]>
       chaine.replace(regFin,cdataF);
       document.write("Chaine finale :" + chaine + "-"+"<BR/>");
    }
    </script>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
<a href="javascript:;" onClick="decode();">lala</a>
Une autre méthode ? Ou une résolution de celle-ci ?

Je me suis inspiré de ceci