<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