This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Designs for XSLT functions (Was: Re: RE: syntax sugar for call-template)
- To: "Michael Kay" <mhkay at iclway dot co dot uk>
- Subject: Re: Designs for XSLT functions (Was: Re: [xsl] RE: syntax sugar for call-template)
- From: Jeni Tennison <mail at jenitennison dot com>
- Date: Tue, 20 Feb 2001 10:03:00 +0000
- CC: xsl-list at lists dot mulberrytech dot com
- Organization: Jeni Tennison Consulting Ltd
- References: <000e01c09ac4$df560d00$e9453c3e@oemcomputer>
- Reply-To: xsl-list at lists dot mulberrytech dot com
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
useful?:
---
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)" />
</xsl:for-each>
</exsl:function>
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="." />
</xsl:if>
</xsl:for-each>
</exsl:function>
---
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.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list