Subject:Bug in xsl:choose? Author:Lee Humphries Date:09 Jul 2002 03:28 AM
I've been finding lately that some of my more complex xsl:choose statements are not getting processed properly - The xsl:otherwise clause is not being invoked when it should.
For example I have the following nasty string-handling xsl:choose to determine whether I need to output some text that:
1. either falls between an end delimiter and start delimiter, or
2. after the last end delimiter.
However, when I execute it using the SS4 processor, Xalan-J or MSXML (all through SS) not one of the xsl:choose options gets selected - including the xsl:otherwise! If I run it through the debugger for the SS4 or Xalan-J processor I can see it skip completely over the xsl:choose
Subject:Re: Bug in xsl:choose? Author:Minollo I. Date:09 Jul 2002 10:31 AM
My best guess is that as you have an empty branch (the first
{xsl:when...}), that's the one which is being fired; but being empty, it's
skipped altogether.
Nup - not that one. The empty branch is very plainly skipped over. If I go and put something into the empty branch, it never makes it into the output. The empty branch is only there to eliminate that particular condition.
To check it out try the following:
$TokenSource is just an escaped closing tag e.g. </EndBlock>
$StartDelim is most of an escaped opening tag e.g. <SubBlock
$EndDelim is the corresponding escaped closing tag e.g. </SubBlock>
What should happen is that $TokenSource will get output.
I decided to try and make things a little simpler and changed the XSLT to the following:
<xsl:if test="string-length($EndDelim) > 0">
<xsl:variable name="SubATest" select="substring-after($TokenSource, $EndDelim)"/>
<xsl:variable name="SubBTest" select="substring-before($SubATest, $StartDelim)"/>
<xsl:choose>
<xsl:when test="string-length($SubBTest) = 0">
</xsl:when>
<xsl:when test="string-length($SubBTest) > 0">
<xsl:value-of disable-output-escaping="yes" select="$SubBTest"/>
</xsl:when>
<xsl:when test="string-length($SubATest) > 0 and string-length($StartDelim) > 0">
<xsl:value-of disable-output-escaping="yes" select="$SubATest"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="$TokenSource"/>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
Now the first branch is very definitely getting executed (whereas it wasn't before) changing the first branch test to:
"string-length($SubBTest) = 0 and contains($TokenSource, $EndDelim)"
Got the desired results.
Any ideas as to why there was the difference in behaviour (apart from the fact that I should simplify my code more)?
Subject:Re: Bug in xsl:choose? Author:Hans-Peter Küchler Date:10 Jul 2002 04:49 AM
Hi, Lee Humphries wrote:
> To check it out try the following:
> $TokenSource is just an escaped closing tag e.g. </EndBlock>
> $StartDelim is most of an escaped opening tag e.g. <SubBlock
> $EndDelim is the corresponding escaped closing tag e.g. </SubBlock>
> What should happen is that $TokenSource will get output.
The test conditions are the same as in the first (not seen) example. The output of this fragment is:
first
Remember, that substring-before() and substring-after() returns the empty string if the first argument string does not contain the second argument string. So the first test condition is almost true!