Re: [xsl] Yet Another Sorting Problem

Subject: Re: [xsl] Yet Another Sorting Problem
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Wed, 28 Jul 2004 09:48:14 -0700 (PDT)
Hi Allin,
  With the help of nodeset function, the problem is
easy to solve. Following stylesheet could be helpful -

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:xalan="http://xml.apache.org/xalan";>

<xsl:output method="xml" />
	
<xsl:template match="/bibliography">
  <xsl:variable name="rtf">
    <xsl:for-each select="book|journalarticle|paper">
      <xsl:element name="{name()}">
	<auhash>
          <xsl:for-each select="authorlist/author">
	    <xsl:value-of select="@surname"/>
	    <xsl:value-of select="@initials"/>
	  </xsl:for-each>
	</auhash>	
	<pubdate>
          <xsl:value-of select="pubdate" />
	</pubdate>	
	<!-- put anything else -->
      </xsl:element>	
    </xsl:for-each>
  </xsl:variable>	
	    
  <xsl:for-each select="xalan:nodeset($rtf)/*">
     <xsl:sort select="auhash" />
     <xsl:sort select="pubdate" />
              
     <!-- do required processing -->
  </xsl:for-each>           
</xsl:template>
      
</xsl:stylesheet>

Regards,
Mukul

--- Allin Cottrell <cottrell@xxxxxxx> wrote:
> 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



		
__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - Send 10MB messages!
http://promotions.yahoo.com/new_mail 

Current Thread