xslt - define - xml variable
<xsl: variable> Imprima el valor de la variable XSL usando<xsl: value-of> (3)
Estoy tratando de generar el valor de cadena literal de una variable, después de que se establezca dependiendo de si existe un nodo o no. Creo que la lógica de verificación de condición es correcta. Pero no está dando salida a los valores ...
<xsl:variable name="subexists"/>
<xsl:template match="class">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
<xsl:choose>
<xsl:when test="joined-subclass">
<xsl:variable name="subexists" select="''true''"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="subexists" select="''false''"/>
</xsl:otherwise>
</xsl:choose>
subexists: <xsl:value-of select="$subexists" />
Quiero que muestre la cadena literal de "true" de "false". Pero no está dando salida a nada. ¡Por favor ayuda! ¡¡¡Gracias!!!
Su problema principal es pensar que la variable que declaró fuera de la plantilla es la misma variable que se está "configurando" dentro de la declaración de elección. No es así como funciona XSLT, la variable no se puede reasignar. Esto es algo más parecido a lo que quieres:
<xsl:template match="class">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
subexists: <xsl:value-of select="$subexists" />
</xsl:template>
Y si necesita que la variable tenga un alcance "global", entonces declare fuera de la plantilla:
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="/path/to/node/joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:template match="class">
subexists: <xsl:value-of select="$subexists" />
</xsl:template>
En XSLT, la misma <xsl:variable>
se puede declarar solo una vez y se le puede dar un valor solo en su declaración. Si se declaran más de una variable al mismo tiempo, de hecho son variables diferentes y tienen un alcance diferente.
Por lo tanto, la manera de lograr la configuración condicional deseada de la variable y producir su valor es la siguiente:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="class">
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
subexists: <xsl:text/>
<xsl:value-of select="$subexists" />
</xsl:template>
</xsl:stylesheet>
Cuando la transformación anterior se aplica en el siguiente documento XML :
<class>
<joined-subclass/>
</class>
Se produce el resultado deseado :
subexists: true
En este caso, no se necesitan condicionales para establecer la variable .
Esta expresión XPath de una sola línea:
boolean(joined-subclass)
es true()
solo cuando existe el hijo del nodo actual, denominado joined-subclass
y es false()
contrario.
La hoja de estilo completa es :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="class">
<xsl:variable name="subexists"
select="boolean(joined-subclass)"
/>
subexists: <xsl:text/>
<xsl:value-of select="$subexists" />
</xsl:template>
</xsl:stylesheet>
Tenga en cuenta que el uso de la función XPath boolean()
en esta expresión es para convertir un nodo (o su ausencia) a uno de los valores booleanos true()
o false()
.