(incubating) | The Free and Open Productivity Suite
Announcing Apache OpenOffice 3.4
<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 === -->
  
  <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>

  
<!-- =================================================================== -->
  
<!-- |    begin bibliography templates                                 | -->
  
<!-- =================================================================== -->
  
  <xdoc:doc>Grouping, sorting and parameter setting to properly handle the
    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() &gt; 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>

  
<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                                     | -->
  
<!-- =================================================================== -->
  
  <xdoc:doc>Grouping/sorting author-year class citations.</xdoc:doc>

  
<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

Apache Feather

Copyright & License | Privacy | Contact Us

Apache and the Apache feather logos are trademarks of The Apache Software Foundation. OpenOffice.org and the seagull logo are registered trademarks of The Apache Software Foundation. Other names appearing on the site may be trademarks of their respective owners.

Apache OpenOffice is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.