Subject: Re: [xsl] xsl:if with "and' in test expression triggers error whe n running in xslt 2.0 mode? From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Tue, 17 Jun 2003 14:34:09 +0100 |
Hi Dave, >> Given this, the fact that you're getting an error highlights for you >> the fact that in XSLT 1.0 you're only testing the first of the rows >> for content whereas you actually want to test if "all the cells are >> empty" or, in other words, if any of the cells has content. For the >> test to succeed when any of the $rows has content, you should use: >> >> count($rows) = 3 and $rows[normalize-space(.)] > ^^^^^^^^^^^^^^^^^^^^^^^ > Curious about that last one Jeni. > Implies that the formatter iterate over the $rows sequence > normalising content as if there had been a for .... statement, then > apply 'or' function to the result. I don't really understand what you're asking, or what you mean by "formatter" in this context. The predicate works in XSLT 2.0 just as it does in XSLT 1.0 -- it filters the sequence of nodes held in the $rows variable to include only those for which the test "normalize-space(.)" is true. The test "normalize-space(.)" will be true for those nodes in $rows that have non-whitespace characters in their string values. The fact that the resulting sequence of nodes is used as an argument to the "and" operator means that the sequence is interpreted as a boolean value -- true if the sequence contains items and false otherwise. Therefore if there are any nodes left after the filtering (i.e. any nodes that have non-whitespace characters in their string values) then it will be true. To make the boolean casts explicit, the above is the same as: count($rows) = 3 and boolean($rows[boolean(normalize-space(.))]) If you want to reinterpret that as a "some" expression, it's: count($rows) = 3 and some $r in $rows satisfies normalize-space($r) or as a "for" expression: count($rows) = 3 and for $r in $rows return if (normalize-space($r)) then $r else () Since we know that there are three nodes in $rows, it's the same as: count($rows) = 3 and (normalize-space($rows[1]) or normalize-space($rows[2]) or normalize-space($rows[3])) As far as what a processor would do, an optimised processor would most likely iterate over the nodes in $rows until it found one for which normalize-space(.) returned a non-empty string, and then return true for the sub-expression. Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] xsl:if with "and' in test, David Carlisle | Thread | Re: [xsl] xsl:if with "and' in test, "Braumüller, Hans" |
Re: [xsl] xsl:if with "and' in test, David Carlisle | Date | Re: [xsl] xsl fo padding-left issue, Mark Ivs |
Month |