Connecting Tech Pros Worldwide Help | Site Map

XSL sorting of results from recursive calls to document()?

  #1  
Old October 6th, 2008, 05:15 AM
felciano
Guest
 
Posts: n/a
Hello --

I am trying to use XSL to process Amazon wishlist data to sort the
results by type (Apparel, then Books, then DVDs, etc). Amazon's web
services chunk up results in multiple pages of fixed size, e.g. 55
items gets returned in 5 XML pages of 10 items and a 6th of 5 items.
Each page is returned from a distinct URL call with a PageNum
parameter.

I've been trying to adapt a technique described at http://www.xefer.com/amazon/wishlist
that shows how to iterate through such pages through recursive
document() calls and a document counter:

<xsl:template name="counter">
<xsl:param name="total"/>
<xsl:param name="page"/>

<xsl:variable name="lookup"
select="concat($lookup, '&amp;ProductPage=', $page)

<xsl:if test="$page <= $total">
<xsl:apply-templates select="document($lookup)"/>
<xsl:call-template name="counter">
<xsl:with-param name="total" select="$total"/>
<xsl:with-param name="page" select="$page + 1"/>
</xsl:call-template>
</xsl:if>

</xsl:template>

This works, but I can't figure out how to sort the aggregate results.
Each document's nodes are processed separately before the next page is
retrieved. Is there a convention / idiom for how to handle sorting
when iterating via recursion across multiple document() calls?

Thanks,

Ramon
  #2  
Old October 6th, 2008, 01:45 PM
Martin Honnen
Guest
 
Posts: n/a

re: XSL sorting of results from recursive calls to document()?


felciano wrote:
Quote:
I've been trying to adapt a technique described at http://www.xefer.com/amazon/wishlist
that shows how to iterate through such pages through recursive
document() calls and a document counter:
>
<xsl:template name="counter">
<xsl:param name="total"/>
<xsl:param name="page"/>
>
<xsl:variable name="lookup"
select="concat($lookup, '&amp;ProductPage=', $page)
>
<xsl:if test="$page <= $total">
<xsl:apply-templates select="document($lookup)"/>
<xsl:call-template name="counter">
<xsl:with-param name="total" select="$total"/>
<xsl:with-param name="page" select="$page + 1"/>
</xsl:call-template>
</xsl:if>
>
</xsl:template>
>
This works, but I can't figure out how to sort the aggregate results.
Each document's nodes are processed separately before the next page is
retrieved. Is there a convention / idiom for how to handle sorting
when iterating via recursion across multiple document() calls?
Instead of using xsl:apply-templates select="document($lookup)" during
each template invocation you need to pass on those results the document
call returns. So give your template a third parameter

<xsl:template name="counter">
<xsl:param name="total"/>
<xsl:param name="page"/>
<xsl:param name="page-elements" select="/.."/>

<xsl:variable name="lookup"
select="concat($lookup, '&amp;ProductPage=', $page)

<xsl:choose>
<xsl:when test="$page <= $total">
<xsl:call-template name="counter">
<xsl:with-param name="total" select="$total"/>
<xsl:with-param name="page" select="$page + 1"/>
<xsl:with-param name="page-elements" select="$page-elements |
document($lookup)/*"/>
</xsl:call-template>
</xsl:choose>
<xsl:otherwise>
<xsl:apply-templates select="$page-elements">
<xsl:sort select="foo"/>
</xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose

</xsl:template>




--

Martin Honnen
http://JavaScript.FAQTs.com/
  #3  
Old October 10th, 2008, 05:05 AM
felciano
Guest
 
Posts: n/a

re: XSL sorting of results from recursive calls to document()?


Very cool -- thank you for the quick response!

Ramon
Closed Thread