RE: [xsl] stylesheet functions or named templates

Subject: RE: [xsl] stylesheet functions or named templates
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 21 Dec 2005 01:04:49 -0000
> Are there distinctions to be drawn that are not merely idiomatic or
> stylistic between a stylesheet function and a named template?

The main differences are:

* functions are called from XPath expressions, templates using call-template

* function arguments are specified by position and are always mandatory

* functions operate in an empty context, templates inherit a lot of context
from the caller

Generally, writing code as functions is a better way to make it reusable,
since function calls can be composed (combined) a lot more effectively than
template calls. But I continue to use templates when the main aim is to
create nodes and write them to a result tree.

Michael Kay
http://www.saxonica.com/

> 
> That is, are there runtime considerations between a pair of 
> named templates
> like this:
> 
> 
>   <xsl:template name="correctDate">
>     <xsl:param name="dateParts"/>
>     <xsl:variable name="tokens" 
> select="fn:tokenize($dateParts, '/')"/>
>     <xsl:value-of select="$tokens[3]"/>
>     <xsl:text>-</xsl:text>
>     <xsl:call-template name="pad">
>       <xsl:with-param name="digits" select="$tokens[1]"/>
>     </xsl:call-template>
>     <xsl:text>-</xsl:text>
>     <xsl:call-template name="pad">
>       <xsl:with-param name="digits" select="$tokens[2]"/>
>     </xsl:call-template>
>   </xsl:template>
> 
>   <xsl:template name="pad">
>     <xsl:param name="digits"/>
>     <xsl:choose>
>       <xsl:when test="fn:string-length($digits) = 1">
>         <xsl:value-of select="concat('0', $digits)"/>
>       </xsl:when>
>       <xsl:otherwise>
>         <xsl:value-of select="$digits"/>
>       </xsl:otherwise>
>     </xsl:choose>
>   </xsl:template>
> 
> 
> And this pair of user defined functions:
> 
>   <xsl:function name="sfn:correctDate" as="xs:date">
>     <xsl:param name="s"/>
>     <xsl:variable name="seq" 
> 	select="fn:tokenize($s, '/')"/>
>     <xsl:value-of 
> 	
> select="concat($seq[3],'-',sfn:pad($seq[1]),'-',sfn:pad($seq[2]))"/>
>   </xsl:function>
> 
>   <xsl:function name="sfn:pad">
>     <xsl:param name="digits"/>
>     <xsl:choose>
>       <xsl:when test="fn:string-length($digits) = 1">
>         <xsl:value-of select="concat('0',$digits)"/>
>       </xsl:when>
>       <xsl:otherwise>
>         <xsl:value-of select="$digits"/>
>       </xsl:otherwise>
>     </xsl:choose>
>   </xsl:function>
> 
> 
> Both contain template bodies, the tree representing the named 
> *correctDate*
> template is a few nodes bigger, perhaps.  I can call 
> functions from within
> XPath expressions.  Anything else to consider in terms of execution
> efficiency?
> 
> 
> TIA,
> 
> Mike
> 
> -----------------------------------
> Mike Haarman,
> XSL Developer,
> Internet Broadcasting Systems, Inc.

Current Thread