Wie erstelle ich einen booleschen Wert?

85

Ich bin völlig neu in XSLT und kann mit dem folgenden Code nicht herausfinden, wo ich falsch liege.

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

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

Es gibt immer wahr zurück, wenn es falsch sein soll. Warum?

sydlawrence
quelle
3
Nur ein Vorschlag, aber Sie erhalten möglicherweise ein besseres Antwortkaliber, wenn Sie Ihren Titel als richtige Frage schreiben und vermeiden, dass Sie sprechen.
Will Dean

Antworten:

167

Der Wert der Variablen $ var wie definiert in:

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

ist

   true()

Dies liegt daran, dass in XPath " false" im Gegensatz zu " " eine gewöhnliche Zeichenfolge ist false(), die der Konstruktor für den booleanWert istfalse()

Die zwei booleschen Werte in XPath sind (beachten Sie, dass sie konstruiert sind!):

   true() und false()

Die Details zum Konvertieren eines Werts in einen Booleschen Wert sind in der XPath- Spezifikation aufgeführt :

"Die boolesche Funktion konvertiert ihr Argument wie folgt in einen booleschen Wert:

  • Eine Zahl ist genau dann wahr, wenn sie weder eine positive oder negative Null noch NaN ist

  • Ein Knotensatz ist genau dann wahr, wenn er nicht leer ist

  • Ein String ist genau dann wahr, wenn seine Länge ungleich Null ist

  • Ein Objekt eines anderen Typs als der vier Grundtypen wird in einer von diesem Typ abhängigen Weise in einen Booleschen Wert konvertiert. "

In Ihrem Fall ist die Zeichenfolge "false" nicht die Zahl 0 und hat eine positive Länge. Daher wird die Regel im obigen dritten Aufzählungszeichen angewendet und ergibt true().

Um eine Variable in XSLT 1.0 zu definieren, deren Wert lautet false() , muss die Definition daher wie folgt geschrieben werden:

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

oder, wenn Sie sich nicht genau daran erinnern, können Sie immer schreiben:

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

(Geben Sie einen Ausdruck an, der ausgewertet wird false()), und der XSLT-Prozessor erledigt die Arbeit für Sie.

In XSLT 2.0 ist es immer besser, den Typ der Variablen explizit anzugeben :

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

Dimitre Novatchev
quelle
@ DimitreNovatchev Hallo Dimitre. Dies ist die Lösung, wenn der boolesche Wert in der XSL-Transformationsdatei fest codiert ist. Gibt es eine saubere Lösung für falseund trueZeichenfolgen, die aus der zu transformierenden Datei stammen und keinen Zeichenfolgenvergleich beinhalten?
Jagger
1
@ Jagger, das ist für eine andere Frage. Diese Frage fragt " Wie erstelle ich einen Booleschen Wert? " Und hat ihre genaue Antwort. Sie fragen: " Wie man bestimmte Zeichenfolgen in Boolesche Werte interpretiert (oder analysiert) " - dies ist eine ganz andere Frage. Darf ich fragen, was am Stringvergleich falsch ist?
Dimitre Novatchev
17

Die von Ihnen verwendete Funktion boolean () erledigt tatsächlich ihre Aufgabe. Um explizite wahre und falsche Werte zu verwenden, sollten Sie die folgenden Funktionen verwenden:

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

Nur zu Ihrer Information, gemäß der MSDN-Dokumentation gibt boolean () Folgendes zurück:

  • Wenn das Argument eine negative oder positive Zahl ist, wird es in den Booleschen Wert true konvertiert.
  • Wenn das Argument Null oder ein NaN-Wert ist, wird es in false konvertiert.
  • Wenn das Argument eine nicht leere Knotenmenge ist, wird es in true konvertiert. Ein leerer Knotensatz wird in false konvertiert.
  • Wenn das Argument eine nicht leere Zeichenfolge ist, wird es in true konvertiert . Eine leere Zeichenfolge wird in false konvertiert.
  • Wenn das Argument ein Objekt eines anderen Typs als der vier Grundtypen ist, wird es in einer von diesem Typ abhängigen Weise in einen Booleschen Wert konvertiert.
Yuval Adam
quelle
Sie sollten das vorletzte Element Ihrer Liste neu formatieren, um mehr hervorzuheben, da es das entscheidende ist. "boolean ('')" würde ebenfalls false erzeugen.
Tomalak
2
@Tomalak, siehe meine Antwort. Es ist etwas detaillierter und zitiert die wahre Quelle: die W3C XPath-Spezifikation anstelle von "MSDN".
Dimitre Novatchev
1
@ Dimitre: Ich denke nicht, dass MSDN in dieser Hinsicht zu sehr von der W3C-Spezifikation abweicht. :) Aber dort zu zeigen ist natürlich korrekter.
Tomalak
5

Ein bisschen spät in dieser Phase vielleicht, aber imo Umgang mit Booleschen ist einfach nicht die Mühe wert. Hier ist, wie ich mit einem Booleschen Wert (Obligatorisch) umgegangen bin, der von der DB zurückgekommen ist:

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

Hoffe das hilft jemandem

outofcoolnames
quelle