Why does
<xsl:if test="<XPATH to boolean value here>">
...
</xsl:if>
ALWAYS return true?
Since boolean can be 0,1,”false” and “true” by definition, the ONLY way to test for a boolean value is to do string comparison against these. This can’t be right.
The
testspecified in<xsl:if>works as if it called thebooleanfunction. This function doesn’t work the way you might think. If its argument evaluates to a node-set (which it will be if you use a path as its argument) it will return true if the node-set is not empty, and false otherwise. So effectively, you’re testing for the existence of an element, not its value. Iffoocontainsfalse,will always evaluate to true, since what you’re really asking in that test is “does this element exist?” and not “is element’s value true?” And the element exists.
The rule that boolean values must be
true,false,1, or0is a part of XML Schema (which see) and not XPath, which doesn’t know anything about this rule. (XPath 1.0, that is. XPath 2.0/XQuery 1.0 has thefn:booleanfunction, which does smart, i.e. XML Schema aware, evaluation of boolean values.) To determine if a value is true in XSLT, you have to explicitly check it: