xsl-list
[Top] [All Lists]

Re: grouping/position problem

2005-04-22 05:41:20
Bruce,

I have finally seen what it is you were refering to with this.  I had
a complete misunderstanding as to what you were suggesting in regards
to sort order and position within the sort order.  This should take
only but a sec, but need to set something else aside first.  Let me
find a stopping point and then I will blast this out real fast.

I will post it back to the group as well in case any of you might find
this useful.

---------- Forwarded message ----------
From: Bruce D'Arcus <bdarcus(_at_)gmail(_dot_)com>
Date: Apr 22, 2005 6:16 AM
Subject: [xsl] grouping/position problem
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com


I'm having some problems with grouping and position().

For illustration, you could imagine an input source like:

<list>
  <item author="five" year="2001"/>
  <item author="three" year="2003"/>
  <item author="four" year="2002"/>
  <item author="two" year="1998"/>
  <item author="one" year="2005"/>
  <item author="two" year="2000"/>
  <item author="four" year="1999"/>
</list>

I need to group and sort by author, then by year, and then pass some
parameters that are based on the item's position within -- in this case
-- the author group.

I have this template:

  <xsl:template match="mods:modsCollection" mode="sort_author-year">
    <xsl:variable name="bibref" select="mods:mods" />
    <xsl:for-each-group select="$bibref" group-by="bib:grouping-key(.)">
      <xsl:sort select="current-grouping-key()"/>
      <xsl:variable name="author-position" select="position()"/>
      <xsl:variable name="shorten-author" as="xs:boolean"
select="$author-position > 1" />
      <xsl:for-each-group select="current-group()"
group-by="bib:year(.)">
        <xsl:sort select="current-grouping-key()" />
       <xsl:variable name="year">
          <xsl:value-of select="current-grouping-key()"/>
         <xsl:if test="last() > 1">
           <xsl:number value="position()" format="a"/>
         </xsl:if>
       </xsl:variable>
        <xsl:for-each select="current-group()">
          <xsl:apply-templates select="mods:titleInfo">
            <xsl:with-param name="year" select="$year"/>
            <xsl:with-param name="shorten-author"
select="$shorten-author"/>
          </xsl:apply-templates>
        </xsl:for-each>
      </xsl:for-each-group>
    </xsl:for-each-group>
  </xsl:template>

The bib:grouping-key function constructs an author names string to sort.

The problem is the author-position variable.

What I want is for it to measure position within an author group.  But
I'm getting these sorts of results:

    AUTHOR POSITION: 1
    SHORTEN: false
    AUTHOR POSITION: 2
    SHORTEN: true
    AUTHOR POSITION: 2
    SHORTEN: true
    AUTHOR POSITION: 3
    SHORTEN: true
    AUTHOR POSITION: 4
    SHORTEN: true
    AUTHOR POSITION: 4
    SHORTEN: true
    AUTHOR POSITION: 5
    SHORTEN: true
    AUTHOR POSITION: 6

... which tells me it's measuring the position of the group itself.

What I'm wanting is:

    AUTHOR POSITION: 1
    SHORTEN: false
    AUTHOR POSITION: 1
    SHORTEN: false
    AUTHOR POSITION: 2
    SHORTEN: true
    AUTHOR POSITION: 1
    SHORTEN: false
    AUTHOR POSITION: 1
    SHORTEN: false
    AUTHOR POSITION: 2
    SHORTEN: true
    AUTHOR POSITION: 1
    SHORTEN: false
    AUTHOR POSITION: 1
    SHORTEN: false

How do I fix this?

Bruce

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



-- 
<M:D/>

:: M. David Peterson ::
XML & XML Transformations, C#, .NET, and Functional Languages Specialist

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>