Subject: [xsl] grouping confusion From: Bruce D'Arcus <bdarcus@xxxxxxxxxxxxx> Date: Thu, 16 Dec 2004 08:33:45 -0500 |
As I've reworked my stylesheets, I've gotten stuck on some code that was previously working. It formats a citation by doing a multi-level grouping and sorting by author and then year. If there is more than one author, only the first should be printed. Likewise, if there's more than one author-year combination, then only the suffix gets printed. Example:
It's clear the problem is in how I'm using the position() function within the groups, but I can't figure out how to fix it. I suspect it may be something about the bibref variable. In the previous approach, I had used a key for that indexed all the bibliographic records by their ID attribute, while here I'm just accessing a variable that holds all those records. Is there something different conceptually about the two approaches that would cause position() to behave differently in this context?
<xsl:template match="db:citation"> <!-- store citation for future use --> <xsl:variable name="citation" select="."/> <xsl:variable name="idref" select="db:biblioref/@linkend"/> <xsl:variable name="bibref" select="$enhanced-biblist/mods:modsCollection/mods:mods[@ID=$idref]"/> <xsl:value-of select="$style-citation/cs:prefix"/> <xsl:choose> <xsl:when test="$citeclass='author-year'"> <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="bib:year"> <xsl:sort select="current-grouping-key()"/> <xsl:variable name="position" select="position()"/> <xsl:for-each select="current-group()"> <a href="#{@ID}"> <xsl:if test="position() = 1"> <xsl:choose> <xsl:when test="mods:name"> <xsl:apply-templates select="mods:name" mode="short"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="bib:noname-substitute"/> </xsl:otherwise> </xsl:choose> <xsl:value-of select="$style-citation/cs:entry/cs:creator/cs:suffix"/> <xsl:value-of select="bib:year"/> </xsl:if> <xsl:apply-templates select="bib:key"/> <!--+ ============================================================== | render point citation details if present +--> <xsl:if test="$citation/db:biblioref/@begin"> <xsl:value-of select="$style-citation/cs:entry/cs:point/cs:prefix"/> <xsl:value-of select="$citation/db:biblioref/@begin"/> <xsl:if test="$citation/db:biblioref/@end"> <xsl:text></xsl:text> <xsl:value-of select="bib:number-condense($citation/db:biblioref/@begin, $citation/db:biblioref/@end)"/> </xsl:if> </xsl:if> </a> </xsl:for-each> <xsl:if test="$position != last()">, </xsl:if> </xsl:for-each-group> <xsl:if test="position() != last()"> <xsl:value-of select="$style-citation/cs:entry/@delimiter"/> </xsl:if> </xsl:for-each-group> </xsl:when> <xsl:otherwise> <xsl:value-of select="$style-citation/cs:prefix"/> <xsl:for-each select="db:biblioref"> <xsl:variable name="linkend" select="@linkend"/> <xsl:variable name="number"> <xsl:choose> <xsl:when test="$sort_order-bib='cited'"> <xsl:value-of select="$cite-position/bib:refs/bib:unique/bib:ref[@key=$linkend]/ @position"/> </xsl:when> <xsl:when test="$sort_order-bib='citekey'"> <xsl:value-of select="$linkend"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$formatted-biblist/xhtml:p[@id=$linkend]/xhtml: span[@class='mark']"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <a href="#{$linkend}"> <xsl:value-of select="$number"/> </a> <xsl:if test="position() != last()">, </xsl:if> <xsl:if test="position() != last()"> <xsl:value-of select="$style-citation/cs:entry/@delimiter"/> </xsl:if> </xsl:for-each> <xsl:value-of select="$style-citation/cs:suffix"/> </xsl:otherwise> </xsl:choose> <xsl:value-of select="$style-citation/cs:suffix"/> </xsl:template>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] RE: displaying characters, Andrew Curry | Thread | RE: [xsl] problem using dyn:evaluat, Matthieu Ricaud |
RE: [xsl] sort to categories, Pawson, David | Date | RE: [xsl] problem using dyn:evaluat, Matthieu Ricaud |
Month |