2011-06-08 17 views
7

tengo que hacer esto:XSLT necesita seleccionar una comilla simple

<xsl:with-param name="callme" select="'validateInput(this,'an');'"/> 

He leído Escape single quote in xslt concat function y me dice para reemplazar ' con &apos; lo he hecho sin embargo, su aún no funciona ..

¿alguien sabe cómo podemos solucionar este problema ?:

<xsl:with-param name="callme" select="'validateInput(this,&apos;an&apos;);'"/> 
+0

Buena pregunta, 1. Vea mi respuesta para una técnica útil que permite mezclar fácilmente cualquier carácter especial en una cadena. –

Respuesta

9

Algo simple que se puede utilizar en cualquier versión de XSLT:

<xsl:variable name="vApos">'</xsl:variable> 

estoy con frecuencia utilizando la misma técnica para especificar una cotización:

<xsl:variable name="vQ">"</xsl:variable> 

A continuación, se puede intercalar cualquiera de estas variables en cualquier texto usando la función XPath estándar concat():

concat('This movie is named ', $vQ, 'Father', $vApos, 's secrets', $vQ) 

Así , esta transformación:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

    <xsl:variable name="vApos">'</xsl:variable> 
    <xsl:variable name="vQ">"</xsl:variable> 

    <xsl:template match="/"> 
     <xsl:value-of select= 
     "concat('This movie is named ', $vQ, 'Father', $vApos, 's secrets', $vQ) 
    "/> 
    </xsl:template> 
</xsl:stylesheet> 

produce:

This movie is named "Father's secrets" 
1

uso & quot; en lugar de & apos; (al utilizar & apos; efectivamente anida comillas simples dentro de comillas simples, necesita alternar comillas simples y dobles mientras anida, escapando según sea necesario).

+0

'"' es '" ', no' ''. – Flynn1179

+0

sí, y eso es lo que se requiere en este punto (no hace ninguna diferencia en la expresión XPath normalmente). Si por alguna razón peculiar es que es realmente necesario tener comillas simples en la cadena, es necesario alternar el simple/doble de manera diferente como así: alexbrn

+0

Pero mi punto es que ' es parte del valor que se proporciona; cambiándolo a " cambia el valor que se pasa; eso es muy diferente. Obviamente es código de programa, y ​​en algún lenguaje, las cadenas están encerradas en ''', no '" ', como Delphi. – Flynn1179

3

Esto es un poco difícil, pero hay que invertir el apóstrofe y cotizaciones, así:

<xsl:with-param name="callme" select='"validateInput(this,&apos;an&apos;);"' /> 

Estás encierra una cadena dentro de un conjunto de citas, y el valor del atributo que lo contiene en otro. En XSLT, las comillas que usa son intercambiables en ambos casos, siempre que no use el mismo.

Anteriormente, su &apos; se está analizando como se estaba leyendo el valor del atributo match, y que estaba tratando de establecer el valor de la selección para 'validateInput(this,'an');'. Aunque técnicamente es un valor de cadena válido, cuando XSLT lo procesa, no lo analiza porque intenta leerlo como un literal de cadena, que finaliza prematuramente antes del an, ya que se utiliza el mismo apóstrofo que se utilizó para encerrarlo la cuerda.

+0

que es bastante retrasado de la xslt team lol – Pacerier

4

En XSLT 2.0 se puede el carácter utilizado como delimitador de serie, duplicando, por lo

<xsl:with-param name="callme" select="'validateInput(this,''an'');'"/> 

Otra solución es utilizar variables:

<xsl:variable name="apos">'</xsl:variable> 
<xsl:variable name="quot">"</xsl:variable> 

<xsl:with-param name="callme" select="concat('validateInput(this,', $apos, 'an', $apos, ');')"/> 
Cuestiones relacionadas