Solución:
Considerando la hoja de estilo XSLT como un DOM XML, un elemento de declaración de variable hace que la variable sea visible para todos los hermanos siguientes y sus descendientes. Esto permite a los procesadores XSLT analizar estáticamente cualquier XPath que contenga una referencia de variable para ver si la variable existe; si la declaración de la variable existe en el eje del hermano anterior o del ancestro, la referencia de la variable es legal, de lo contrario no lo es.
Tenga en cuenta que esto depende completamente de la estructura del XSLT, no de la estructura del XML que está procesando. El procesador XSLT puede y debe producir un error si una expresión XPath usa una variable que no existe.
No hay forma de verificar esta condición dentro de XSLT porque esta condición no es legal dentro de XSLT. La situación que describió en su comentario: “La idea es establecer una variable de marca si se emite algo y luego mostrar un mensaje diferente si no se emite nada”. – en realidad debería resultar en un error de sintaxis. Por ejemplo, si haces algo como esto:
<xsl:if test="some_condition">
<!-- produce output here -->
<xsl:variable name="flag">true</xsl:variable>
</xsl:if>
<!-- time passes -->
<xsl:if test="$flag='true'>
<!-- wouldn't it be nice? -->
</xsl:if>
obtendrá un error de sintaxis: el segundo xsl:if
El elemento no es un hermano siguiente de la declaración de variable ni uno de sus descendientes.
Aquí hay una técnica que uso bastante: esto produce una salida variable basada en una variedad de condiciones diferentes que no desea volver a verificar más adelante:
<xsl:variable name="output">
<xsl:if test="$condition1='true'">
<p>condition1 is true</p>
</xsl:if>
<xsl:if test="$condition2='true'">
<p>condition2 is true</p>
</xsl:if>
<xsl:if test="$condition3='true'">
<p>condition3 is true</p>
</xsl:if>
</xsl:variable>
<!-- we've produced the output, now let's actually *output* the output -->
<xsl:copy-of select="$output"/>
<!-- time passes -->
<xsl:if test="normalize-space($output) != ''">
<p>This only gets emitted if $output got set to some non-empty value.</p>
</xsl:if>
Hacer esta pregunta indica que no comprendió completamente el punto clave de XSLT. 🙂
Es declarativo: nada puede existir a menos que lo declares. Declaras una variable, luego está ahí, no lo haces, entonces no lo está.
Ni una sola vez habrá el punto en el que tenga que preguntarse, mientras codifica, si existe una determinada variable.
XSLT tiene reglas de alcance estrictas, las variables existen solo dentro del alcance de su elemento padre (y no todos los elementos pueden contener variables para empezar). Una vez que deja el elemento padre, la variable desaparece.
Entonces, a menos que especifique su pregunta / intención un poco más, la única respuesta válida es que la pregunta es incorrecta. No se puede y no es necesario compruebe si existe una variable en tiempo de ejecución.
Las variables XSL tienen un alcance estricto, por lo que no puede acceder a ellas en los nodos hermanos, solo en los hijos. Si se trata de params, puede utilizar un global <xsl:param />
.
Ver: http://www.stylusstudio.com/xsllist/199911/post30020.html