<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  version="1.0"
  xmlns:reference="http://namesforlife.com/ns/reference"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  exclude-result-prefixes="reference"
  >

    <xsl:template match="reference:citation[@citation-type='journal']" mode="text-citation-short">
        <xsl:apply-templates select="reference:authors" mode="author-string-primary" />
        <xsl:text> (</xsl:text>
        <xsl:value-of select="reference:year" />
        <xsl:text>) </xsl:text>
        <xsl:choose>
            <xsl:when test="reference:abbrev">
                <xsl:value-of select="reference:abbrev" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="reference:source" />
            </xsl:otherwise>
        </xsl:choose>
        <xsl:text> </xsl:text>
        <xsl:if test="reference:volume">
            <xsl:value-of select="reference:volume" />
            <xsl:text>:</xsl:text>
        </xsl:if>
        <xsl:value-of select="reference:fpage" />
    </xsl:template>

    <xsl:template match="reference:citation[@citation-type='book']" mode="text-citation-short">
        <xsl:choose>
            <xsl:when test="reference:abbrev">
                <xsl:value-of select="reference:abbrev" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="reference:source" />
            </xsl:otherwise>
        </xsl:choose>
        <xsl:if test="reference:edition">
            <xsl:text>, </xsl:text>
            <xsl:apply-templates select="reference:edition" mode="format-edition" />
        </xsl:if>
        <xsl:if test="reference:volume">
            <xsl:text>, Vol. </xsl:text>
            <xsl:value-of select="reference:volume" />
        </xsl:if>
        <xsl:if test="reference:year">
            <xsl:text>, </xsl:text>
            <xsl:value-of select="reference:year" />
        </xsl:if>
    </xsl:template>

    <xsl:template match="reference:citation[@citation-type='thesis']" mode="text-citation-short">
        <xsl:if test="reference:authors">
            <xsl:apply-templates select="reference:authors" mode="author-string-full" />
            <xsl:text>.</xsl:text>
        </xsl:if>
        <xsl:if test="reference:label">
            <xsl:text>, </xsl:text>
            <xsl:value-of select="reference:label" />
            <xsl:if test="reference:year">
                <xsl:text> </xsl:text>
                <xsl:value-of select="reference:year" />
            </xsl:if>
        </xsl:if>
    </xsl:template>

    <xsl:template match="reference:citation[@citation-type='journal']" mode="text-citation-full">
        <xsl:apply-templates select="reference:authors" mode="author-string-full" />
        <xsl:text>. </xsl:text>
        <xsl:if test="reference:article-title">
            <xsl:value-of select="reference:article-title" />
            <xsl:if test="substring(reference:article-title, string-length(reference:article-title)) != '.'">.</xsl:if>
            <xsl:text> </xsl:text>
        </xsl:if>
        <xsl:choose>
            <xsl:when test="reference:abbrev">
                <i><xsl:value-of select="reference:abbrev" /></i>
            </xsl:when>
            <xsl:otherwise>
                <i><xsl:value-of select="reference:source" /></i>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:text> </xsl:text>
        <xsl:value-of select="reference:year" />
        <xsl:text>; </xsl:text>
        <xsl:if test="reference:volume">
            <b><xsl:value-of select="reference:volume" /></b>
            <xsl:text>:</xsl:text>
        </xsl:if>
        <xsl:value-of select="reference:fpage" />
        <xsl:if test="reference:lpage">
            <xsl:text>-</xsl:text>
            <xsl:value-of select="reference:lpage" />
        </xsl:if>
        <xsl:text>.</xsl:text>
        <xsl:for-each select="reference:pub-id">
            <xsl:text> </xsl:text>
            <xsl:choose>
                <xsl:when test="@pub-id-type='doi'"></xsl:when>
                <xsl:otherwise><xsl:text>[</xsl:text></xsl:otherwise>
            </xsl:choose>
            <a>
                <xsl:attribute name="target"><xsl:text>_blank</xsl:text></xsl:attribute>
                <xsl:attribute name="href">
                    <xsl:choose>
                        <xsl:when test="@pub-id-type='pmid'"><xsl:text>https://www.ncbi.nlm.nih.gov/pubmed/</xsl:text><xsl:value-of select="." /></xsl:when>
                        <xsl:when test="@pub-id-type='doi'"><xsl:text>https://doi.org/</xsl:text><xsl:value-of select="." /></xsl:when>
                        <xsl:otherwise><xsl:value-of select="@pub-id-type" /><xsl:text>:</xsl:text><xsl:value-of select="." /></xsl:otherwise>
                    </xsl:choose>
                </xsl:attribute>
                <xsl:choose>
                    <xsl:when test="@pub-id-type='doi'"><xsl:text>https://doi.org/</xsl:text><xsl:value-of select="." /></xsl:when>
                    <xsl:when test="@pub-id-type='pmid'">PubMed</xsl:when>
                    <xsl:otherwise><xsl:value-of select="." /></xsl:otherwise>
                </xsl:choose>
            </a>
            <xsl:choose>
                <xsl:when test="@pub-id-type='doi'"></xsl:when>
                <xsl:otherwise><xsl:text>]</xsl:text></xsl:otherwise>
            </xsl:choose>
            <xsl:if test="position()=last()"><xsl:text>.</xsl:text></xsl:if>
        </xsl:for-each>
    </xsl:template>

