2010-09-03 12 views
10

Tengo que crear una variable XSL con una opción en ella. Como la siguiente:¿Cómo puedo eliminar espacios en blanco al declarar una variable XSL?

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1"> 
     inside 
    </xsl:when> 
    <xsl:otherwise> 
     outside 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Y más tarde en mi código, hago un XSL si:

<xsl:if test="$grid_position = 'inside'"> 
    {...code...} 
</xsl:if> 

problema es que mi variables no es = 'interior' a causa de los saltos de línea y guión. ¿Cómo puedo eliminar espacios en blanco de mi variable? Sé que puedo eliminarlo usando disable-output-escaping="yes" cuando lo uso en xsl: copy-of, pero no está funcionando en la etiqueta xsl: variable. Entonces, ¿cómo puedo eliminar esos espacios en blanco y saltos de línea?

+0

Buena pregunta (+1). Vea mi respuesta para una breve expresión de XPath de una línea para su '' :) –

Respuesta

16

Eso es lo <xsl:text> es para:

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1"> 
     <xsl:text>inside</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>outside</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

Se le permite estructurar su código y de control espacios en blanco al mismo tiempo.

De hecho, debe mantenerse alejado de los nodos de texto en XSL que no están envueltos en <xsl:text> para evitar este tipo de errores en el futuro, también (es decir, cuando el código se formatea o se vuelve a factorizar posteriormente).

Para casos simples, como en la muestra, hacer what Jim Garrison suggests también es una opción.


Como un aparte, las pruebas de la existencia de un elemento con count() es superfluo. Seleccionarlo es suficiente, ya que el conjunto de nodos vacío se evalúa como false.

<xsl:when test="/Element"> 
+0

Gracias por esta solución Tomalak, ¡está funcionando perfectamente! – Gabriel

+0

@Gabriel: De nada.:) – Tomalak

+0

+1 para la explicación del valor booleano del conjunto de nodos –

4

La forma más sencilla es no poner el espacio en blanco que hay en el primer lugar:

<xsl:variable name="grid_position"> 
    <xsl:choose> 
    <xsl:when test="count(/Element) &gt;= 1">inside</xsl:when> 
    <xsl:otherwise>outside</xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
+0

+1 solución más simple. – Tomalak

+0

+1 por la forma más simple –

+2

Gracias por su respuesta, pero respondí con la respuesta de Tomalak porque no quiero que mi código se rompa si alguien reformatea el código xsl para agregar un salto de línea. – Gabriel

1

sólo tiene que utilizar:

+0

+1 para una expresión de línea –

+0

+1 para este gran consejo. A menudo extraño al operador ternario "?:" De C/Java/JavaScript. – dolmen

2

Las estrategias en las otras respuestas son buenas, de hecho preferible a éste cuando sea posible. Pero hay momentos en los que no tienes control (o es más difícil controlar) qué hay en la variable. En esos casos, se puede despojar el espacio circundante cuando se está probando la variable:

En lugar de

<xsl:if test="$grid_position = 'inside'"> 

uso

<xsl:if test="normalize-space($grid_position) = 'inside'"> 

normalize-space() tiras de los principales y con espacios en blanco, y se derrumba otros espacios blancos que se repiten para solos.

+0

+1 Esa es la respuesta obvia que hasta ahora ha faltado. Almacenar espacio en blanco excedente y luego volver a pelarlo no es elegante, pero a veces no hay forma de evitarlo, p. cuando no tienes influencia en el XML. – Tomalak

Cuestiones relacionadas