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: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Mon, 6 Oct 2003 03:15:01 -0700 (PDT)
> >  
> >  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


Current Thread