2009-04-13 24 views
15

Estoy tratando de generar el valor de una 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 se outputing los valores ...<xsl: variable> Imprime el valor de la variable XSL usando <xsl: value-of>

<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" /> 

lo quiero dar salida a la cadena literal de "true" de "falsa". Pero no está produciendo nada. ¡Por favor ayuda! ¡¡¡Gracias!!!

Respuesta

17

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() sólo cuando el niño del nodo actual, el nombre joined-subclass existe y es false() lo 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> 

hacer la nota, que el uso de la función XPath boolean() en esta expresión es convertir un nodo (o su ausencia) a una de las valores booleanos true() o false().

7

Su problema principal es pensar que la variable que declaró fuera de la plantilla es la misma variable que se "establece" dentro de la instrucción Choose. Así no es como funciona XSLT, la variable no puede ser reasignada. Esto es algo más parecido a lo que quiere:

<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 la variable a tener un alcance "global" y luego declarar 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> 
6

En XSLT mismo <xsl:variable> puede se declarará solo una vez y solo se le puede dar un valor en su declaración. Si se declaran más de una variable al mismo tiempo, de hecho son variables diferentes y tienen diferente alcance.

Por lo tanto, el camino para lograr el ajuste condicional querido de la variable y producir su valor es el 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 se aplica la transformación anterior en el siguiente documento XML:

<class> 
<joined-subclass/> 
</class> 

el resultado buscado es:

subexists: true 
Cuestiones relacionadas