2012-09-13 117 views
20

Traté de subcadena de datos con comilla simple en XSLT:cómo escapar comilla simple en función XSLT subcadena

String : DataFromXML:'12345' 

Resultado esperado: 12345

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:')"/> 

Resultado: '12345'

he intentado a continuación código

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&#39;')"/> 

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&apos;')"/> 

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/> 

error:

String literal was not closed 'DataFromXML:'--->'<--- 
+0

¿Usted intentó comillas dobles " ''"? – Vitaliy

+0

Sí, lo intenté obteniendo el error de compilación – buttowski

+0

@prabhu, It * es * posible extraer el número con una única expresión XPath 1.0 incluso en el caso más complicado cuando la cadena contiene tanto comillas como apóstrofes, sin usar ninguna variable en absoluto . –

Respuesta

20

Las normas generales para escapar son:

En 1.0:

  • si desea que el delimitador de atributo en una cadena literal, utilice el código XML forma de escape &quot; o &apos;
  • si quieres el delimitador de cadena en un literal de cadena, tiene una manguera

En 2.0:

  • si desea que el delimitador de atributo en una cadena literal, utilice el formulario de escape XML &quot; o &apos;
  • si desea que el delimitador de cadena en una cadena literal, duplicarlo (por ejemplo, 'Me puede '' t ')

El uso de una variable $ quot o $ apos como lo muestra Vitaliy puede hacer que el código sea mucho más claro.

+3

Michael, en realidad es posible extraer el número con una única expresión XPath 1.0 incluso en el caso más complicado cuando la cadena contiene tanto comillas como apóstrofes, sin usar ninguna variable. –

+2

Posible, sí, pero solo haciendo un uso tan fuerte de las referencias de entidad que el código se vuelve totalmente ilegible. ¿Y por qué las variables son tan malas de todos modos? - Un buen procesador los alineará. –

+5

No tengo nada en contra del uso de variables; solo me refería a su afirmación de que "si desea el delimitador de cadena en un literal de cadena, es una manguera". Perdón por tratar de ser preciso. –

10

Esto debería funcionar:

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

... 

<xsl:value-of select="substring-before(substring-after($datafromxml, concat('DataFromXML:', $apos)), $apos)" /> 
+0

Sí ... funcionó Gracias .... – buttowski

+0

No estoy seguro acerca de las reglas de XPath 1.0 - probablemente también podría ser una solución más simple sin una variable especial – Vitaliy

+1

La mejor solución que he visto. Gracias. –

7

Usted podría intentar cambiar y "y" en su xsl: value-of

<xsl:value-of select='substring-before 
    (substring-after($datafromxml,"DataFromXML:&apos;"), "&apos;")'/> 

Alternativamente, usted podría hacer uso de la función de traducir para eliminar los molestos apóstrofos

<xsl:value-of select='translate 
    (substring-after($datafromxml,"DataFromXML:"), "&apos;", "")'/> 

No necesariamente es más agradable, pero elimina la necesidad de una variable.

4

Incluso en el caso más complicado - la cadena contiene un comillas y un apóstrofo - el número se puede extraer sin recurrir a las variables.

Supongamos que tenemos este documento XML:

<t>' "12345' "</t> 

y quieren extruct sólo el número.

En la siguiente transformación que utilizan una sola expresión XPath para hacer exactamente eso:

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

<xsl:template match="text()"> 
    <xsl:value-of select= 
    'substring-after(.,"&apos;") 
    '/> 
============== 
    <xsl:value-of select= 
    'substring-before(
     substring-after(substring-after(.,"&apos;"), &apos;&quot;&apos;), 
     "&apos;" 
         ) 
    '/> 
</xsl:template> 
</xsl:stylesheet> 

El resultado es:

"12345' " 
============== 
    12345 

hacer la nota: Tengo intencionadamente dos expresiones XPath: el propósito del primero es simplificar el entendimiento de lo expresado en el segundo XPath expre Ssion. Dejando sólo la última xsl:value-of en el cuerpo de la plantilla produce exactamente el resultado deseado:

12345 
Cuestiones relacionadas