Domanda

Ho un piccolo problema con le entità xslt, js e html, ad es. all'interno di un modello:

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i &lt; 5; i++) {
        //            ^^^ js error
    }
</script>

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i < 5; i++) {
        //            ^ xslt error
    }
</script>

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    // <![CDATA[
    for (var i = 0; i < 5; i++) {
        //            ^ becomes &lt;
    }
    // ]]>
</script>


<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i <xsl:value-of disable-output-escaping="yes" select="string('&lt;')"/> 5; i++) {
        // works of course
    }
</script>

qualcuno ha idea da dove possa venire il mio problema? ho sempre pensato che il processore xslt avrebbe lasciato il contenuto di un < script / > elemento senza caratteri di escape quando si utilizza il metodo di output html ...

eseguo libxslt2 versione 1.1.24 su OSX che è stato installato usando macportsports ...

È stato utile?

Soluzione

OK. storia lunga, risposta breve:

sembra che con alcune versioni di libxslt il processore xslt lasci il contenuto di un < script / > elemento senza caratteri di escape quando si utilizza il metodo di output html, con altri non ... pertanto si consiglia quanto segue:

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    <xsl:text disable-output-escaping="yes">
        // ^ does the trick ...
        for (var i = 0; i < 5; i++) {
            //            ^ works
        }
    </xsl:text>
</script>

Altri suggerimenti

  

Ho sempre pensato che il processore xslt avrebbe lasciato il contenuto di un elemento di script senza caratteri di escape quando si utilizza il metodo di output HTML

Hai ragione: http://www.w3.org / TR / XSLT # sezione-HTML-uscita-Metodo

The html output method should not perform escaping for the content of the script and style elements.
For example, a literal result element written in the stylesheet as
    <script>if (a &lt; b) foo()</script>
or
    <script><![CDATA[if (a < b) foo()]]></script>
should be output as
    <script>if (a < b) foo()</script>

Se il tuo processore XSLT sta facendo diversamente, è un bug.

Tuttavia, in ogni caso è una buona idea evitare '<' e '& amp;' negli script incorporati e un'idea ancora migliore per eliminare tutto il codice in un file .js collegato.

Prova a rimuovere la doppia barra prima del CDATA della tua terza soluzione

I blocchi CDATA avrebbero dovuto funzionare; hanno sempre per me. Qual è il tuo disable-output-escaping valore?

UPDATE: Usando Xalan, con no sul suo valore predefinito, che sono abbastanza sicuro è <=>, ho i seguenti nei miei file XSL funzionanti:

  • Nessun <=> blocco:

    for (var i = 0; i `&lt;` foo.length; i++) {
    …
    }
    
  • <=> blocco:

    <![CDATA[
    
    for (var i = 0; i < foo.length; i++) { … }
    
    ]]>
    

Se il metodo xsl:output è html, la sezione CDATA funzionerebbe. Se il metodo <=> è xml, & Lt; e > i segni verrebbero comunque convertiti.

Per aggirare questo problema, puoi definire l'elemento script in modo che non si comporti in questo modo usando l'elemento xsl: output. puoi anche forzare il metodo dell'output usando xml o html

<xsl:output method="xml" cdata-section-elements="script" />
...
<script type="text/javascript" language="javascript">
<![CDATA[
  for (var i = 0; i &lt; foo.length; i++) { … }
]]>
</script>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top