|
Subject: RE: [xsl] Sorting and Paging in one pass with XSLT 2 From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 19 Nov 2004 05:02:41 -0000 |
I think that any solution is likely to put the sorted results in memory
before splitting it into multiple result trees, so you shouldn't be worrying
too much about a two-pass solution. If your intermediate result is a
sequence of nodes, rather than a tree, then it should be reasonably
efficient, because the intermediate sequence will contain references to the
original nodes, rather than copies.
Try
<xsl:template match="result">
<xsl:variable name="sorted-rows" as="element(row)*>
<xsl:perform-sort select="row">
<xsl:sort select="lname"/>
<xsl:sort select="fname"/>
</xsl:perform-sort>
</xsl:variable>
<xsl:for-each-group select="$sorted-rows"
group-adjacent="position()-1 idiv $perPage">
<xsl:result-document href="out{current-grouping-key()}.xml">
<result>
<xsl:copy-of select="current-group()"/>
</result>
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
I'd be interested to know how this performs.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Kyle Himmerick [mailto:kyle@xxxxxxxxxxxx]
> Sent: 19 November 2004 03:26
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Sorting and Paging in one pass with XSLT 2
>
> Hello All,
>
> I am trying to use some of the new XSLT 2 functionality to improve my
> sorting and paging performance.
>
> Ideally I would be able to sort and splice a large document
> tree in one
> pass.
>
> So sort the tree and put x # of records in each result document.
>
> Here's a pseudo of what I'm trying to do:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:fo="http://www.w3.org/1999/XSL/Format">
> <xsl:param name="perPage" select="number('10')"/>
>
> <xsl:template match="result">
> <xsl:for-each select="row">
> <xsl:sort select="lname"/>
> <xsl:sort select="fname"/>
> <xsl:variable name="page"
> select="ceiling(position()/$perPage)"/>
> <xsl:result-document href="out{$page}.xml">
> <result>
> <xsl:copy-of select="."/>
> </result>
> </xsl:result-document>
> </xsl:for-each>
> </xsl:template>
> </xsl:stylesheet>
>
> Obviously this won't work as it would try create a new
> result-document
> on each pass. Whereas I need the first $perPage rows to go into the
> same result-document.
>
> I was hoping to find a way to use the grouping functionality
> in xslt 2.
> Possibly grouping records by their page and then iterate through
> creating a new result-document for each group of records. I couldn't
> find a way to do this with one pass through the document,
> which is what
> I'm trying to stick with since I can potentially have very large
> incoming xml.
>
> Any ideas or suggestions for implementing an efficient method
> of sorting
> and then paging the results?
>
> Best Regards,
> Kyle
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Sorting and Paging in one pas, Kyle Himmerick | Thread | Re: [xsl] Sorting and Paging in one, Kyle Himmerick |
| RE: [xsl] doc() concat expression a, Michael Kay | Date | [xsl] UTF-8 Byte Order Mark giving , Geert Josten |
| Month |