<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xdoc="http://www.pnp-software.com/XSLTdoc" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mods="http://www.loc.gov/mods/v3" xmlns:course="http://purl.org/NET/xbiblio/course" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:db="http://docbook.org/ns/docbook" xmlns:cs="http://purl.org/NET/xbiblio/csl" xmlns:bib="http://purl.org/NET/xbiblio/citeproc" xmlns="http://purl.org/NET/xbiblio/citeproc" xmlns:exist="http://exist.sourceforge.net/NS/exist" version="2.0" exclude-result-prefixes="db xdoc xhtml mods xs cs exist bib course">
  
<!-- === licensed under CC-GNU GPL; see http://creativecommons.org/licenses/GPL/2.0 === -->
  
  <xdoc:doc type="stylesheet">
    
<xdoc:short>Processes MODS documents into a formatted intermediate representation.</xdoc:short>
    
<xdoc:author>Bruce D’Arcus</xdoc:author>
    
<xdoc:copyright>2004, Bruce D’Arcus</xdoc:copyright>
  
</xdoc:doc>

  
<!-- punctuation variables -->
  
<xsl:variable name="bibref-before">
    
<xsl:text />
  
</xsl:variable>
  
<xsl:variable name="bibref-after">
    
<xsl:text>.</xsl:text>
  
</xsl:variable>
  
<xsl:template match="bib:noname-substitute">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<span class="creator">
      
<xsl:value-of select="$prefix" />
      
<xsl:value-of select="." />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
  <xdoc:doc>The "full" mode renders complete personal names in bibliographies and footnote/endnote
    style ctiations.
</xdoc:doc>

  
<xsl:template match="mods:name" mode="full">
    
<xsl:param name="sort-order" />
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:param name="multi-authors" as="element(cs:multiple-authors)?" tunnel="yes" />
    
<xsl:variable name="multi-author-min" select="if ($multi-authors/@min-authors) then ($multi-authors/@min-authors) else xs:integer('999')" as="xs:integer" />
    
<xsl:variable name="use-multi-author-handling" select="xs:integer(count(../mods:name[mods:role/mods:roleTerm=$primary-contributors])) ge $multi-author-min" as="xs:boolean" />
    
<xsl:value-of select="$prefix" />
    
<xsl:choose>
      
<xsl:when test="$use-multi-author-handling">
        
<xsl:choose>
          
<xsl:when test="position() le xs:integer($multi-authors/@use-first)">
            
<xsl:choose>
              
<xsl:when test="$sort-order='first-author' and parent::mods:mods">
                
<xsl:apply-templates select="mods:namePart[@type='family'] | mods:namePart[not(@type)]" />
                
<xsl:if test="mods:namePart[@type='given']">
                  
<xsl:text></xsl:text>
                  
<xsl:apply-templates select="mods:namePart[@type='given']" />
                
</xsl:if>
              
</xsl:when>
              
              
<xsl:when test="$sort-order='first-author' and position() = 1 and parent::mods:mods">
                
<xsl:apply-templates select="mods:namePart[@type='family'] | mods:namePart[not(@type)]" />
                
<xsl:if test="mods:namePart[@type='given']">
                  
<xsl:text></xsl:text>
                  
<xsl:apply-templates select="mods:namePart[@type='given']" />
                
</xsl:if>
              
</xsl:when>
              
<xsl:when test="$sort-order='all'">
                
<xsl:apply-templates select="mods:namePart[@type='family'] | mods:namePart[not(@type)]" />
                
<xsl:if test="mods:namePart[@type='given']">
                  
<xsl:text></xsl:text>
                  
<xsl:apply-templates select="mods:namePart[@type='given']" />
                
</xsl:if>
                
<xsl:choose>
                  
<xsl:when test="position() = last()" />
                  
<xsl:otherwise></xsl:otherwise>
                
</xsl:choose>
              
</xsl:when>
              
              
<xsl:otherwise>
                
<xsl:apply-templates select="mods:namePart[@type='given']" />
                
<xsl:apply-templates select="mods:namePart[@type='family' or not(@type)]" />
              
</xsl:otherwise>
            
</xsl:choose>
          
</xsl:when>
          
<xsl:otherwise>
            
<xsl:if test="position() = last()">
              
<xsl:text> </xsl:text>
              
<xsl:value-of select="$multi-authors" />
            
</xsl:if>
          
</xsl:otherwise>
        
</xsl:choose>
      
</xsl:when>
      
<xsl:otherwise>
        
<xsl:choose>
          
<xsl:when test="$sort-order='first-author' and position() = 1 and parent::mods:mods">
            
<xsl:apply-templates select="mods:namePart[@type='family'] | mods:namePart[not(@type)]" />
            
<xsl:if test="mods:namePart[@type='given']">
              
