Re: [xsl] recreate apply-templates using a function

Subject: Re: [xsl] recreate apply-templates using a function
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Sun, 12 Feb 2012 08:43:23 -0800
> What's the issue there?
>
> It should really have have a return type of item()*, and the param
> should really be called 'node-list' rather than 'context':
>
> <xsl:function name="f:apply-templates" as="item()*">
>   <xsl:param name="node-list" as="node()*"/>
>   <xsl:apply-templates select="$node-list/>
> </xsl:function>
>
> anything else?
>

One possible issue is that people may want the results to correspond
to the sequence order of the argument.

This could be "assured" if you use:

<xsl:for-each select="$node-list">
  <xsl:apply-templates select="."/>
</xsl:for-each>

However, if you use this apply() function in:

/a/b/f:apply()

the results will be deduplicated and sorted in document order. If new
nodes are created, their order will be unpredictable
(implementation-dependent).

It is still OK to use such a function within an XPath expression if
order and deduplication don't matter, though.


Cheers,
Dimitre

On Sun, Feb 12, 2012 at 8:30 AM, Andrew Welch <andrew.j.welch@xxxxxxxxx>
wrote:
> Hi Dimitre,
>
> On 12 February 2012 15:48, Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote:
>> On Sun, Feb 12, 2012 at 5:24 AM, Andrew Welch <andrew.j.welch@xxxxxxxxx>
wrote:
>>> If you needed to call apply-templates using a function call (say as
>>> part of an xpath) any reason why this wouldn't be fine:
>>>
>>> <xsl:function name="f:apply-templates" as="node()*">
>>> B  B <xsl:param name="context" as="node()*"/>
>>> B  B <xsl:apply-templates select="$context"/>
>>> </xsl:function>
>>>
>>> with:
>>>
>>> <xsl:sequence select="f:apply-templates(child::node())"/>
>>>
>>> (ignoring modes and params etc)
>>>
>>> Seems ok to me...
>>
>> Except when you use it as the second operand of the / operator.
>
> What's the issue there?
>
> It should really have have a return type of item()*, and the param
> should really be called 'node-list' rather than 'context':
>
> <xsl:function name="f:apply-templates" as="item()*">
> B  <xsl:param name="node-list" as="node()*"/>
> B  <xsl:apply-templates select="$node-list/>
> </xsl:function>
>
> anything else?
>
> --
> Andrew Welch
> http://andrewjwelch.com
>



--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

Current Thread