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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] stylesheet functions or named, Haarman, Michael | Thread | [xsl] Finding the position of an an, Nicholas Orr |
RE: [xsl] Date Difference, Michael Kay | Date | RE: [xsl] Learning XSLT: which vers, Michael Kay |
Month |