|
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) > 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 |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: Boolean true() and false() as s, Wendell Piez | Thread | RE: Boolean true() and false() as s, Evan Lenz |
| RE: how to select nodes based on at, sara . mitchell | Date | RE: Boolean true() and false() as s, Evan Lenz |
| Month |