xsl tutorial sirve que programacion para generar freeformater example ejemplo codigo archivo xml xslt escaping invalid-characters

xml - tutorial - No se puede obtener xslt para generar un resultado(&) incluso después de escapar del personaje



xslt example (12)

Puede combinar disable-output-escaping con una sección CDATA . Prueba esto:

<xsl:text disable-output-escaping="yes"><![CDATA[&]]></xsl:text>

Estoy intentando crear una cadena de consulta de asignaciones de variables separadas por el símbolo & (ej: "var1=x&var2=y&..." ). Planeo pasar esta cadena a un archivo flash incrustado.

Tengo problemas para mostrar un símbolo & en XSLT. Si acabo de escribir & sin etiquetas alrededor, hay un problema al procesar el documento XSLT. Si &amp; sin etiquetas a su alrededor, la salida del documento es &amp; sin cambio Si <xsl:value-of select="&" /> o <xsl:value-of select="&amp;" /> <xsl:value-of select="&amp;" /> También obtengo un error. es posible? Nota: también he intentado &amp;amp; sin éxito


Use disable-output-escaping="yes" en su etiqueta value-of


¿Estás expresando el URI en HTML o XHTML? por ejemplo, <tag attr="http://foo.bar/?key=value&amp;key2=value2&amp;..."/> Si es así, " &amp; " es la forma correcta de expresar un signo & en un valor de atributo, incluso si se ve diferente al URI literal que desea. Los navegadores decodificarán " &amp; " y cualquier otra referencia de entidad de caracteres antes de cargarlos o pasarlos a Flash. Incrustar literal y solitariamente " & " directamente en HTML o XHTML es incorrecto.

También, personalmente, recomiendo aprender más sobre XML para pensar sobre este tipo de cosas de una manera más clara. Por ejemplo, intente utilizar el W3C DOM más (para algo más que un simple Javascript trivial); incluso si no lo usa día a día, aprender DOM me ayudó a pensar correctamente sobre la estructura en árbol de XML y cómo pensar sobre la correcta codificación de atributos y elementos.


Si está creando una cadena de consulta como parte de una URL más grande en un atributo de otra etiqueta (como "insertar"), entonces realmente quiere que & se escape como & amp ;. Si bien todos los navegadores entenderán lo que quieres decir y Hará lo correcto, si transfirieras tu documento generado a un validador, marcaría el valor sin escalar y el valor del atributo.


try: <xsl: value-of select = "& amp;" disable-output-escaping = "yes" />

Lo siento si el formato está en mal estado.


Si su transformación está emitiendo un documento XML, no debe desactivar el escape de salida. Desea que los caracteres de marcado se escapen en la salida, para que no emita XML mal formado. El objeto XML con el que está procesando la salida (por ejemplo, un DOM) liberará el texto por usted.

Si está utilizando la manipulación de cadenas en lugar de un objeto XML para procesar el resultado, tiene un problema. Pero el problema no está en su XSLT, sino en la decisión de utilizar la manipulación de cadenas para procesar XML, que casi siempre es mala.

Si su transformación está emitiendo HTML o texto (y ha establecido el tipo de salida en el elemento <xsl:output> , ¿verdad?), Es una historia diferente. Entonces es apropiado usar disable-output-escaping=''yes'' en su elemento <xsl:value-of> .

Pero en cualquier caso, tendrá que escapar de los caracteres de marcado en los nodos de texto de su XSLT, a menos que haya ajustado el texto en una sección CDATA.


Debe tener en cuenta que puede usar disable-output-escaping dentro del valor de nodo o cadena / texto como:

<xsl:value-of select="/node/here" disable-output-escaping="yes" />

o

<xsl:value-of select="''&amp;''" disable-output-escaping="yes" /> <xsl:text disable-output-escaping="yes">Texas A&amp;M</xsl:text>

Tenga en cuenta las comillas simples en xsl: value-of.

