Re: [xsl] How to efficiently obtain the first 10 records of a file with over 2 million records?

Subject: Re: [xsl] How to efficiently obtain the first 10 records of a file with over 2 million records?
From: "Martin Honnen martin.honnen@xxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 19 Jul 2023 15:37:53 -0000
On 19.07.2023 17:16, Roger L Costello costello@xxxxxxxxx wrote:

I have an XML file containing over 2 million <record> elements. I want to
obtain the first 10 <record> elements.

Here's how I did it:


<xsl:for-each select="/Document/record[position() le 10]">
     <xsl:sequence select="."/>
</xsl:for-each>

I ran it and it took a long time to complete. I am guessing that the XSLT
processor is iterating over all 2 million <record> elements. Yes?  How to
write the XSLT code so that the XSLT processor stops iterating upon processing
the first 10 <record> elements?


Using XSLT 3.0 and Saxon EE with streaming you could use e.g.


<xsl:mode streamable="yes"/>

<xsl:template match="/">

B <xsl:copy-of select="Document/record[position() le 10]"/>

</xsl:template>


I am not sure whether you need an explicit



<xsl:mode streamable="yes"/>


<xsl:template match="/">

B <xsl:iterate select="Document/record">

B B B <xsl:copy-of select="."/>

B B <xsl:if test="position() eq 10">

B B B B <xsl:break/>

B B </xsl:if>

B </xsl:iterate>

</xsl:template>


to ensure that Saxon stops processing after the 10 records, run from the command line with -t and look for an early exit message to confirm.

Current Thread