Re: [xsl] "Return" from a function?

Subject: Re: [xsl] "Return" from a function?
From: "andrew welch" <andrew.j.welch@xxxxxxxxx>
Date: Thu, 1 Jun 2006 10:42:34 +0100
On 6/1/06, Mukul Gandhi <gandhi.mukul@xxxxxxxxx> wrote:
On 6/1/06, Phillip B Oldham <phillip.oldham@xxxxxxxxxx> wrote:
> Though, thinking about it, I suppose I could do something like the
> following (thanks *Andrew*):
>
> <xsl:template match="/subscriptions/item[renewaldate]">
> <p>Your renewal date for <xsl:value-of select="subscriptionname" /> is:
> <xsl:value-of select="renewaldate" />.</p>
> </xsl:template>
>
> <xsl:template match="/subscriptions/item[not(renewaldate)]">
> <p>Sorry, there has been an error...</p>
> </xsl:template>
>
> Feels weird though, because actions for the same element aren't being
> kept "together" (within the same template), but it does look more useful
> than a return.

I think, you can write

<xsl:template match="/subscriptions/item">
   <xsl:choose>
      <xsl:when test="renewaldate">
         <p>Your renewal date for <xsl:value-of select="subscriptionname" /> is:
         <xsl:value-of select="renewaldate" />.</p>
     </xsl:when>
     <xsl:otherwise>
        <p>Sorry, there has been an error...</p>
     </xsl:otherwise>
</xsl:template>

You could, but one of the great benefits of keeping everything in individual templates is that you could then override a template with an importing stylesheet.

For example, if you had the requirement to alter the error message for
a particular customer, all you would need to do is create a new
stylesheet that imports the existing stylesheet:

<xsl:stylesheet ...>
 <xsl:import href="main.xslt"/>
 <xsl:template match="/subscriptions/item[not(renewaldate)]">
   <p> Customer specific error message </p>
 </xsl:template>
</xsl:stylesheet>

You wouldnt have to touch the existing code which means you wouldn't
risk breaking anything for existing customers, wouldn't have to
re-test everything etc.

This, I think, is another good design rule: when a template contains a
choose/when as its only child, separate it out into individual
templates.

Current Thread