2010-03-19 15 views
5

Tengo un problema con el texto con el símbolo de apóstrofeapóstrofe en XSL

ejemplo trato de probar este XML que tiene el símbolo es entonces cómo puedo comparar?

<xsl:for each select="country[nation='India's]"> 

esta es la declaración de error mostrando

Saludos Nanda.A

+2

@Nanda: Ya ha hecho muchas preguntas y recibió respuestas para todas ellas, pero no votó ni aceptó ninguna respuesta. Verifique si puede aceptar algunas de las respuestas que ha recibido hasta ahora. Se paga a las personas que han invertido su tiempo en sus problemas. – Tomalak

+0

@Nanda: también ayuda a los futuros usuarios que buscan un problema similar y se encuentran con esta pregunta: les dice que una respuesta en particular funcionó para usted. –

Respuesta

9

Una forma de hacerlo sería:

<xsl:variable name="apos" select='"&apos;"'/> 

<!-- ... later ... --> 

<xsl:for-each select="country[nation=concat('India', $apos, 's')]"> 

El problema aquí es doble:

  • XSLT no define ninguna forma de escape de caracteres en cadenas. Entonces 'India\'s' no es una opción.
  • Debe pasar por dos capas distintas de evaluación.

Estos son:

  1. XML bien formado: El documento XML XSLT su programa consiste debe estar bien formado. No puedes violar las reglas XML.
  2. Análisis de expresión XSLT: La cadena de valor de atributo resultante (después de que se realiza el análisis XML DOM) debe tener sentido para el motor XSLT.

Constructos gusta:

<xsl:for-each select="country[nation='India's']"> 
<xsl:for-each select="country[nation='India&apos;s']"> 

pasar la capa de XML pero violan la capa XSLT, porque en ambos casos el valor del atributo efectiva (tal como se almacena en el DOM) es country[nation='India's'], lo que claramente es una sintaxis XPath error.

constructos gustan:

<xsl:for-each select="country[nation=concat('India', "'", 's')]"> 
<xsl:for-each select="country[nation=concat("India", "&apos;", "s")]"> 

violan claramente la capa XML. Pero no violarían la capa XSLT (!), Ya que su valor real (si el documento XSLT podría analizarse en primer lugar) saldría como country[nation=concat('India', "'", 's')], lo cual es perfectamente legal como una expresión XPath.

Por lo tanto, debe encontrar la manera de atravesar tanto la capa 1 como la capa 2. Una forma es la forma variable que se muestra arriba. Otra forma es:

<xsl:for-each select="country[nation=concat('India', &quot;'&quot;, 's')]"> 

que aparecería a XSLT como country[nation=concat('India', "'", 's')].

Personalmente, me resulta más fácil trabajar con la "forma variable".