Re: [xsl] Avoiding dummy xsl:if with apply-templates

Subject: Re: [xsl] Avoiding dummy xsl:if with apply-templates
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Sun, 13 Feb 2005 15:24:00 +1100
On Sun, 13 Feb 2005 03:53:06 +0000, Frans Englich
<frans.englich@xxxxxxxxx> wrote:
> 
> Hello all,
> 
> I find myself struggling with a construct I often need: conditionally, "else",
> do something radically different depending on input.
> 
> For example:
> 
>           <xsl:variable name="el" select="elements" />
>            <xsl:if test="count($el)">
>                <ul>
>                    <xsl:apply-templates select="$el" />
>                </ul>
>            </xsl:if>
> 
> Here, the if statement and variable declaration exists solely to avoid an
> empty ul element; the special condition which occurs when the select misses.
> 
> Producing xhtml tables is a similar case. I find these common situations in
> XSLT programming.
> 
> These examples can be solved with usual conditional tests, as above, but I
> want to push the conditionalis upon the engine and write with templates; the
> clean, XSLT-like way. AFAICT, this made-up syntax would solve the problem:
> 
> <xsl:apply-templates select="elements">
>        <ul>
>                <xsl:apply/>
>        </ul>
> </xsl:apply-templates>
> 
> Hence, when the select clause fails, the apply-templates body is not entered,
> and the conditionalis is not needed to be manually written and comes
> naturally, even.
> 
> What is the proper way of doing what I want?


Something like this:

   <xsl:apply-templates select="elements[1]" mode="list">
     <xsl:with-param name="pElements" select="elements"/>
   </xsl:apply-templates>

Then the template to wrap the results in a "ul" is the following:

  <xsl:template match="element" mode="list">
     <xsl:param name="pElements"/>
     <ul>
         <xsl:apply-templates select="$pElements" mode="single"/>
    </ul>
  </xsl:template>



Cheers,
Dimitre Novatchev.

Current Thread