<xsl:text></xsl:text>
              
<xsl:apply-templates select="mods:namePart[@type='given']" />
            
</xsl:if>
          
</xsl:when>
          
<xsl:when test="$sort-order='all'">
            
<xsl:apply-templates select="mods:namePart[@type='family'] | mods:namePart[not(@type)]" />
            
<xsl:if test="mods:namePart[@type='given']">
              
<xsl:text></xsl:text>
              
<xsl:apply-templates select="mods:namePart[@type='given']" />
            
</xsl:if>
          
</xsl:when>
          
<xsl:otherwise>
            
<xsl:apply-templates select="mods:namePart[@type='given']" />
            
<xsl:apply-templates select="mods:namePart[@type='family' or not(@type)]" />
          
</xsl:otherwise>
        
</xsl:choose>
        
<xsl:choose>
          
<xsl:when test="position() = last()" />
          
<xsl:when test="position() = last() - 1"> and </xsl:when>
          
<xsl:otherwise></xsl:otherwise>
        
</xsl:choose>
      
</xsl:otherwise>
    
</xsl:choose>
    
<xsl:value-of select="$suffix" />
  
</xsl:template>
  
  
<xsl:template match="mods:name[position() gt 1]/mods:role" />
  
<xsl:template match="mods:name[position()=1]/mods:role">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<span class="role">
      
<xsl:choose>
        
<xsl:when test="mods:roleTerm='editor'">
          
<xsl:value-of select="$prefix" />
          
<xsl:choose>
            
<xsl:when test="count(../../mods:name) &gt; 1">
              
<xsl:value-of select="$style-terms/cs:roles/cs:role[@term='editor']/cs:renderas/cs:multiple" />
            
</xsl:when>
            
<xsl:otherwise>
              
<xsl:value-of select="$style-terms/cs:roles/cs:role[@term='editor']/cs:renderas/cs:single" />
            
</xsl:otherwise>
          
</xsl:choose>
          
<xsl:value-of select="$suffix" />
        
</xsl:when>
        
<xsl:when test="mods:roleTerm='translator'">
          
<xsl:value-of select="$prefix" />
          
<xsl:choose>
            
<xsl:when test="count &gt; 1">
              
<xsl:value-of select="$style-terms/cs:roles/cs:role[@term='translator']/cs:renderas/cs:multiple" />
            
</xsl:when>
            
<xsl:otherwise>
              
<xsl:value-of select="$style-terms/cs:roles/cs:role[@term='translator']/cs:renderas/cs:single" />
            
</xsl:otherwise>
          
</xsl:choose>
          
<xsl:value-of select="$suffix" />
        
</xsl:when>
      
</xsl:choose>
    
</span>
  
</xsl:template>
  
  
  <xdoc:doc>The "short" mode renders just family name(s) commom in author-year citations.</xdoc:doc>

  
<xsl:template match="mods:name" mode="short">
    
<xsl:param name="multi-authors" as="element(cs:multiple-authors)" tunnel="yes" />
    
<xsl:variable name="multi-author-use-first" select="$multi-authors/@use-first" as="xs:integer?" />
    
<xsl:variable name="multi-author-min" select="if ($multi-authors/@min-authors) then ($multi-authors/@min-authors) else xs:integer('999')" as="xs:integer" />
    
<xsl:variable name="use-multi-author-handling" select="xs:integer(count(../mods:name[mods:role/mods:roleTerm=$primary-contributors])) ge $multi-author-min" as="xs:boolean" />
    
<xsl:choose>
      
<xsl:when test="$use-multi-author-handling">
        
<xsl:choose>
          
<xsl:when test="position() le xs:integer($multi-authors/@use-first)">
            
<xsl:apply-templates select="mods:namePart[not(@type='given')]" />
            
<xsl:choose>
              
<xsl:when test="position() = last()"> </xsl:when>
              
<xsl:otherwise></xsl:otherwise>
            
</xsl:choose> 
          
</xsl:when>
          
<xsl:otherwise>
            
<xsl:if test="position() = last()">
              
<xsl:text> </xsl:text>
              
<xsl:value-of select="$multi-authors" />
            
</xsl:if>
          
</xsl:otherwise>
        
</xsl:choose>
      
</xsl:when>
      
<xsl:otherwise>
        
<xsl:apply-templates select="mods:namePart[not(@type='given')]" />
        
<xsl:choose>
          
<xsl:when test="position() = last()" />
          
<xsl:when test="position() = last() - 1"> and </xsl:when>
          
<xsl:otherwise></xsl:otherwise>
        
</xsl:choose>        
      
</xsl:otherwise>
    
</xsl:choose>
  
</xsl:template>
  
  
<xsl:template match="mods:namePart[@type='given']">
    
<xsl:for-each select=".">
      
<xsl:choose>
        
<xsl:when test="$style-names/@initialize-with">
          
<xsl:value-of select="substring(.,1,1)" />
        
</xsl:when>
        
<xsl:otherwise>
          
<xsl:value-of select="." />
          
<xsl:text> </xsl:text>
        
</xsl:otherwise>
      
</xsl:choose>
      
<!-- FIX ME: the following presents rendering difficulties in certain styles -->
      
<xsl:value-of select="$style-names/@initialize-with" />
    
</xsl:for-each>
  
</xsl:template>
  
<xsl:template match="mods:namePart[not(@type='given')]">
    
<xsl:apply-templates />
  
</xsl:template>
  
<xsl:template match="bib:year">
    
<xsl:param name="source" />
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<span class="year">
      
<xsl:value-of select="$prefix" />
      
<xsl:apply-templates />
      
<!-- we can access newly creatod key element to append suffix -->
      
<xsl:apply-templates select="../bib:year-suffix" />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<xsl:template match="bib:year-suffix">
    
<xsl:apply-templates />
  
</xsl:template>
  
  <xdoc:doc>Renders complete title/subtitle combination.</xdoc:doc>

  
<xsl:template match="mods:titleInfo[not(@type='abbreviated')]" mode="full">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:param name="font-style" />
    
<xsl:param name="font-weight" />
    
<xsl:choose>
      
<xsl:when test="../../@bib:refclass='part-inSerial' and not(../../mods:name[mods:role/mods:roleTerm=$primary-contributors])" />
      
<xsl:otherwise>
        
<span class="title">
          
<xsl:value-of select="$prefix" />
          
<xsl:if test="$font-weight">
            
<xsl:attribute name="font-weight">
              
<xsl:value-of select="$font-weight" />
            
</xsl:attribute>
          
</xsl:if>
          
<xsl:if test="$font-style">
            
<xsl:attribute name="font-style">
              
<xsl:value-of select="$font-style" />
            
</xsl:attribute>
          
</xsl:if>
          
<xsl:apply-templates select="mods:title" />
          
<xsl:apply-templates select="mods:subTitle" />
          
<xsl:value-of select="$suffix" />
        
</span>
      
</xsl:otherwise>
    
</xsl:choose>
  
</xsl:template>
  
<xsl:template match="mods:title">
    
<xsl:apply-templates />
  
</xsl:template>
  
<xsl:template match="mods:subTitle">
    
<xsl:text></xsl:text>
    
<xsl:apply-templates />
  
</xsl:template>
  
<xsl:template match="mods:originInfo">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:if test="mods:place">
      
<span class="origin">
        
<xsl:value-of select="$prefix" />
        
<xsl:apply-templates />
        
<xsl:value-of select="$suffix" />
      
</span>
    
</xsl:if>
  
</xsl:template>
  
<xsl:template match="mods:publisher">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<span class="publisher">
      
<xsl:value-of select="$prefix" />
      
<xsl:apply-templates />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<xsl:template match="mods:place">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<span class="place">
      
<xsl:value-of select="$prefix" />
      
<xsl:apply-templates select="mods:placeTerm" />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<!-- the following templates need to be combined -->
  
<xsl:template match="mods:detail[@type='volume']">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:variable name="type" select="@type" />
    
<span class="volume">
      
<xsl:value-of select="$prefix" />
      
<xsl:value-of select="$locators/cs:locator[@unit=$type]/cs:renderas/cs:single" />
      
<xsl:value-of select="mods:number" />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<xsl:template match="mods:detail[@type='issue']">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:variable name="type" select="@type" />
    
<span class="issue">
      
<xsl:value-of select="$prefix" />
      
<xsl:value-of select="$locators/cs:locator[@unit=$type]/cs:renderas/cs:single" />
      
<xsl:value-of select="mods:number" />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<xsl:template match="mods:detail[@type='file']">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:variable name="type" select="@type" />
    
<span class="file">
      
<xsl:value-of select="$prefix" />
      
<xsl:value-of select="$locators/cs:locator[@unit=$type]/cs:renderas/cs:single" />
      
<xsl:value-of select="mods:number" />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<xsl:template match="mods:detail[@type='paragraph']">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:variable name="type" select="@type" />
    
<xsl:value-of select="$prefix" />
    
<xsl:value-of select="$locators/cs:locator[@unit=$type]/cs:renderas/cs:single" />
    
<xsl:value-of select="mods:number" />
    
<xsl:value-of select="$suffix" />
  
</xsl:template>
  
<xsl:template match="mods:extent">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:variable name="unit" select="@unit" />
    
<span class="locator">
      
<xsl:value-of select="$prefix" />
      
<xsl:value-of select="$locators/cs:locator[@unit=$unit]/cs:renderas/cs:multiple" />
      
<xsl:value-of select="mods:start" />
      
