Come creare un valore booleano?


86

Sono totalmente nuovo su XSLT e non riesco a capire dove sto sbagliando con il seguente codice.

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

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

Restituisce sempre vero quando deve essere falso. Perché?


3
Solo un suggerimento, ma potresti ottenere un calibro di risposta migliore se scrivi il titolo come una domanda corretta ed eviti di parlare.
Will Dean

Risposte:


168

Il valore della variabile $ var come definito in:

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

è

   true()

Questo perché in XPath " false" è una stringa normale, al contrario di false(), che è il costruttore del booleanvalorefalse()

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

   true() e false()

I dettagli della conversione di qualsiasi valore in booleano sono indicati nelle specifiche XPath .:

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

  • un numero è vero se e solo se non è né zero né positivo né negativo né NaN

  • un insieme di nodi è vero se e solo se non è vuoto

  • una stringa è vera se e solo se la sua lunghezza è diversa da zero

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

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

Pertanto, per definire una variabile in XSLT 1.0, il cui valore è false() , è necessario scrivere la definizione come segue:

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

oppure, se non ricordi esattamente questo, potresti sempre scrivere:

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

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

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

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


@DimitreNovatchev Ciao Dimitre. Questa è la soluzione se il valore booleano è hardcoded nel file di trasformazione XSL. C'è una soluzione ordinata per falsee truestringhe provenienti dal file di essere sotto di trasformazione che non coinvolge stringa di confronto?
Jagger

1
@ Jagger, questa è 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 chiedere cosa c'è di sbagliato nel confronto delle stringhe?
Dimitre Novatchev

17

La funzione boolean () che stai utilizzando sta effettivamente facendo il suo lavoro. Per utilizzare valori true e false espliciti è necessario utilizzare le seguenti funzioni:

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

FYI, per la documentazione MSDN , boolean () restituisce quanto segue:

  • 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 true . 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.

Dovresti riformattare il penultimo elemento dell'elenco per risaltare di più, poiché è quello cruciale. "boolean ('')" produrrebbe anche false.
Tomalak

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

1
@ Dimitre: non credo che MSDN si discosti troppo dalle specifiche W3C a questo proposito. :) Ma indicare è ovviamente più corretto.
Tomalak

5

Forse un po 'tardi in questa fase, ma non vale la pena occuparsi di booleani. Ecco come ho gestito un booleano (Obbligatorio) che tornava 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.