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.
|