<!--
    author, chapter title, In: editor name(s), Ed(s), book title, publisher, city, year, page(s)

    <edb>10. Garrity GM, Bell JA, Lilburn T. Class III. Gammaproteobacteria class. nov. In: DJ Brenner, NR Krieg, JT Staley, Garrity GM (eds), Bergey's Manual of Systematic Bacteriology, second edition, vol. 2 (The Proteobacteria), part B (The Gammaproteobacteria), Springer, New York, 2005, p. 1.</edb>
    <edb>11. Garrity GM, Bell JA, Lilburn T. Order VIII. Oceanospirillales ord. nov. In: DJ Brenner, NR Krieg, JT Staley, Garrity GM (eds), Bergey's Manual of Systematic Bacteriology, second edition, vol. 2 (The Proteobacteria), part B (The Gammaproteobacteria), Springer, New York, 2005, p. 270.</edb>
-->

    <xsl:template match="reference:citation[@citation-type='book']" mode="text-citation-full">
        <xsl:if test="reference:authors">
            <xsl:apply-templates select="reference:authors" mode="author-string-full" />
            <xsl:text>.</xsl:text>
        </xsl:if>
        <xsl:if test="reference:article-title">
            <xsl:if test="reference:authors">
                <xsl:text> </xsl:text>
            </xsl:if>
            <xsl:value-of select="reference:article-title" />
            <xsl:if test="substring(reference:article-title, string-length(reference:article-title)) != '.'">.</xsl:if>
        </xsl:if>
        <xsl:if test="reference:editors">
            <xsl:if test="reference:authors or reference:article-title">
                <xsl:text> </xsl:text>
            </xsl:if>
            <i>In:</i>
            <xsl:text> </xsl:text>
            <xsl:apply-templates select="reference:editors" mode="author-string-full" />
            <xsl:text> (ed</xsl:text>
            <xsl:if test="count(reference:editors/reference:person-name) &gt; 1">
                <xsl:text>s</xsl:text>
            </xsl:if>
            <xsl:text>)</xsl:text>
            <xsl:if test="reference:source or reference:publisher-name or reference:publisher-loc or reference:year or reference:fpage">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="reference:source">
            <xsl:text> </xsl:text>
            <xsl:choose>
                <xsl:when test="reference:abbrev">
                    <xsl:value-of select="reference:abbrev" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="reference:source" />
                </xsl:otherwise>
            </xsl:choose>
            <xsl:if test="reference:edition">
                <xsl:text>, </xsl:text>
                <xsl:apply-templates select="reference:edition" mode="format-edition" />
            </xsl:if>
            <xsl:if test="reference:volume">
                <xsl:text>, Volume </xsl:text>
                <xsl:value-of select="reference:volume" />
            </xsl:if>
            <xsl:if test="reference:publisher-name or reference:publisher-loc or reference:year or reference:fpage">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="reference:publisher-name">
            <xsl:text> </xsl:text>
            <xsl:value-of select="reference:publisher-name" />
            <xsl:if test="reference:publisher-loc or reference:year or reference:fpage">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="reference:publisher-loc">
            <xsl:text> </xsl:text>
            <xsl:value-of select="reference:publisher-loc" />
            <xsl:if test="reference:year or reference:fpage">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="reference:year">
            <xsl:text> </xsl:text>
            <xsl:value-of select="reference:year" />
            <xsl:if test="reference:fpage">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="reference:fpage">
            <xsl:text> p. </xsl:text>
            <xsl:value-of select="reference:fpage" />
            <xsl:if test="reference:lpage">
                <xsl:text>-</xsl:text>
                <xsl:value-of select="reference:lpage" />
            </xsl:if>
        </xsl:if>
        <xsl:text>.</xsl:text>
    </xsl:template>

<!--
    Iyer, Naresh Sundaram. "A Family of Dominance Filters for Multiple Criteria 
    Decision Making: Choosing the Right Filter for a Decision Situation."  
    Ph.D. diss., Ohio State University, 2001.
