2009-04-13 18 views
15

Sto provando ad emettere il valore di stringa letterale di una variabile, dopo che è stato impostato a seconda che esista o meno un nodo. Penso che la logica di controllo delle condizioni sia corretta. Ma non è outputing i valori ...<xsl: variable> Stampa il valore della variabile XSL utilizzando <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" /> 

voglio che l'uscita della stringa letterale di una "vera" di "false". Ma non sta producendo nulla. Per favore aiuto! Grazie!!!

risposta

17

In questo caso non condizionali sono necessari per impostare la variabile.

Questa espressione XPath-liner:

boolean(joined-subclass) 

è true() solo quando il bambino del nodo attuale, denominate joined-subclass esiste ed è false() altrimenti.

Il foglio di stile completo è:

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

Do atto, che l'uso della funzione XPath boolean() in questa espressione è convertire un nodo (o il suo absense) ad una delle valori booleani true() o false().

7

Il tuo problema principale è pensare che la variabile dichiarata al di fuori del modello sia la stessa variabile "impostata" all'interno dell'istruzione di scelta. Non è così che funziona XSLT, la variabile non può essere riassegnata. Questo è qualcosa di più simile a ciò che si vuole:

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

E se avete bisogno la variabile di avere portata "globale", allora dichiararla al di fuori del modello:

<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

In XSLT stesso <xsl:variable> può essere dichiarato solo una volta e può essere assegnato un valore solo alla sua dichiarazione. Se più di una variabile viene dichiarata allo stesso tempo, sono in realtà variabili diverse e hanno un ambito diverso.

Pertanto, il modo per raggiungere l'impostazione condizionale voluto della variabile e produrre il suo valore è la seguente:

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

Quando alla suddetta trasformazione viene applicata sul seguente documento XML:

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

il risultato voluto è prodotto:

012.
subexists: true