89 Stimmen

Wie erstellt man einen booleschen Wert?

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

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

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

Sie kehrt immer dann wahr zurück, wenn sie eigentlich falsch sein sollte. Warum?

173voto

Dimitre Novatchev Punkte 234995

Der Wert der Variablen $var, wie in definiert:

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

ist

   true()

Dies liegt daran, dass in XPath " false " ist eine gewöhnliche Zeichenkette, im Gegensatz zu false() der der Konstruktor für die boolean Wert false()

Die beiden booleschen Werte in XPath sind (Beachten Sie, dass sie konstruiert sind!):

   true() und false()

Die Einzelheiten der Umwandlung eines beliebigen Wertes in einen booleschen Wert sind in der XPath-Spezifikation .:

"Die boolean wandelt ihr Argument wie folgt in einen booleschen Wert um:

  • eine Zahl ist wahr, wenn und nur wenn sie weder eine positive oder negative Null ist noch NaN

  • eine Knotenmenge ist wahr, wenn und nur wenn sie nicht-leer ist

  • eine Zeichenkette ist wahr, wenn und nur wenn ihre Länge ungleich Null ist

  • ein Objekt von einem anderen Typ als den vier Grundtypen wird in Abhängigkeit von diesem Typ in einen Booleschen Wert umgewandelt "

In Ihrem Fall ist die Zeichenkette "false" nicht die Zahl 0 und hat eine positive Länge, so dass die Regel im dritten Aufzählungspunkt oben angewandt wird und folgendes ergibt true() .

Um also eine Variable in XSLT 1.0 zu definieren, deren Wert false() muss man die Definition wie folgt schreiben:

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

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

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

(geben Sie einen beliebigen Ausdruck an, der den Wert false() ) und der XSLT-Prozessor wird die Arbeit für Sie erledigen.

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

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

18voto

Yuval Adam Punkte 155168

Die von Ihnen verwendete Funktion boolean() erfüllt tatsächlich ihre Aufgabe. Für die Verwendung von expliziten true und false Werten 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() das Folgende zurück:

  • Wenn das Argument eine negative oder positive Zahl ist, wird es in den booleschen Wert true umgewandelt.
  • Wenn das Argument Null oder ein NaN-Wert ist, wird es in false umgewandelt.
  • Ist das Argument eine nicht leere Knotenmenge, wird es in true umgewandelt. Ein leeres Node-Set wird in false umgewandelt.
  • Wenn das Argument eine nicht leere Zeichenkette ist, wird es in true umgewandelt . Ein leerer String wird in false umgewandelt.
  • Handelt es sich bei dem Argument um ein Objekt eines anderen Typs als den vier Grundtypen, wird es in Abhängigkeit von diesem Typ in einen Booleschen Wert umgewandelt.

5voto

outofcoolnames Punkte 182

Ein bisschen spät in diesem Stadium vielleicht, aber imo Umgang mit Booleschen ist einfach nicht wert die Mühe. Hier ist, wie ich mit einem booleschen (obligatorisch) aus der DB zurück behandelt:

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

Hoffentlich hilft das jemandem

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X