xsl-list
[Top] [All Lists]

Re: groupi-by statements?

2004-08-26 08:50:59
I need to repeat this question:

My 2.o stylesheet has a function it uses to group records based on author.

However, the grouping and sorting problem is more complex than this, and is based on the following rule:

1) use author-name string
2) if there is no author name:
a. when dealing with a periodical, use the periodical title in place of the author name
        b. otherwise use "anonymous"

So, in other words, if I have a magazine article from Newsweek, it would sort and format like so:

        Newsweek (2000) Article Title ....

Currently, it incorrectly does this:

        (2000) Article Title  ....

Here's my current code:

<xsl:function name="bib:grouping-key" as="xs:string">
  <xsl:param name="bibref" as="element(mods:mods)" />
  <xsl:choose>
  <xsl:when test="$bibref/mods:name">
    <xsl:value-of separator=";">
      <xsl:for-each select="$bibref/mods:name">
        <xsl:value-of
          select="string-join((mods:namePart[(_at_)type = 'family']|
                   mods:namePart[not(@type)],
                   mods:namePart[(_at_)type = 'given']), ',')" />
      </xsl:for-each>
    </xsl:value-of>
   </xsl:when>
   <xsl:otherwise>
     <xsl:choose>
<!-- test to see if we have a periodical article -->
<xsl:when test="$bibref/mods:relatedItem[(_at_)type='host']/mods:issuance = 'continuing'">
         <xsl:for-each select="$bibref">
<!-- use periodical title -->
<xsl:value-of select="mods:relatedItem[(_at_)type='host']/mods:titleInfo[not(@type)]/mods: title"/>
         </xsl:for-each>
       </xsl:when>
       <xsl:otherwise>
         <xsl:text>Anonymous</xsl:text>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:otherwise>
   </xsl:choose>
</xsl:function>

The main bib template then just calls the function like so:

    <xsl:for-each-group select="$bibref" group-by="bib:grouping-key(.)">
      <xsl:sort select="current-grouping-key()"/>

What have I done wrong, and how do I fix it?

Bruce


--
Bruce D'Arcus, PhD
Miami University
216 Shideler Hall
Oxford, OH 45056
513-529-1521