-->
    <xsl:template match="reference:citation[@citation-type='thesis']" mode="text-citation-full">
        <xsl:if test="reference:authors">
            <xsl:apply-templates select="reference:authors" mode="author-string-full" />
            <xsl:text>.</xsl:text>
        </xsl:if>
        <xsl:if test="reference:article-title">
            <xsl:if test="reference:authors">
                <xsl:text> </xsl:text>
            </xsl:if>
            <xsl:text>"</xsl:text>
            <xsl:value-of select="reference:article-title" />
            <xsl:if test="substring(reference:article-title, string-length(reference:article-title)) != '.'">.</xsl:if>
            <xsl:text>"</xsl:text>
        </xsl:if>
        <xsl:if test="reference:label">
            <xsl:text> </xsl:text>
            <xsl:value-of select="reference:label" />
            <xsl:if test="reference:institution or reference:year">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="reference:institution">
            <xsl:text> </xsl:text>
            <xsl:value-of select="reference:institution" />
            <xsl:if test="reference:year">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="reference:year">
            <xsl:text> </xsl:text>
            <xsl:value-of select="reference:year" />
            <xsl:if test="reference:fpage">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="reference:fpage">
            <xsl:text> p. </xsl:text>
            <xsl:value-of select="reference:fpage" />
            <xsl:if test="reference:lpage">
                <xsl:text>-</xsl:text>
                <xsl:value-of select="reference:lpage" />
            </xsl:if>
        </xsl:if>
        <xsl:text>.</xsl:text>
    </xsl:template>

    <xsl:template match="reference:edition" mode="format-edition">
        <xsl:choose>
            <xsl:when test="text()='1'">
                <xsl:text>First Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='2'">
                <xsl:text>Second Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='3'">
                <xsl:text>Third Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='4'">
                <xsl:text>Fourth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='5'">
                <xsl:text>Fifth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='6'">
                <xsl:text>Sixth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='7'">
                <xsl:text>Seventh Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='8'">
                <xsl:text>Eighth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='9'">
                <xsl:text>Ninth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='10'">
                <xsl:text>Tenth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='11'">
                <xsl:text>Eleventh Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='12'">
                <xsl:text>Twelfth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='13'">
                <xsl:text>Thirteenth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='14'">
                <xsl:text>Fourteenth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='15'">
                <xsl:text>Fifteenth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='16'">
                <xsl:text>Sixteenth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='17'">
                <xsl:text>Seventeenth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='18'">
                <xsl:text>Eighteenth Edition</xsl:text>
            </xsl:when>
            <xsl:when test="text()='19'">
                <xsl:text>Ninteenth Edition</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>Edition </xsl:text>
                <xsl:value-of select="text()" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="reference:authors|reference:editors" mode="author-string-primary">
        <xsl:choose>
            <xsl:when test="count(reference:person-name) = 1">
                <xsl:apply-templates select="reference:person-name[1]" mode="last" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="reference:person-name[1]" mode="last" />
                <xsl:text> et al.</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="reference:authors|reference:editors" mode="author-string-condensed">
        <xsl:choose>
            <xsl:when test="count(reference:person-name) = 1">
                <xsl:apply-templates select="reference:person-name[1]" mode="last-first" />
            </xsl:when>
            <xsl:when test="count(reference:person-name) = 2">
                <xsl:apply-templates select="reference:person-name[1]" mode="last-first" />
                <xsl:text> and </xsl:text>
                <xsl:apply-templates select="reference:person-name[2]" mode="last-first" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="reference:person-name[1]" mode="last-first" />
                <xsl:text> et al.</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="reference:authors|reference:editors" mode="author-string-full">
        <xsl:for-each select="reference:person-name">
            <xsl:if test="position() != 1">
                <xsl:text>, </xsl:text>
            </xsl:if>
            <xsl:choose>
                <xsl:when test="position()=1 and name(..)='authors'"><b><xsl:apply-templates select="." mode="last-first" /></b></xsl:when>
                <xsl:otherwise><xsl:apply-templates select="." mode="last-first" /></xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="reference:person-name" mode="last-first">
        <xsl:value-of select="reference:surname" />
        <xsl:if test="reference:given-names/text()">
            <xsl:text> </xsl:text>
            <xsl:value-of select="translate(reference:given-names, '.', '')" />
        </xsl:if>
        <xsl:if test="reference:suffix">
            <xsl:text> </xsl:text>
            <xsl:value-of select="reference:suffix" />
        </xsl:if>
    </xsl:template>

    <xsl:template match="reference:person-name" mode="first-last">
        <xsl:if test="reference:given-names/text()">
            <xsl:value-of select="reference:given-names" />
            <xsl:text> </xsl:text>
        </xsl:if>
        <xsl:value-of select="reference:surname" />
        <xsl:if test="reference:suffix">
            <xsl:text> </xsl:text>
            <xsl:value-of select="reference:suffix" />
        </xsl:if>
    </xsl:template>

    <xsl:template match="reference:person-name" mode="last">
        <xsl:value-of select="reference:surname" />
    </xsl:template>

</xsl:stylesheet>