Sin embargo, no puede usar disable-output-escaping en los atributos. Sé que está completamente desordenado, pero así son las cosas en XSLT 1.0. Entonces, lo siguiente NO funcionará:

<xsl:value-of select="/node/here/@ttribute" disable-output-escaping="yes" />

Porque en la letra pequeña es la cita:

Por lo tanto, es un error inhabilitar el escape de salida para un elemento <xsl:value-of /> o <xsl:text /> que se utiliza para generar el valor de cadena de un comentario, instrucción de procesamiento o nodo de atributo ;

énfasis mío

Tomado de: http://www.w3.org/TR/xslt#disable-output-escaping


Si intenta producir un archivo XML como salida, querrá producir &amp; (como & por sí mismo es XML no válido). Si solo está produciendo una cadena, debe establecer el modo de salida de la hoja de estilos en text incluyendo lo siguiente como elemento secundario de xsl:stylesheet

<xsl:output method="text"/>

Esto evitará que la hoja de estilo escape cosas y <xsl:value-of select="''&amp;''" /> debería producir & .


Deshabilitar el escape de salida hará el trabajo ... ya que este atributo solo es compatible con un texto, también puede manipular la plantilla, por ejemplo:

<xsl:variable name="replaced"> <xsl:call-template name=''app''> <xsl:with-param name=''name''/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$replaced" disable-output-escaping="yes"/>

---> Envolvió la llamada a la plantilla en una variable y usó disable-output-escaping = "yes" ..


Usar el atributo disable-output-escaping (a boolean) es probablemente la forma más fácil de lograr esto. Tenga en cuenta que puede usar esto no solo en <xsl:value-of/> sino también con <xsl:text> , que podría ser más limpio, dependiendo de su caso específico.

Aquí está la parte relevante de la especificación: http://www.w3.org/TR/xslt#disable-output-escaping


Estoy intentando crear una cadena de consulta de asignaciones de variables separadas por el símbolo & (ej: "var1=x&var2=y&..." ). Planeo pasar esta cadena a un archivo flash incrustado.

Tengo problemas para mostrar un símbolo & en XSLT.

Aquí hay una demostración ejecutable, corta y completa de cómo producir dicha URL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:variable name="vX" select="''x''"/> <xsl:variable name="vY" select="''y''"/> <xsl:variable name="vZ" select="''z''"/> <xsl:template match="/"> <xsl:value-of select= "concat(''http://www.myUrl.com/?vA=a&amp;vX='', $vX, ''&amp;vY='', $vY, ''&amp;vZ='', $vZ)"/> </xsl:template> </xsl:stylesheet>

Cuando esta transformación se aplica a cualquier documento XML fuente (ignorado) :

<t/>

el resultado deseado y correcto se produce:

http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z

En cuanto a los otros asuntos planteados en la pregunta:

Si &amp; sin etiquetas a su alrededor, la salida del documento es &amp; sin cambio

La declaración anterior simplemente no es verdad ... Solo ejecuta la transformación anterior y mira el resultado.

Lo que realmente está sucediendo :

El resultado que está viendo es absolutamente correcto, sin embargo, su método de salida es html o xml (el valor predeterminado para method= ), por lo tanto, el serializador del procesador XSLT debe representar el resultado correcto: la cadena http://www.myUrl.com/?vA=a&vX=x&vY=y&vZ=z - como (parte de) un nodo de texto en un documento XML bien formado o en un árbol HTML.

Por definición, en un documento XML bien formado, un ampersand literal debe ser escapado por una referencia de personaje, como el &amp; o &#38; , o &#x26;

Recuerde : una cadena que se representa como (parte de) un nodo de texto XML, o dentro de un árbol HTML, puede no parecerse a la misma cadena cuando se representa como texto. Sin embargo, estas son dos representaciones diferentes de la misma cadena.

Para comprender mejor este simple hecho, haga lo siguiente :

Tome la transformación anterior y reemplace la declaración xsl:output :

<xsl:output method="text"/>

Con este:

<xsl:output method="xml"/>

