The answer obviously depends on the processor.
With Saxon, if a variable is only referenced once, and the reference isn't in
a loop, then it will be inlined. So if you write
> <xsl:variable name="elems" select="key('some', $value, $doc)"
> as="element()*"/>
> <xsl:for-each select="$elems">
then Saxon will rewrite it as
> <xsl:for-each select="key('some', $value, $doc)">
The main benefit of this rewrite is better pipelining. A variable causes the
list of items to be stored somewhere in memory; without the variable, each
item is processed as soon as it is found.
Michael Kay
Saxonica
PS: Saxon 9.1 is about 10 years ago, so my memory of it is rather rusty.
> On 26 Sep 2018, at 21:40, Martynas JuseviD
ius martynas@xxxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi,
>
> I'm using the following pattern in multiple places in my stylesheets:
>
> <xsl:for-each select="key('some', $value, $doc)">
>
> My question is, would iteration be optimized if I selected the nodes
> into a variable first?
>
> <xsl:variable name="elems" select="key('some', $value, $doc)"
> as="element()*"/>
> <xsl:for-each select="$elems">
>
> I guess it should be faster if the key() function is called only once
> instead of multiple times? But if there is an index maybe it doesn't
> matter?
>
> And does the same apply to
>
> <xsl:apply-templates select="key('some', $value, $doc)"/>
>
> as well?
>
> I'm using Saxon 9.1.0.8.
>
>
> Martynas
|