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:50:18 -0000
On 19.07.2023 17:38, Martin Honnen martin.honnen@xxxxxx wrote:

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]">
B B B B  <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?B  How to write the XSLT code so that the XSLT processor stops
iterating upon processing the first 10 <record> elements?




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.


I checked with the documentation https://www.saxonica.com/html/documentation12/streaming/partial-reading.html and an example, yes, it looks as if to get Saxon to stop parsing the complete document the xsl:iterate/xsl:break is needed.

Current Thread