On Aug 17, 2004, at 10:26 AM, Jeni Tennison wrote:
Since the current element is a <mods:mods> element,
the test is guaranteed to be true.
What you want is simply:
  <xsl:if test="position() = 1">
    ...
  </xsl:if>
This tests whether the current <mods:mods> element is the first within
the group of <mods:mods> elements that you're looking at.
For whatever reason, this doesn't work for me.  I originally had that 
statement, but couldn't get it to work.  That's why I ended up with the 
one I posted.  Here's the template again (the key is declared at the 
top of the stylesheet, and also used in the bibliography mode):
<xsl:template match="db:biblioref">
  <xsl:variable name="idref" select="@linkend"/>
  <xsl:variable name="bibref" select="key('bibref', $idref)" />
  <xsl:for-each-group select="$bibref" group-by="bib:grouping-key(.)">
    <xsl:sort select="current-grouping-key()"/>
    <xsl:for-each-group select="current-group()"
                        group-by="xs:integer(mods:year)">
      <xsl:sort select="current-grouping-key()"/>
      <xsl:for-each select="current-group()">
        <a href="#{(_at_)ID}" xmlns="http://www.w3.org/1999/xhtml">
<!-- PROBLEM: need to collapse like (Doe, 1999a, c), but this won't 
work. -->
          <xsl:if test="position() = 1">
            <xsl:apply-templates select="mods:name" mode="citation"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="mods:year"/>
          </xsl:if>
          <xsl:apply-templates select="mods:key"/>
          <xsl:if test="position() != last()">, </xsl:if>
        </a>
      </xsl:for-each>
    </xsl:for-each-group>
  </xsl:for-each-group>
  <xsl:if test="position() != last()">; </xsl:if>
</xsl:template>
Declare it like:
<xsl:key name="mods" match="mods:mods" use="@ID" />
and use it like:
  <xsl:variable name="bibref" select="key('mods', $idref)" />
Keys are much faster and neater than searching through the entire
document using a predicate.
I was wondering about using keys.  Do you think it'd be better to do 
this the other way around, though, and have a key for all the 
biblioref/@linkend values (the actual docbook citations), and when I 
process the mods:mods records, call those?  Wouldn't that ensure that 
only those records that contain a biblioref element with their ID 
linkend actually get processed?  Of course, I may have multiple 
linkends for the same record ID.
A related question: is there anywhere else obvious I ought to be 
drawing on keys?  For example, this business of creating conditional 
formatting using grouping (the Doe, 1999a, b stuff) is quite processing 
intensive (at least as I have it in my stylesheet).  For both the 
bibliography and the citations, I have to group and sort (often 
multiple times), and then figure out how to format based on position in 
the group.  Is there some smarter, less processing-intensive, way to do 
this using keys?
Bruce