2010-11-18 53 views
7

Estoy creando un archivo XSLT. Tengo una variable que toma valor del archivo XML. Pero puede suceder que no haya referencia en xml para el valor y en ese momento la variable XSL devolverá False/None (no sé). Deseo mantener la condición como, Si no hay ningún valor para la variable, use el predeterminado. ¿Cómo hacer eso?Cómo saber la variable tiene valor o no en XSLT

+0

posible duplicado de [En XSLT ¿cómo se prueba para ver si existe una variable?] (Http://stackoverflow.com/questions/1299808/in-xslt-how-do-you-test-to-see- if-a-variable-exists) –

Respuesta

18

Con los pocos datos que figuran en la pregunta, la prueba más simple que puede hacer es:

<xsl:if test="$var"> 
    ... 
</xsl:if> 

O usted podría utilizar xsl:choose si desea proporcionar una salida para el otro caso:

<xsl:choose> 
    <xsl:when test="not($var)"> <!-- parameter has not been supplied --> 
</xsl:when> 
    <xsl:otherwise> <!--parameter has been supplied --> </xsl:otherwise> 
</xsl:choose> 

El segundo ejemplo también manejará correctamente el caso de que la variable o parámetro no se haya suministrado con un valor real, es decir, es igual a la cadena vacía. Esto funciona porque not('') devuelve true.

+3

aunque podría poner 'test =" $ var! = '' "' un poco mejor si se prueba el contenido variable frente a la existencia. – scunliffe

+1

I segundo @scunliffe - si $ var existe, pero está vacío, 'test =" $ var "' todavía devolverá verdadero. Sin embargo, es posible que deba escribir 'test =" not ($ var = '') "' si está utilizando versiones anteriores de XSL. –

+0

@scunliffe: vea mi respuesta extendida para manejar cadenas vacías. –

0

En primer lugar, todas las variables tienen valores, porque XSLT pertenece al paradigma declarativo: no hay instrucción de asignación, pero cuando declaras la variable también declaras la expresión para su relación de valores.

Si este valor es un tipo de datos de conjunto de nodos (que se ve de su pregunta), entonces debe probar un conjunto de nodos vacío en caso de que no se haya seleccionado nada. El valor booleano efectivo para un conjunto de nodos vacío es falso. Entonces, como @0xA3 ha respondido: test="$node-set".

Usted escribió:

Si no hay ningún valor para la variable utilice la opción por defecto. Como hacer eso ?

Bueno, eso depende del tipo de tipo de datos que usted está buscando.

Supongamos que el tipo de datos de conjunto de nodos: si quieres $ 1 conjunto de nodos-valor o $ node-set-2 si $ node-set-1 está vacía, a continuación, utilizar:

$node-set-1|$node-set-2[not($node-set-1)] 
+0

@Alejandro: Esta es una buena respuesta, pero el OP no ha indicado en ninguna parte que el valor sea para mantener un conjunto de nodos. Puede ser solo una cadena ... –

+0

@Dimitre: Buen punto. Leí esta oración de esa manera: 'Tengo una variable que toma valor del archivo XML'. –

12

No has 't explicó a qué te refieres con "no tiene valor". Aquí es una solución genérica:

not($v) and not(string($v)) 

Esta expresión se evalúa si y sólo si true()$v "no tiene ningún valor".

Ambas condiciones deben cumplirse, debido a una cadena $v definido como '0' tiene un valor, pero es not($v)true().

En XSLT 1.0 se puede lograr un uso predeterminado de diferentes formas si el "valor" es un conjunto de nodos o si el valor es un escalar (como una cadena, un número o un booleano).

@Alejandro proporciona una forma de obtener un valor predeterminado si una variable que se supone que contiene un conjunto de nodos está vacía.

Si se supone que la variable para contener un escalar, a continuación, la siguiente expresión devuelve su valor (si tiene un valor) o (en caso contrario) el valor predeterminado deseado:

concat($v, substring($default, 1 div (not($v) and not(string($v))))) 
+0

¿Cómo puede ser una variable no establecida, incluso con un valor escalar? Solo un parámetro podría no estar configurado (y sin una expresión predeterminada). Solo en ese caso, el parámetro tomaría la cadena vacía como valor. –

+0

@Alejandro: Según [punto 11.] (http://www.w3.org/TR/xslt#variables) una variable * puede * estar vinculada a un valor. Si no hay un valor proporcionado explícitamente por un atributo de selección o el contenido del elemento de vinculación variable, el tercer punto del [punto 11.2] (http://www.w3.org/TR/xslt#variable-values) aplica el enlace la variable a una cadena vacía. –

+1

@ 0xA3: No. Dice que 'elemento de enlace variable puede especificar el valor de la variable de tres maneras alternativas', y la tercera forma es' elemento de enlace variable que tiene contenido vacío y no tiene un atributo de selección, entonces el el valor de la variable es una cadena vacía'. Entonces, tiene un valor bien definido. No existe tal cosa como ningún valor. –

0

I probado un montón de solución de SO, mi última solución fue tomada de @ dimitre-novatchev, pero esa también no funcionaba todo el tiempo. Recientemente encontré una solución más de la búsqueda aleatoria de Google, pensada para compartir con la comunidad.

Para verificar el valor de la variable vacía, podemos declarar una variable vacía y comparar su valor con las condiciones de prueba. Este es el fragmento de código:

<xsl:variable name="empty_string"/> 
<xsl:if test="testVariableValue != $empty_string"> 
... 
</xsl:if> 

aquí testVariableValue mantener el valor de la nueva variable a ensayar para el vacío escenario. Espero que ayude probar el estado variable vacío.

0

Puede usar string-length para comprobar, si una variable llamada $reference por ejemplo contiene algo.

<xsl:choose> 

    <xsl:when test="string-length($reference) > 0"> 
    <xsl:value-of select="$reference" /> 
    </xsl:when> 

    <xsl:otherwise> 
    <xsl:text>some default value</xsl:text> 
    </xsl:otherwise> 

</xsl:choose> 

Si es necesario el uso normalize-space, también.

Cuestiones relacionadas