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?




Reply via email to