it-swarm-es.tech

No se puede hacer que xslt muestre un (&) incluso después de escapar del personaje

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

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

19
Bill

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

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

Estoy tratando de 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 que aparezca un símbolo & En XSLT.

Aquí hay una demostración ejecutable, corta y completa sobre 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 en cualquier documento XML fuente (ignorado) :

<t/>

se produce el resultado deseado y correcto:

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

En cuanto a los otros temas planteados en la pregunta:

Si escribo &amp; Sin etiquetas alrededor, entonces la salida del documento es &amp; Sin cambios.

La declaración anterior simplemente no es cierta ... Simplemente ejecute la transformación anterior y mire 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, una referencia de caracteres debe escapar a un símbolo de signo literal, como &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 único elemento XML. También puede intentar usar diferentes escapes para el ampersand. 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 muestra es diferente (o incluso "dañada") que la salida en la primera transformación?

Respuesta :

No, en ambos casos se generó 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 usar 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 es 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

Vengo de un problema diferente a la pregunta por la que hice una recompensa. Mi problema: trato de 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 molesta que no pueda hacer un & dentro de un atributo! La solución de esta pregunta es la solución de mi problema, creo.

Respuesta

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

Aquí hay un ejemplo completo , que todos pueden ejecutar, como lo 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 ejecute esto, primero recibirá esta alerta:

enter image description here

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

enter image description here

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

enter image description here

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

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

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

Primero recibirá esta alerta:

enter image description here

Y cuando hace clic en OK, obtendrá inmediatamente el resultado final de la operación &&:

enter image description here

La segunda alerta se omite porque el primer operando de la operación && Fue false y JavaScript está atajando 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, especificando el operando && Como &amp;&amp;

12
Dimitre Novatchev

¿Expresas el URI en HTML o XHTML? p.ej. <tag attr="http://foo.bar/?key=value&amp;key2=value2&amp;..."/> Si es así, "&amp; "es la forma correcta de expresar un ampersand en un valor de atributo, incluso si se ve diferente del URI literal que desea. Los navegadores decodificarán" &amp; "y cualquier otra referencia de entidad de caracteres antes de cargarlos o pasarlos a Flash. Para incrustar un literal, solitario" & "directamente en HTML o XHTML es incorrecto.

También recomiendo personalmente aprender más sobre XML para pensar sobre este tipo de cosas de una manera más clara. Por ejemplo, intente usar 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 el DOM me ayudó a pensar sobre la estructura de árbol de XML correctamente y cómo pensar sobre la codificación correcta de atributos y elementos.

10
user4010

Utilizar disable-output-escaping="yes" en tus value-of etiqueta

6
Thunder3

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

<xsl:output method="text"/>

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

4
ashirley

Si su transformación está emitiendo un documento XML, no debe deshabilitar el escape de salida. Usted quiere caracteres de marcado para escapar en la salida, para que no emita XML con formato incorrecto. El objeto XML con el que está procesando la salida (por ejemplo, un DOM) no escapará del texto por usted.

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

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

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

3
Robert Rossney

Solo reemplace y con

<![CDATA[&]]>

en los datos EJ: XML de datos

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

Etiqueta XSLT:

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

Salida: Imperio y Burlesque

1
Ram

Desactivar 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 de plantilla en una variable y usó disable-output-escaping = "yes" ..

1
Taran

Utilizando el disable-output-escaping atributo (un booleano) es probablemente la forma más fácil de lograr esto. Tenga en cuenta que puede usar esto no solo en <xsl:value-of/> pero también con <xsl:text>, que podría estar 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

0
tomasr

Debe tener en cuenta que puede utilizar deshabilitar-salida-escape 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-escape 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 está la cita:

Por lo tanto, es un error para deshabilitar la salida de escape para un <xsl:value-of /> o <xsl:text /> elemento 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

0
Nika

org.Apache.xalan.xslt.Process, la versión 2.7.2 da como resultado "Aquí hay una demostración ejecutable, breve y completa sobre cómo producir dicha URL" mencionada anteriormente:

<?xml version="1.0" encoding="UTF-8"?>http://www.myUrl.com/?vA=a&amp;vX=x&amp;vY=y&amp;vZ=z11522

La declaración XML se suprime con un omit-xml-declaration="yes" Adicional, pero sin embargo, con la salida method="text" Escapar de los símbolos no es justificable.

0
Peter Dolland