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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] boolean(string(false())) , Sewell, David R. (dr | Thread | [xsl] whitespace normalization arou, Imsieke, Gerrit, le- |
Re: [xsl] boolean(string(false())) , Sewell, David R. (dr | Date | [xsl] whitespace normalization arou, Imsieke, Gerrit, le- |
Month |