<xsl:stylesheet xmlns:bib="http://purl.org/NET/xbiblio/citeproc" xmlns:cs="http://purl.org/NET/xbiblio/csl" xmlns:db="http://docbook.org/ns/docbook" xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:exist="http://exist.sourceforge.net/NS/exist" xmlns:xdoc="http://www.pnp-software.com/XSLTdoc" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:course="http://purl.org/NET/xbiblio/course" version="2.0" exclude-result-prefixes="xdoc mods xs bib exist course db cs">
<!-- === licensed under CC-GNU GPL; see http://creativecommons.org/licenses/GPL/2.0 === -->
<!-- =================================================================== -->
<!-- | begin bibliography templates | -->
<!-- =================================================================== -->
<xsl:template match="mods:modsCollection" mode="sort_author-year">
<xsl:variable name="bibref" select="mods:mods" />
<xsl:for-each-group select="$bibref" group-by="mods:grouping-key(.)">
<xsl:sort select="current-grouping-key()" />
<xsl:variable name="bibrefs-for-author-sorted-by-year" as="element(mods:mods)*">
<xsl:perform-sort select="current-group()">
<xsl:sort select="mods:year(.)" />
<!-- add third-level sort on month-day -->
</xsl:perform-sort>
</xsl:variable>
<xsl:variable name="first-bibref-for-author" as="element(mods:mods)" select="$bibrefs-for-author-sorted-by-year[1]" />
<xsl:variable name="sort-on" select="current-grouping-key()" />
<xsl:for-each-group select="$bibrefs-for-author-sorted-by-year" group-adjacent="mods:year(.)">
<xsl:for-each select="current-group()">
<xsl:variable name="year-suffix">
<xsl:if test="last() > 1">
<xsl:number value="position()" format="a" />
</xsl:if>
</xsl:variable>
<xsl:variable name="shorten-author" as="xs:boolean" select="$style-biblio/@author-shorten='yes' and not(. is $first-bibref-for-author)" />
<xsl:apply-templates select="." mode="enhance">
<xsl:with-param name="year" select="current-grouping-key()" />
<xsl:with-param name="year-suffix" select="$year-suffix" />
<xsl:with-param name="shorten-author" select="$shorten-author" as="xs:boolean" />
<xsl:with-param name="sort-on" select="$sort-on" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:for-each-group>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="mods:modsCollection" mode="sort_cited">
<xsl:variable name="sort-on" select="$cite-position/bib:refs/bib:unique/bib:ref[@key='{@ID}']/@position" />
<xsl:for-each select="mods:mods">
<xsl:sort select="$sort-on" />
<xsl:apply-templates select="." mode="enhance">
<xsl:with-param name="year" select="mods:year(.)" />
<xsl:with-param name="sort-on" select="$sort-on" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template match="mods:modsCollection" mode="sort_citekey">
<xsl:for-each select="mods:mods">
<xsl:sort select="@ID" />
<xsl:apply-templates select="." mode="enhance">
<xsl:with-param name="year" select="mods:year(.)" />
<xsl:with-param name="sort-on" select="@ID" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template match="mods:mods" mode="enhance">
<xsl:param name="shorten-author" />
<xsl:param name="year" />
<xsl:param name="year-suffix" />
<xsl:param name="sort-on" />
<mods:mods ID="{@ID}" bib:shorten-author="{$shorten-author}" bib:refclass="{mods:refclass(.)}" bib:reftype="{mods:reftype(.)}" bib:use-reftype="{mods:use_csl-reftype(.)}" bib:sort-on="{$sort-on}" bib:biblist-position="{position()}">
<bib:year>
<xsl:value-of select="$year" />
</bib:year>
<xsl:if test="$year-suffix">
<bib:year-suffix>
<xsl:value-of select="$year-suffix" />
</bib:year-suffix>
</xsl:if>
<xsl:if test="not(mods:name[mods:role/mods:roleTerm=$primary-contributors])">
<bib:noname-substitute>
<xsl:value-of select="mods:grouping-key(.)" />
</bib:noname-substitute>
</xsl:if>
<xsl:copy-of select="*" />
</mods:mods>
</xsl:template>
<!-- =================================================================== -->
<!-- | begin citation templates | -->
<!-- =================================================================== -->
<xsl:template match="db:citation" mode="sort_citation_author-year">
<!-- store citation for future use -->
<xsl:variable name="citation" select="." as="element()" />
<xsl:variable name="local-cite-style" select="db:biblioref/@xrefstyle" as="node()?" />
<xsl:variable name="idref" select="db:biblioref/@linkend, course:reading/@refid" />
<xsl:variable name="bibref" select="$enhanced-biblist/mods:modsCollection/mods:mods[@ID=$idref]" />
<xsl:for-each-group select="$bibref" group-by="@bib:sort-on">
<xsl:sort select="current-grouping-key()" />
<xsl:variable name="refs-for-author-sorted-by-year" as="element(mods:mods)*">
<xsl:perform-sort select="current-group()">
<xsl:sort select="bib:year" />
</xsl:perform-sort>
</xsl:variable>
<xsl:variable name="first-ref-for-author" as="element(mods:mods)" select="$refs-for-author-sorted-by-year[1]" />
<xsl:variable name="last-ref-for-author" as="element(mods:mods)" select="$refs-for-author-sorted-by-year[position() = last()]" />
<xsl:for-each-group select="$refs-for-author-sorted-by-year" group-adjacent="bib:year">
<xsl:for-each select="current-group()">
<xsl:variable name="first-in-author-group" select=". is $first-ref-for-author" as="xs:boolean" />
<xsl:variable name="last-in-author-group" select=". is $last-ref-for-author" as="xs:boolean" />
<xsl:variable name="id" select="@ID" />
<!-- earlier the cite-ref variable was defined as just element(), but
for some reason this yielded an empty-sequence error in one case -->
<xsl:variable name="cite-ref" as="node()">
<xsl:sequence select="$citation/db:biblioref[@linkend=$id]" />
</xsl:variable>
<xsl:apply-templates select="$style-citation">
<xsl:with-param name="first-in-author-group" select="$first-in-author-group" as="xs:boolean" tunnel="yes" />
<xsl:with-param name="last-in-author-group" select="$last-in-author-group" as="xs:boolean" tunnel="yes" />
<xsl:with-param name="local-cite-style" select="$local-cite-style" as="node()?" tunnel="yes" />
<xsl:with-param name="cite-ref" select="$cite-ref" as="node()" tunnel="yes" />
<xsl:with-param name="bib:source" select="." as="element()" tunnel="yes" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:for-each-group>
<!-- FIX ME: config in CSL -->
<xsl:if test="position() != last()">; </xsl:if>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="db:citation" mode="sort_cited">
XXXX
</xsl:template>
</xsl:stylesheet>
<!-- === licensed under CC-GNU GPL; see http://creativecommons.org/licenses/GPL/2.0 === -->
<xdoc:doc type="stylesheet">
<xdoc:short>Handles sorting.</xdoc:short>
<xdoc:author>Bruce D’Arcus</xdoc:author>
<xdoc:copyright>2004, Bruce D’Arcus</xdoc:copyright>
</xdoc:doc>
<xdoc:short>Handles sorting.</xdoc:short>
<xdoc:author>Bruce D’Arcus</xdoc:author>
<xdoc:copyright>2004, Bruce D’Arcus</xdoc:copyright>
</xdoc:doc>
<!-- =================================================================== -->
<!-- | begin bibliography templates | -->
<!-- =================================================================== -->
<xdoc:doc>Grouping, sorting and parameter setting to properly handle the
author-year class bibliographies.</xdoc:doc>
author-year class bibliographies.</xdoc:doc>
<xsl:template match="mods:modsCollection" mode="sort_author-year">
<xsl:variable name="bibref" select="mods:mods" />
<xsl:for-each-group select="$bibref" group-by="mods:grouping-key(.)">
<xsl:sort select="current-grouping-key()" />
<xsl:variable name="bibrefs-for-author-sorted-by-year" as="element(mods:mods)*">
<xsl:perform-sort select="current-group()">
<xsl:sort select="mods:year(.)" />
<!-- add third-level sort on month-day -->
</xsl:perform-sort>
</xsl:variable>
<xsl:variable name="first-bibref-for-author" as="element(mods:mods)" select="$bibrefs-for-author-sorted-by-year[1]" />
<xsl:variable name="sort-on" select="current-grouping-key()" />
<xsl:for-each-group select="$bibrefs-for-author-sorted-by-year" group-adjacent="mods:year(.)">
<xsl:for-each select="current-group()">
<xsl:variable name="year-suffix">
<xsl:if test="last() > 1">
<xsl:number value="position()" format="a" />
</xsl:if>
</xsl:variable>
<xsl:variable name="shorten-author" as="xs:boolean" select="$style-biblio/@author-shorten='yes' and not(. is $first-bibref-for-author)" />
<xsl:apply-templates select="." mode="enhance">
<xsl:with-param name="year" select="current-grouping-key()" />
<xsl:with-param name="year-suffix" select="$year-suffix" />
<xsl:with-param name="shorten-author" select="$shorten-author" as="xs:boolean" />
<xsl:with-param name="sort-on" select="$sort-on" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:for-each-group>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="mods:modsCollection" mode="sort_cited">
<xsl:variable name="sort-on" select="$cite-position/bib:refs/bib:unique/bib:ref[@key='{@ID}']/@position" />
<xsl:for-each select="mods:mods">
<xsl:sort select="$sort-on" />
<xsl:apply-templates select="." mode="enhance">
<xsl:with-param name="year" select="mods:year(.)" />
<xsl:with-param name="sort-on" select="$sort-on" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template match="mods:modsCollection" mode="sort_citekey">
<xsl:for-each select="mods:mods">
<xsl:sort select="@ID" />
<xsl:apply-templates select="." mode="enhance">
<xsl:with-param name="year" select="mods:year(.)" />
<xsl:with-param name="sort-on" select="@ID" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xdoc:doc>Adds data necessary for further processing to the in-memory
bibliographic list, so it need not be calcuated subsequently.</xdoc:doc>
bibliographic list, so it need not be calcuated subsequently.</xdoc:doc>
<xsl:template match="mods:mods" mode="enhance">
<xsl:param name="shorten-author" />
<xsl:param name="year" />
<xsl:param name="year-suffix" />
<xsl:param name="sort-on" />
<mods:mods ID="{@ID}" bib:shorten-author="{$shorten-author}" bib:refclass="{mods:refclass(.)}" bib:reftype="{mods:reftype(.)}" bib:use-reftype="{mods:use_csl-reftype(.)}" bib:sort-on="{$sort-on}" bib:biblist-position="{position()}">
<bib:year>
<xsl:value-of select="$year" />
</bib:year>
<xsl:if test="$year-suffix">
<bib:year-suffix>
<xsl:value-of select="$year-suffix" />
</bib:year-suffix>
</xsl:if>
<xsl:if test="not(mods:name[mods:role/mods:roleTerm=$primary-contributors])">
<bib:noname-substitute>
<xsl:value-of select="mods:grouping-key(.)" />
</bib:noname-substitute>
</xsl:if>
<xsl:copy-of select="*" />
</mods:mods>
</xsl:template>
<!-- =================================================================== -->
<!-- | begin citation templates | -->
<!-- =================================================================== -->
<xsl:template match="db:citation" mode="sort_citation_author-year">
<!-- store citation for future use -->
<xsl:variable name="citation" select="." as="element()" />
<xsl:variable name="local-cite-style" select="db:biblioref/@xrefstyle" as="node()?" />
<xsl:variable name="idref" select="db:biblioref/@linkend, course:reading/@refid" />
<xsl:variable name="bibref" select="$enhanced-biblist/mods:modsCollection/mods:mods[@ID=$idref]" />
<xsl:for-each-group select="$bibref" group-by="@bib:sort-on">
<xsl:sort select="current-grouping-key()" />
<xsl:variable name="refs-for-author-sorted-by-year" as="element(mods:mods)*">
<xsl:perform-sort select="current-group()">
<xsl:sort select="bib:year" />
</xsl:perform-sort>
</xsl:variable>
<xsl:variable name="first-ref-for-author" as="element(mods:mods)" select="$refs-for-author-sorted-by-year[1]" />
<xsl:variable name="last-ref-for-author" as="element(mods:mods)" select="$refs-for-author-sorted-by-year[position() = last()]" />
<xsl:for-each-group select="$refs-for-author-sorted-by-year" group-adjacent="bib:year">
<xsl:for-each select="current-group()">
<xsl:variable name="first-in-author-group" select=". is $first-ref-for-author" as="xs:boolean" />
<xsl:variable name="last-in-author-group" select=". is $last-ref-for-author" as="xs:boolean" />
<xsl:variable name="id" select="@ID" />
<!-- earlier the cite-ref variable was defined as just element(), but
for some reason this yielded an empty-sequence error in one case -->
<xsl:variable name="cite-ref" as="node()">
<xsl:sequence select="$citation/db:biblioref[@linkend=$id]" />
</xsl:variable>
<xsl:apply-templates select="$style-citation">
<xsl:with-param name="first-in-author-group" select="$first-in-author-group" as="xs:boolean" tunnel="yes" />
<xsl:with-param name="last-in-author-group" select="$last-in-author-group" as="xs:boolean" tunnel="yes" />
<xsl:with-param name="local-cite-style" select="$local-cite-style" as="node()?" tunnel="yes" />
<xsl:with-param name="cite-ref" select="$cite-ref" as="node()" tunnel="yes" />
<xsl:with-param name="bib:source" select="." as="element()" tunnel="yes" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:for-each-group>
<!-- FIX ME: config in CSL -->
<xsl:if test="position() != last()">; </xsl:if>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="db:citation" mode="sort_cited">
XXXX
</xsl:template>
</xsl:stylesheet>
v