Además, rodee la salida en un solo elemento XML. También puedes intentar usar diferentes escapes para el símbolo comercial. La transformación ahora puede verse así:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" method="xml"/> <xsl:variable name="vX" select="''x''"/> <xsl:variable name="vY" select="''y''"/> <xsl:variable name="vZ" select="''z''"/> <xsl:template match="/"> <t> <xsl:value-of select= "concat(''http://www.myUrl.com/?vA=a&amp;vX='', $vX, ''&#38;vY='', $vY, ''&#x26;vZ='', $vZ)"/> </t> </xsl:template> </xsl:stylesheet>

Y el resultado es :

<t>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z</t>

Obtendrá el mismo resultado con el método de salida html .

Pregunta :

¿La URL que se envía es diferente (o incluso "dañada") a la salida de la primera transformación?

Respuesta :

No, en ambos casos se produjo la misma cadena; sin embargo, en cada caso se utilizó una representación diferente de la cadena.

Pregunta :

¿Debo usar el atributo DOE ( disable-output-escaping="yes" ) para generar la URL deseada?

Respuesta :

No, como se muestra en la primera transformación.

Pregunta :

¿Se recomienda utilizar el atributo DOE ( disable-output-escaping="yes" ) para generar la URL deseada?

Respuesta :

No, usar DOE es una mala práctica en XSLT y generalmente una señal de que el programador no tiene una buena comprensión del modelo de procesamiento XSLT. Además, DOE es solo una característica opcional de XSLT 1.0 y es posible que su procesador XSLT no implemente DOE, o incluso si lo hace, podría tener problemas para ejecutar la misma transformación con otro procesador XSLT.

Pregunta

Vine de un problema diferente a la pregunta por la que hice una recompensa. Mi problema: intento generar este método onclick:

<input type="submit" onClick="return confirm(''are you sure?'') && confirm(''seriously?'');" />

Lo que puedo hacer es: puedo colocar las confirmaciones en una función ... ¡pero me dice que no puedo hacer una y dentro de un atributo! La solución de esta pregunta es la solución de mi problema, creo.

Responder

En realidad, puede especificar la operación && Boolean dentro de una expresión de JavaScript dentro de un atributo, representándolo como &amp;&amp;

Aquí hay un ejemplo completo , que todos pueden ejecutar, como hice en tres navegadores: Chrome, Firefox 41.1.01 e IE11:

HTML :

<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="style.css"> <script src="script.js"></script> </head> <body> <h1>Hello Plunker!</h1> <input type="submit" onClick="alert(confirm(''are you sure?'') &amp;&amp; confirm(''seriously?''));" /> </body> </html>

JavaScript (script.js):

function confirm(message) { alert(message); return message === ''are you sure?''; }

Cuando ejecuta esto, primero obtendrá esta alerta:

Luego, después de hacer clic en el botón OK , obtendrá la segunda alerta:

Y después de hacer clic en OK , finalmente obtendrá la alerta que produce el resultado de la operación && :

Puede jugar con este código variando los valores de los argumentos pasados ​​a la función de confirm() y verificará que los resultados producidos sean los de usar el operador && .

Por ejemplo, si cambia el elemento <input> a esto:

<input type="submit" onClick="alert(confirm(''really sure?'') &amp;&amp; confirm(''seriously?''));" />

Recibirá primero esta alerta:

Y cuando haces clic en OK , obtendrás de inmediato el resultado final de la operación && :

La segunda alerta se omite, porque el primer operando de la operación && fue false y JavaScript está atacando un && donde el primer operando es false .

Para resumir :

Es fácil usar el operador && dentro de un atributo, en un documento HTML generado por XSLT, al especificar el && operando como &amp;&amp;


Simplemente reemplace y con

<![CDATA[&]]>

en los datos. EX: XML de datos

<title>Empire <![CDATA[&]]> Burlesque</title>

Etiqueta XSLT:

<xsl:value-of select="title" />

Salida: Imperio y Burlesque