Hi, I think I found a bug in 8.0.3 (and earlier)
declare function local:shortcircuit($a) { if ($a castable as xs:double and xs:double($a) gt 0) then $a else () }; local:shortcircuit('foo') => [FORG0001] Cannot cast to xs:double: "foo". In http://www.w3.org/TR/xpath/#booleans "An and expression is evaluated by evaluating each operand and converting its value to a boolean as if by a call to the boolean function. The result is true if both values are true and false otherwise. The right operand is not evaluated if the left operand evaluates to false." Haven't tested it for other conditionals. --Marc