www - xslt, javascript y entidades html sin corte
xslt introduction (5)
Tengo un pequeño problema con las entidades xslt, js y html, por ej. dentro de una plantilla:
<script type="text/javascript">
<xsl:value-of select="/some/node"/>
for (var i = 0; i < 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 <
}
// ]]>
</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(''<'')"/> 5; i++) {
// works of course
}
</script>
¿Alguien tiene una idea de dónde podría venir mi problema? Siempre pensé que el procesador xslt dejaría sin protección el contenido de un elemento <script /> al usar el método de salida html ...
Ejecuto libxslt2 versión 1.1.24 en OSX que se instaló utilizando macportsports ...
Siempre pensé que el procesador xslt dejaría sin protección el contenido de un elemento script al usar el método de salida html
Estás en lo correcto: http://www.w3.org/TR/xslt#section-HTML-Output-Method
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 < b) foo()</script>
or
<script><![CDATA[if (a < b) foo()]]></script>
should be output as
<script>if (a < b) foo()</script>
Si su procesador XSLT está haciendo lo contrario, es un error.
Sin embargo, en cualquier caso, es una buena idea evitar ''<'' y ''&'' en los scripts incrustados, y una idea aún mejor para sacar todo el código en un archivo .js vinculado.
Intente eliminar la barra doble antes del CDATA de su tercera solución
De acuerdo. larga historia, respuesta corta:
Parece que con algunas versiones de libxslt, el procesador xslt deja el contenido de un elemento <script /> sin guardar cuando usa el método de salida html, mientras que otros no ... por lo tanto, se recomienda lo siguiente:
<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>
Los bloques CDATA
deberían haber funcionado; ellos siempre tienen para mi ¿Cuál es su valor de disable-output-escaping
?
ACTUALIZACIÓN: Usando Xalan, con disable-output-escaping
en su valor predeterminado, que estoy bastante seguro de que no
, tengo lo siguiente en mis archivos XSL en funcionamiento:
Sin bloque
CDATA
:for (var i = 0; i `<` foo.length; i++) { … }
Bloque
CDATA
:<![CDATA[ for (var i = 0; i < foo.length; i++) { … } ]]>
Si el método xsl:output
es html, la sección CDATA funcionaría. Si el método xsl:output
es xml, los signos <y> aún se convertirían.
Para evitar este problema, puede definir que el elemento de script no se comporte de esta manera utilizando el elemento xsl: output. también puedes forzar el método de la salida usando xml o html
<xsl:output method="xml" cdata-section-elements="script" />
...
<script type="text/javascript" language="javascript">
<![CDATA[
for (var i = 0; i < foo.length; i++) { … }
]]>
</script>