RE: Boolean true() and false() as strings?

Subject: RE: Boolean true() and false() as strings?
From: "Evan Lenz" <elenz@xxxxxxxxxxx>
Date: Thu, 5 Oct 2000 17:01:10 -0700
Ah yes, boolean conversion of result tree fragments.  The first thing you
need to know to explain the behavior of your stylesheet is that whenever an
<xsl:variable> element is not empty, it will always return a value of type
Result Tree Fragment.  More to the point, <xsl:value-of/> always copies the
*string-value* of the designated XPath expression, boolean or otherwise.

Try hard-coding the true() value, first as a child of <xsl:variable> and
then as the value of the select attribute.

This returns an RTF:
  <xsl:variable name="units_gt_300">
    <xsl:value-of select="true()"/>
  </xsl:variable>

This returns an XPath boolean:
  <xsl:variable name="units_gt_300" select="true()"/>

Your if test will evaluate differently depending on the variable's type.

In the first case, the comparison is between an RTF and a string.  The
processor first converts the RTF to a string and subsequently performs a
string comparison.  Thus, you are effectively comparing 'true' with 'true'
or 'false' with 'true'.  If you changed the if test to "$units_gt_300" or
"$units_gt_300=true()" (same thing), it would not work correctly, because
'true' and 'false' will always evaluate to true, being non-empty strings.

In the second case, the comparison is between a boolean and a string.  The
string is first converted to a boolean and then the comparison is made.  If
the string you include is not empty, then it will always convert to true,
which effectively gives you the same result as "$units_gt_300" or
"$units_gt_300='anything'".

This behavior is described in the XPath spec as follows:

"If at least one object to be compared is a boolean, then each object to be
compared is converted to a boolean as if by applying the boolean
function." -- http://www.w3.org/TR/xpath#booleans

Hope this helps!  You're keeping me on my toes ;)

Evan Lenz
elenz@xxxxxxxxxxx
http://www.xyzfind.com
XYZFind, the search engine *designed* for XML
Download our free beta software: http://www.xyzfind.com/beta




-----Original Message-----
From: owner-xsl-list@xxxxxxxxxxxxxxxx
[mailto:owner-xsl-list@xxxxxxxxxxxxxxxx]On Behalf Of John E. Simpson
Sent: Thursday, October 05, 2000 1:18 PM
To: xsl-list@xxxxxxxxxxxxxxxx
Subject: Boolean true() and false() as strings?


A curious thing (well, to me!)... consider this template rule:

<xsl:template match="sales">
   <h2>Regions Selling More than 300 Units:</h2>
   <xsl:for-each select="region">
     <xsl:variable name="units_gt_300">
       <xsl:choose>
         <xsl:when test="number(units) &gt; 300">
           <xsl:value-of select="true()"/>
         </xsl:when>
         <xsl:otherwise>
           <xsl:value-of select="false()"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
     <xsl:if test="$units_gt_300='true'">
       <h3><xsl:value-of select="concat(@name, ' (', units, '
units)')"/></h3>
     </xsl:if>
   </xsl:for-each>
</xsl:template>

Note the assignment of Boolean true() or false() to the variable, and the
<xsl:if> test. Why can't the latter be simply:

   <xsl:if test="$units_gt_300">

i.e., why the need to test vs. the string value "true"? Does using the
true() and false() functions in a variable coerce their return values to
string type rather than their "native" Boolean?

Here's a simple XML doc to run it against:

<sales quarter="2001-01">
   <region name="Northeast">
     <units>374</units>
     <amount>12500.26</amount>
   </region>
   <region name="Southeast">
     <units>512</units>
     <amount>17692</amount>
   </region>
   <region name="Southwest">
     <units>161</units>
     <amount>8349.72</amount>
   </region>
   <region name="Northwest">
     <units>465</units>
     <amount>15239.6</amount>
   </region>
</sales>

(Tested with both Saxon and the Sept. release of IE5.5, btw.)
==========================================================
John E. Simpson               | "Curiosity killed the cat,
http://www.flixml.org         | but for a while I was a
XML Q&A: http://www.xml.com   | suspect." (Steven Wright)


 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