RE: [xsl] Yet Another Sorting Problem

Subject: RE: [xsl] Yet Another Sorting Problem
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Wed, 28 Jul 2004 16:59:30 +0100
This is yet another problem that's easy in XSLT 2.0 but quite hard in 1.0.

In 2.0 you can calculate the sort key by calling a stylesheet function, or
by instructions inside the xsl:sort element:

<xsl:sort>
  <xsl:for-each ...
  </xsl:for-each>
</xsl:sort>

In 1.0 it's probably simplest to calculate the sort key in a first pass,
storing it as an attribute on the temporary tree, then do the sorting in a
second pass.

Michael Kay 

> -----Original Message-----
> From: Allin Cottrell [mailto:cottrell@xxxxxxx] 
> Sent: 28 July 2004 16:17
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Yet Another Sorting Problem
> 
> I've consulted the FAQ, but I'm having difficulty 
> extrapolating to the 
> answer to this one.
> 
> In sorting a bibliography, I want to sort the elements (e.g. books, 
> articles) by author's name and publication date.  OK, that's easy. 
> My problem is handling multiple authors, with the the number unknown 
> in advance.  For flexibility in formatting the authors' names I can't 
> have them all in one big string; the data-structure I 
> actually have is 
> this:
> 
> * each bibliography-entry element has an "authorlist" element.
> * an authorlist has one or more "author" elements, which have
>    attributes such as surname, fist name, initials.
> 
> The easy solution, if it were available, would be to wrap the 
> xsl:sort 
> selection code in an xsl:for-each ranging across the authors in an 
> entry's authorlist, but that's forbidden by xsl syntax.
> 
> Next thought: construct on the fly a "grand author string" by lumping 
> together the names and initials of all the authors in an entry's 
> authorlist, and use this as the sort key for the entries.
> 
> Seems promising, but I haven't managed to implement it.  What I have 
> so far is broken -- I realize I can't use xsl:attribute to do this, 
> but I'm not sure what I should be using.
> 
> <xsl:template match="bibliography">
>    <xsl:for-each select="book|journalarticle|paper">
>      <xsl:attribute name="auhash">
>        <xsl:for-each select="authorlist/author">
>          <xsl:value-of select="@surname"/>
>          <xsl:value-of select="@initials"/>
>        </xsl:for-each>
>      </xsl:attribute>
>    </xsl:for-each>
>    <xsl:apply-templates select="book|journalarticle|paper">
>      <xsl:sort select="@auhash"/>
>      <xsl:sort select="pubdate"/>
>    </xsl:apply-templates>
> </xsl:template>
> 
> -- 
> Allin Cottrell
> Department of Economics
> Wake Forest University, NC

Current Thread