Re: Designs for XSLT functions (Was: Re: [xsl] RE: syntax sugar for call-template)

Subject: Re: Designs for XSLT functions (Was: Re: [xsl] RE: syntax sugar for call-template)
From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx>
Date: Tue, 20 Feb 2001 10:03:00 +0000
Hi Mike,

>> Perhaps xsl:for-each shouldn't be allowed directly within function
>> definitions?  Can anyone come up with a use case where it's helpful to
>> have it?
> Saxon allows xsl:for-each with saxon:function, but doesn't allow
> saxon:return within xsl:for-each.

Did you see the use cases that I put forward where it could be

Firstly, as we know, key() and id() are restricted to finding nodes in
the current tree. If I want to use an extension function that
retrieves keyed nodes in a particular document then I need to be able
to do:

<exsl:function name="my:key">
   <xsl:param name="key-name" />
   <xsl:param name="key-value" />
   <xsl:param name="file-name" />
   <xsl:param name="base-node" select="/" />
   <xsl:for-each select="document($file-name, $base-node)">
      <exsl:result select="key($key-name, $key-value)" />

Another example is if I want to use the built-in sort algorithms to
find, for example, the first value alphabetically in a node set:

<exsl:function name="my:first-alphabetical">
   <xsl:param name="nodes" />
   <xsl:for-each select="$nodes">
      <xsl:sort />
      <xsl:if test="position() = 1">
         <exsl:result select="." />

What do you think?

> Use case, turning a node-set into a comma-separated list of the
> string-values of the nodes:
> xsl:function name="csv"
>   xsl:param name="nodeset"/
>   xsl:variable name="tree"
>     xsl:for-each select="$nodeset"
>       xsl:value-of select="."
>       xsl:if test="position()!=last"
>         ,
>       /xsl:if
>     /xsl:for-each
>   /xsl:variable
>   xsl:return select="string($tree)"/
> /xsl:function

Ahh, but this shows an xsl:for-each within an xsl:variable.  I think
that David Rosenborg agrees that that should be allowed - he's only
objecting to allowing anything but xsl:param, xsl:variable and
exsl:result (or exsl:return) directly within exsl:function.



Jeni Tennison

 XSL-List info and archive:

Current Thread