2010-06-03 9 views
6

WarumTest = "" auf einem boolean liefert immer wahr

<xsl:if test="<XPATH to boolean value here>"> 
... 
</xsl:if> 

immer true zurück?

Da Boolean per Definition 0,1, "false" und "true" sein kann, ist die einzige Möglichkeit, einen booleschen Wert zu testen, ein Stringvergleich mit diesen Werten. Das kann nicht stimmen.

+0

können Sie Ihren aktuellen XPath-Ausdruck bitte mit einem XML-Fragment veröffentlichen? –

+0

Das ist überhaupt keine Frage. Bitte geben Sie ein konkretes Beispiel an - was genau ist der XPath-Ausdruck und was ist die XML-Datei (bitte möglichst einfach), auf der dieser XPath-Ausdruck ausgewertet wird? –

+0

Bevorzugen Sie ein Beispiel, ich denke, es gibt einen kleinen Fehler in der Syntax. –

Antwort

8

Die test in <xsl:if> Werken angegeben, als ob es die boolean Funktion aufgerufen. Diese Funktion funktioniert nicht so, wie Sie vielleicht denken. Wenn sein Argument zu einem Node-Set ausgewertet wird (was der Fall sein wird, wenn Sie einen Pfad als sein Argument verwenden), wird es true zurückgeben, wenn das Node-Set nicht leer ist, andernfalls false. Sie testen effektiv auf die Existenz eines Elements, nicht auf seinen Wert. Wenn foo enthält false,

<xsl:if test="/path/to/foo"> 

wird immer als wahr ausgewertet, da das, was du wirklich in diesem Test gefragt ist „existiert dieses Element?“ und nicht "ist der Wert des Elements wahr?" Und das Element existiert.

Die Regel, die Boolesche Werte müssen true, false, 1 oder 0 ist ein Teil des XML-Schema (which see) und nicht XPath sein, die nichts über diese Regel nicht kennt. (XPath 1.0, ist, dass XPath 2.0/XQuery 1.0 hat the fn:boolean function, die intelligent macht, also XML-Schema bewusst, Auswertung der Boolesche Werte..) Um zu bestimmen, ob ein Wert in XSLT wahr ist, haben Sie es explizit überprüfen:

<xsl:if test="/path/to/foo = 'true' or /path/to/foo = '1'"> 
+0

Wenn ich http://www.w3.org/TR/xpath/#section-Boolean-Functions richtig lese, sollte zwischen den beiden Tests kein Unterschied bestehen. Tatsächlich wird xsl: if angegeben, um das Testergebnis wie durch einen Aufruf der booleschen Funktion zu konvertieren. –

+0

Weißt du, das wusste ich. Korrigiert. –

+0

In dem obigen Beispiel tritt ein Problem auf, wenn Sie einen schemabewussten Prozessor verwenden. Da der Prozessor aus dem Schema weiß, dass/path/to/foo xs: boolean ist, wird eine Fehlermeldung "Can not compare xs: boolean to xs: string" erzeugt. Ich habe genau dieses Problem (mit einem booleschen Attribut) - und ich weiß nicht wirklich, wie ich es lösen soll. Irgendeine Hilfe? –

0

Die Xpath-Spezifikation gibt eine boolesche Funktion. Daher gibt boolean (Value) immer wahr oder falsch zurück.