Found that following trick works:
<xsl:template match="/document">
<!-- create a copy of interesting things -->
<xsl:variable name="sections">
<xsl:for-each select="descendant::section">
<xsl:copy>
<xsl:copy-of select="@* />
</xsl:copy>
</xsl:for-each>
</xsl:variable>
<document-report>
<xsl:for-each
select="xalan:nodeset($sections)/section[utils:dummy(true())][1]">
<!-- NOTE: the ancestors are no longer available -->
<section-report ref="{...@ref}" />
</xsl:for-each>
</document-report>
</xsl:template>
Any explanation?
Adrian.
On 22/06/2010 12:28, Adrian Herscu wrote:
Thanks for your fast reply Michael :)
Hmmm... I am not sure that I understand why the processor needs to call
dummy() more than once, since the [1] filter clearly states "give me
only the first node".
I would expect that the processor will call dummy() until it will
receive a true then stop because of the [1] filter.
I wonder if there is some way of re-writing these expressions in order
to get the desired result?
Thanks again,
Adrian.
On 22/06/2010 12:02, Michael Ludwig wrote:
Adrian Herscu schrieb am 22.06.2010 um 11:33 (+0300):
<xsl:template match="/document">
<document-report>
<xsl:for-each select="descendant::section[utils:dummy(true())][1]">
<section-report ref="{...@ref}"
proc-ref="{ancestor::chapter/@name}" />
</xsl:for-each>
</document-report>
</xsl:template>
In this case the console will show that dummy() was called *once*
My guess is that the processor, having established that the [1] filter
eliminates all but the first node, optimizes the other calls away.
The problem is with the variants of
descendant::section[utils:dummy(true())][1]:
1. xsl variables:
<xsl:variable name="sections" select="descendant::section" />
and then use this XPath expression instead
xalan:nodeset($sections)[utils:dummy(true())][1]
then the dummy() function will be called 4 times (while the output xml
will remain the same) !
The processor doesn't optimize this expression?
2. paths with more than one fragments:
(chapter/section[utils:dummy(true())])[1]
(chapter/section)[utils:dummy(true())][1]
((chapter/section)[utils:dummy(true())])[1]
in these cases the dummy() function is called 4 times too (while the
output xml still remains the same) !
The processor doesn't optimize these expressions either?