[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] XPath 2.0: Problems with the two boolean constants true and false


Subject: RE: [xsl] XPath 2.0: Problems with the two boolean constants true and false
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 6 Oct 2003 15:49:15 +0100

To add to my previous reply, I should point out that Saxon should report
a type error on this stylesheet: you cannot pass an integer or string
value for a parameter whose required type is boolean.

Michael Kay

 
> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Dimitre Novatchev
> Sent: 06 October 2003 11:15
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] XPath 2.0: Problems with the two boolean 
> constants true and false 
> 
> 
> > >  
> > >  I see two problems with the boolean constants true and false:
> > >  
> > >    1. They cannot be used in an XPath expression -- cannot be
> > >  distinguished from child::true and child::false
> > 
> > There are no constants "true" and "false". As in XPath 1.0, 
> the truth 
> > values are represented by the function calls true() and false(). No 
> > change here from 1.0.
> > >  
> > >    2. boolean('false') is true.  This is especially confusing
> > >  and may be the source of many programmers' headaches.
> > 
> > Again, no change here from 1.0. I haven't seen this cause 
> much problem 
> > in practice, though the introduction of xs:boolean alongside 
> > [fn:]boolean may be confusing. xs:boolean() uses the schema 
> rules: '0' 
> > and 'false' give false, '1' and 'true' give true, any other 
> string is 
> > an error.
> > >  
> > >  Because of these I chose in my code to use functions
> > >  returning xs:integer (0 and 1) and for templates to write 
> > >  code like the following:
> > >  
> > >    <xsl:template name="And" 
> match="*[namespace-uri()='allTrue-And']">
> > >      <xsl:param name="arg1"/>
> > >      <xsl:param name="arg2"/>
> > >           <xsl:value-of select="number(number($arg1) and
> > >  number($arg2))"/>
> > >    </xsl:template>
> > >  
> > >  Am I wrong? Is there a way to overcome the above problems?
> > >  
> > 
> > It seems odd to me to use numbers instead of booleans because you 
> > don't like the string-to-boolean conversions. If you don't like the 
> > string-to-boolean conversions just don't use them; you can 
> still use 
> > booleans!
> 
> My confusion is due to the following:
> 
> This transformation:
> 
> <xsl:stylesheet version="2.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:xs="http://www.w3.org/2001/XMLSchema"
> xmlns:f="http://fxsl.sf.net/"
> xmlns:test="my:test"
>   exclude-result-prefixes="f xs test"
> >
>   <xsl:output omit-xml-declaration="yes"/>
>   
>   <xsl:template match="/">
>    <xsl:apply-templates select="document('')/*/test:*[1]">
>      <xsl:with-param name="arg1" select="'false'"/>
>      <xsl:with-param name="arg2" select="1"/>
>    </xsl:apply-templates>
>   </xsl:template>
>   
>   <test:test/>
>   <xsl:template name="And" match="test:*">
>     <xsl:param name="arg1" as="xs:boolean"/>
>     <xsl:param name="arg2"  as="xs:boolean"/>
>          <xsl:value-of 
>          select="xs:boolean(xs:boolean($arg1) and 
> xs:boolean($arg2))"/>
>   </xsl:template>
> 
> </xsl:stylesheet>
> 
> Produces:
> 
>   true
> 
> 
> But 
> 
>       <xsl:value-of 
>          select="xs:boolean(xs:boolean('false') and xs:boolean(1))"/>
> 
> produces:
> 
>    false
> 
> 
> Is this a bug in Saxon 7.7?
> 
> 
> 
> 
> 
> 
> =====
> Cheers,
> 
> Dimitre Novatchev.
> http://fxsl.sourceforge.net/ -- the home of FXSL
> 
> __________________________________
> Do you Yahoo!?
> The New Yahoo! Shopping - with improved product search 
http://shopping.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



Current Thread
Keywords