Re: xpath filtering extension function called too many times
Adrian Herscu <[email protected]> Tue, 22 Jun 2010 14:46:39 +0300
| Newsgroups | gmane.text.xml.xalan.java.user |
|---|---|
| Message-ID | <[email protected]> |
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?
>>
>
>