[xsl] Re: Do something if no items in for-each meet criteria

Subject: [xsl] Re: Do something if no items in for-each meet criteria
From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx>
Date: Fri, 12 Sep 2003 06:58:21 +0200
"Peter Hollingsworth" <peter@xxxxxxxxxxxxxxxxx> wrote in message
news:5.2.1.1.0.20030911155720.027fe380@xxxxxxxxxxxxxxxxxxxxxxxxxxxx
> I'm trying to
>    1) go through a set of nodes
>    2) if any matches my criteria, display it
>    3) if NONE matches my criteria, display a message like "None"
>
> For example, imagine this xml listing some animals:
> <animal>
>    <type>snake</type>
>    <furry>false</furry>
> </animal>
> <animal>
>    <type>fish</type>
>    <furry>false</furry>
> </animal>
>
> and this XSL that lists all the ones with fur:
> The following animals are furry:<br/>
> <xsl:for-each select="animal">
>    <xsl:if test="furry = 'true'">
>      <xsl:value-of select="type"/><br/>
>    </xsl:if>
> </xsl:for-each>
> [if no animals were furry, print "None are furry"]  <---how can I do this?
>
> Any way I can accomplish what I'm trying to do on the last line above?

Yes.

When the test is so simple (as in your case), one can simply have:

  <xsl:variable name="vFurry" select="animal[fury = 'true']"/>

  <xsl:for-each select="$vFurry">
       <xsl:value-of select="type"/><br/>
  </xsl:for-each>

 <xsl:if test="not($vFurry)">None are furry </xsl:if>


In case the selection criteria is more complex and cannot be specified in a
single XPath expression (try to find such case with XPath2 and XSLT2) then
you have to create an RTF with the results and test its contents.

I would recommend using the "some-true" template of FXSL, which does this
for you conveniently.



=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL





 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread