|
<xsl:stylesheet xmlns="http://purl.org/NET/xbiblio/citeproc" 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="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) > 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 > 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> <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> <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:integer(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> <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:integer(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 |


