Re: [xsl] boolean(string(false())) is true - always?

Subject: Re: [xsl] boolean(string(false())) is true - always?
From: "Michael Müller-Hillebrand mmh@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 2 Mar 2017 22:02:49 -0000
Martin, David,

Thank you very much for restoring sanity in my brain!

- Michael

> Am 02.03.2017 um 16:27 schrieb Sewell, David R. (drs2n) dsewell@xxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>:
>
> The difference in return value between fn:boolean('false') and
xs:boolean('false') must be in the top ten of XPath "gotcha's" -- I usually
forget that despite having worked with XPath for more than a decade.
>
> David
>
> On Thu, 2 Mar 2017, Martin Honnen martin.honnen@xxxxxx wrote:
>
>> On 02.03.2017 16:00, Michael MC<ller-Hillebrand mmh@xxxxxxxxx wrote:
>>
>>> <xsl:function name="dy:isFoo" as="xs:boolean">
>>>    <xsl:param name="node" as="node()"/>
>>>    <xsl:choose>
>>>      <xsl:when test="$node[self::bar/@foo = 'x']">
>>>            <xsl:value-of select="true()"/>
>>>        </xsl:when>
>>>        <xsl:otherwise>
>>>            <xsl:value-of select="false()"/>
>>>        </xsl:otherwise>
>>>    </xsl:choose>
>>> </xsl:function>
>>> and changed that to the more elegant:
>>> <xsl:function name="dy:isFoo" as="xs:boolean">
>>>    <xsl:param name="node" as="node()"/>
>>>    <xsl:sequence select="exists($node[self::bar/@foo = 'x'])"/>
>>> </xsl:function>
>>> BUT then I looked at my old code and said to myself: This could never have
worked?!
>>> Isn't xsl:value-of creating a text node, so in xsl:otherwise it creates
'false'. And if this is cast to boolean as the function requires, we should
get true(), because the string is not empty?
>>
>> I think the rules lay out that the text node with 'true' or 'false' is
atomized to xs:untypedAtomic 'true' or 'false' and then the conversion to
xs:boolean is defined as a cast based on the XSD schema spec which treats
'true' as the boolean value true and false as the boolean value false. So what
happens in language terms would be
>>  'true' cast as xs:boolean
>> which gives the boolean value true respectively
>>  'false' cast as xs:boolean
>> which gives the boolean value false and not
>>  boolean('false')
>> which would give the boolean value true.

Current Thread