<xsl:if test="mods:end">
        
<xsl:text></xsl:text>
        
<xsl:value-of select="bib:number-condense(mods:start,mods:end)" />
      
</xsl:if>
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<xsl:template match="mods:typeOfResource | mods:issuance" />
  
<xsl:template match="mods:genre">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:variable name="genre" select="." />
    
<span class="genre">
      
<xsl:value-of select="$prefix" />
      
<xsl:value-of select="$style-terms/cs:genres/cs:genre[@term=$genre]/cs:renderas" />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<xsl:template match="mods:location">
    
<xsl:param name="source" />
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:value-of select="$prefix" />
    
<span class="availability">
      
<xsl:apply-templates />
    
</span>
    
<xsl:value-of select="$suffix" />
  
</xsl:template>
  
<xsl:template match="mods:url">
    
<xsl:value-of select="." />
    
<xsl:if test="@dateLastAccessed">
      
<xsl:text> [accessed on </xsl:text>
      
<xsl:apply-templates select="./@dateLastAccessed" />
      
<xsl:text>]</xsl:text>
    
</xsl:if>
  
</xsl:template>
  
<xsl:template match="mods:physicalLocation">
    
<xsl:value-of select="." />
  
</xsl:template>
  
<!-- TODO: date handling probably needs to be redone as a function -->
  
<xsl:template match="mods:url/@dateLastAccessed">
    
<xsl:variable name="current" select="current()" />
    
<xsl:variable name="month-part" select="$month-format[xs:int(substring($current,6,2))]" />
    
<xsl:variable name="day-part">
      
<xsl:choose>
        
<xsl:when test="substring(.,9,1) = '0'">
          
<xsl:value-of select="substring(.,10,1)" />
        
</xsl:when>
        
<xsl:otherwise>
          
<xsl:value-of select="substring(.,9,2)" />
        
</xsl:otherwise>
      
</xsl:choose>
    
</xsl:variable>
    
<span class="date-accessed">
      
<xsl:if test="substring(.,6,2)">
        
<xsl:text />
        
<xsl:value-of select="$month-part" />
      
</xsl:if>
      
<xsl:if test="substring(.,9,2)">
        
<xsl:text> </xsl:text>
        
<xsl:value-of select="$day-part" />
      
</xsl:if>
      
<xsl:if test="substring(.,6,2)">
        
<xsl:text />
      
</xsl:if>
      
<xsl:if test="../@dateLastAccessed">
        
<xsl:text></xsl:text>
        
<xsl:value-of select="substring(.,1,4)" />
      
</xsl:if>
    
</span>
  
</xsl:template>
  
  <xdoc:doc>configures month formatting based on CSL definition</xdoc:doc>

  
<xsl:variable name="month-format" as="element()*">
    
<xsl:sequence select="$styles/cs:citationstyle/cs:content/cs:dates/cs:months/cs:month" />
  
</xsl:variable>
  
<xsl:template match="mods:date | mods:dateIssued" mode="month">
    
<xsl:param name="source" />
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:variable name="current" select="current()" />
    
<xsl:choose>
      
<xsl:when test="current() castable as xs:gYearMonth or current() castable as xs:date">
        
<xsl:variable name="month-part" select="$month-format[xs:int(substring($current,6,2))]" />
        
<span class="month">
          
<xsl:apply-templates select="$prefix" />
          
<xsl:value-of select="$month-part" />
          
<xsl:apply-templates select="$suffix" />
        
</span>
      
</xsl:when>
    
</xsl:choose>
  
</xsl:template>
  
<xsl:template match="mods:date | mods:dateIssued" mode="day">
    
<xsl:param name="source" />
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<xsl:variable name="day-part">
      
<xsl:choose>
        
<xsl:when test="substring(.,9,1) = '0'">
          
<xsl:value-of select="substring(.,10,1)" />
        
</xsl:when>
        
<xsl:otherwise>
          
<xsl:value-of select="substring(.,9,2)" />
        
</xsl:otherwise>
      
</xsl:choose>
    
</xsl:variable>
    
<xsl:if test="current() castable as xs:date">
      
<span class="day">
        
<xsl:value-of select="$prefix" />
        
<xsl:value-of select="$day-part" />
        
<xsl:value-of select="$suffix" />
      
</span>
    
</xsl:if>
  
</xsl:template>
  
<xsl:template match="mods:note[@type='citation']">
    
<xsl:param name="prefix" />
    
<xsl:param name="suffix" />
    
<span class="note">
      
<xsl:value-of select="$prefix" />
      
<xsl:value-of select="." />
      
<xsl:value-of select="$suffix" />
    
</span>
  
</xsl:template>
  
<xsl:template match="mods:physicalDescription | mods:note[not(@type='citation')]" />
</xsl:stylesheet>






































v