2008-12-06 14 views
79

Sono totalmente nuovo a XSLT e non riesco a capire dove sto andando male con il seguente codice.Come creare un valore booleano?

<xsl:variable name="var" select="boolean('false')"/> 

<xsl:if test="$var'">variable is true</xsl:if> 

Viene sempre restituito vero quando è destinato ad essere falso. Perché?

+2

Solo un suggerimento, ma si può anche ottenere una migliore calibro di risposta se si scrive il titolo come una domanda corretta ed evitare la l33t parlare. –

+0

Grazie ragazzi, mi dispiace per quello. – sydlawrence

risposta

160

Il valore della variabile $ var come definito in:

      <xsl:variable name="var" select="boolean('false')"/>

è

      true()

Questo è becaus e in XPath "false" è una stringa normale, al contrario di false(), che è il costruttore per il valore booleanfalse()

I due valori booleani in XPath sono (si noti che sono costruiti!):

      true() e false()

Il dettaglio di conve il valore di qualsiasi valore booleano è indicato nello XPath Spec.:

"La funzione boolean converte il suo argomento un booleano come segue:

  • un numero è vero se e solo se è né positivo o negativo nullo né NaN

  • un node-set è true se e solo se è non vuoto

  • una stringa è vera se e solo se è lunghezza è non-zero

  • un oggetto di un tipo diverso da quattro tipi di base viene convertito in un valore booleano in un modo che dipende da quel tipo "

Nel caso la stringa "false" non è il numero 0 e ha una lunghezza positiva, quindi viene applicata la regola nel terzo punto sopra, che produce true().

Pertanto, per definire una variabile in XSLT 1.0, il cui valore èfalse(), si ha la necessità di scrivere la definizione come segue:

      <xsl:variable name="vMyVar" select="false()"/>

o, se non esattamente ricordare questo, si può sempre scrivere:

      <xsl:variable name="vMyVar" select="1 = 0"/>

(specificare qualsiasi espressione che restituisce false()) e il processore XSLT farà il lavoro per voi.

In XSLT 2.0 è sempre meglio specificare esplicitamente il tipo della variabile:

      <xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>

+0

@DimitreNovatchev Hi Dimitre. Questa è la soluzione se il valore booleano è hardcoded nel file di trasformazione XSL.Esiste una soluzione per le stringhe 'false' e' true' che provengono dal file in corso di trasformazione che non prevede il confronto delle stringhe? – Jagger

+1

@Jagger, questo è per un'altra domanda. Questa domanda chiede "* Come creare un valore booleano *" e ha la sua risposta precisa. Stai chiedendo: "* Come interpretare (o analizzare) stringhe particolari in valori booleani *" - questa è una domanda completamente diversa. Posso chiederti cosa c'è di sbagliato nel confronto delle stringhe? –

16

La funzione booleana() utilizzata sta effettivamente svolgendo il proprio lavoro. Per utilizzare i valori vero e falso esplicite è necessario utilizzare le seguenti funzioni:

<xsl:variable name="var_false" select="false()"/> 
<xsl:variable name="var_true" select="true()"/> 

Cordiali saluti, per il MSDN documentation, boolean() restituisce il seguente:

  • Se l'argomento è un numero negativo o positivo , viene convertito nel valore booleano true.
  • Se l'argomento è zero o un valore NaN, viene convertito in falso.
  • Se l'argomento è un set di nodi non vuoto, viene convertito in true. Un set di nodi vuoto viene convertito in falso.
  • Se l'argomento è una stringa non vuota, viene convertito in vero. Una stringa vuota viene convertita in false.
  • Se l'argomento è un oggetto di un tipo diverso dai quattro tipi di base, viene convertito in un booleano in un modo che dipende da quel tipo.
+0

Dovresti riformattare il penultimo elemento del tuo elenco per far risaltare di più, in quanto è cruciale. "boolean ('')" produce anche false. – Tomalak

+2

@Tomalak, vedi la mia risposta. È un po 'più dettagliato e cita la vera fonte: la specifica XPath W3C, piuttosto che "MSDN". –

+1

@Dimitre: Non penso che MSDN si discosti troppo dalle specifiche del W3C a questo riguardo. :) Ma indicare * là * è ovviamente più corretto. – Tomalak

5

un po 'tardi, in questa fase, forse, ma imo trattare con booleani è solo non vale la pena lo sforzo. Ecco come ho affrontato con un valore booleano (obbligatorio) di ritorno dal DB:

<xsl:variable name="vTrue" select="true()"/>      
    <xsl:choose> 
     <xsl:when test="string(Mandatory) = string($vTrue)"> 
     <xsl:text>Mandatory</xsl:text> 
     </xsl:when> 
     <xsl:otherwise>   
     </xsl:otherwise> 
    </xsl:choose> 

Spero che questo aiuti qualcuno