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 |