xsl-list
[Top] [All Lists]

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

2003-10-06 03:15:01
 
 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