<?xml version="1.0" encoding="UTF-8"?>

<!--
Copyright: 2014 Regents of the University of California and the
           National Center for Ecological Analysis and Synthesis
      '$Id$'
  '$Author$'
    '$Date$'
'$Revision$'

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

This is an XSLT (http://www.w3.org/TR/xslt) stylesheet designed to
convert an XML file in EML 2.1.1 format to the Dryad Metadata Profile version 3.1 format
-->

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2011/XMLSchema"
                xmlns:eml="eml://ecoinformatics.org/eml-2.0.1"
                xmlns:dryad="http://purl.org/dryad/schema/terms/v3.1"
                xmlns:dwc="http://rs.tdwg.org/dwc/terms/" 
                xmlns:dcterms="http://purl.org/dc/terms/" 
                xmlns:bibo="http://purl.org/dryad/schema/dryad-bibo/v3.1">
                
    <xsl:output method="xml" indent="yes" encoding="UTF-8" media-type="text/xml"/>
    <xsl:strip-space elements="*" />
        
    <!-- The root template, matching the eml:eml element-->
    <xsl:template match="/eml:eml" name="main">
        <xsl:element name="DryadDataPackage">
            <xsl:attribute name="dwc" namespace="http://rs.tdwg.org/dwc/terms/">http://rs.tdwg.org/dwc/terms/</xsl:attribute>
            <xsl:attribute name="dcterms" namespace="http://purl.org/dc/terms/">http://purl.org/dc/terms/</xsl:attribute>
            <xsl:attribute name="bibo" namespace="http://purl.org/dryad/schema/dryad-bibo/v3.1">http://purl.org/dryad/schema/dryad-bibo/v3.1</xsl:attribute>
            <xsl:attribute name="xsi" namespace="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</xsl:attribute>
            <xsl:attribute name="schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">http://purl.org/dryad/schema/terms/v3.1 http://datadryad.org/profile/v3.1/dryad.xsd</xsl:attribute>
            <xsl:attribute name="targetNamespace">http://purl.org/dryad/schema/terms/v3.1</xsl:attribute>
            
            <!-- add the metadata type -->
            <xsl:element name="dcterms:type">package</xsl:element>
            <xsl:call-template name="set-dataset-creators"/>
            
            <!-- add the date submitted, defaulting to the current date -->
            <xsl:comment>We don't have a way to get dateSubmitted from EML, using current-date()</xsl:comment>
            <xsl:element name="dcterms:dateSubmitted"><xsl:value-of select="current-date()" /></xsl:element>
            
            <!-- add the date available, defaulting to the current date -->
            <xsl:comment>We don't have a way to get the availability date from EML, using current-date()</xsl:comment>
            <xsl:element name="dcterms:available"><xsl:value-of select="current-date()" /></xsl:element>
            
            <!-- add the dataset title -->
            <xsl:call-template name="set-dataset-title"/>
                 
            <!-- add the dataset id -->
            <xsl:element name="dcterms:identifier">
                <xsl:value-of select="@packageId"/>
            </xsl:element>

            <!-- add the abstract as a description -->
            <xsl:call-template name="set-dataset-description" />
            
            <!-- add the keywords as subjects -->
            <xsl:call-template name="set-dataset-subjects" />
            
            <!-- add the taxonomic coverage as scientific names -->
            <xsl:call-template name="set-scientific-names" />

            <!-- add the geographic coverage as dcterms:spatial -->
            <xsl:call-template name="set-spatial" />

            <!-- add the temporal coverage as dcterms:temporal -->
            <xsl:call-template name="set-temporal" />

            <!-- TODO: optioanlly add dryad:external element -->
            <!-- TODO: optioanlly add dcterms:references element -->
            <!-- TODO: optioanlly add bibo:pmid element -->
            <!-- TODO: optioanlly add bibo:Journal element -->
            
            <!-- add the data file distribution urls as dcterms:hasPart -->
            <xsl:for-each select="//physical/distribution/online">
                <xsl:if test="url != ''">
                    <xsl:element name="dcterms:hasPart">
                        <xsl:value-of select="url" />
                    </xsl:element>
                </xsl:if>
            </xsl:for-each>
            
        </xsl:element>
    </xsl:template> 
    
    <!-- template that matches dataset creators, creates dcterms:creator -->    
    <xsl:template match="dataset/creator" name="set-dataset-creators">
        <xsl:element name="dcterms:creator">
            <xsl:choose>
                <xsl:when test="individualName"><xsl:call-template name="set-individual-name" /></xsl:when>
                <xsl:when test="organizationName"><xsl:value-of select="organizationName" /></xsl:when>
                <xsl:when test="positionName"><xsl:value-of select="positionName" /></xsl:when>            
            </xsl:choose>
        </xsl:element>
    </xsl:template>
    
    <!-- template that matches creator individualName -->    
    <xsl:template match="individualName" name="set-individual-name">
            <xsl:if test="salutation != ''">
                <xsl:value-of select="salutation" />
                <xsl:value-of select="' '" />
            </xsl:if>
            <xsl:if test="givenName != ''">
                <xsl:for-each select="givenName">
                    <xsl:value-of select="." />
                    <xsl:value-of select="' '" />
                </xsl:for-each>
            </xsl:if>
            <xsl:value-of select="surName" />
    </xsl:template>
    
    <!-- template that matches dataset/title, creates dcterms:title -->    
    <xsl:template match="dataset/title" name="set-dataset-title">
        <xsl:element name="dcterms:title">
            <xsl:value-of select="dataset/title" />
        </xsl:element>
    </xsl:template>

    <!-- template that matches dataset/abstract, creates dcterms:description -->    
    <xsl:template match="dataset/abstract" name="set-dataset-description">
        <xsl:element name="dcterms:description">
            <xsl:if test="dataset/abstract != ''">
                <xsl:value-of select="dataset/abstract" />
            </xsl:if>
            <xsl:if test="dataset/abstract/section != ''">
                <xsl:value-of select="dataset/abstract/section" />
            </xsl:if>
            <xsl:if test="dataset/abstract/para != ''">
                <xsl:value-of select="dataset/abstract/para" />
            </xsl:if>
        </xsl:element>
    </xsl:template>

    <!-- template that matches dataset/keywordSet, creates dcterms:subject -->    
    <xsl:template match="dataset/keywordSet" name="set-dataset-subjects">
            <xsl:if test="./keyword != ''">
                <xsl:for-each select="keyword">
                    <xsl:element name="dcterms:subject">
                        <xsl:value-of select="." />
                    </xsl:element>
                </xsl:for-each>
            </xsl:if>
    </xsl:template>

    <!-- template that matches dataset/coverage/taxonomicCoverage/taxonomicClassification , creates dcterms:scientificName -->    
    <xsl:template match="dataset/coverage/taxonomicCoverage/taxonomicClassification" name="set-scientific-names">
            <xsl:if test=".//taxonRankValue != ''">
                <xsl:for-each select=".//taxonRankValue">
                    <!-- Include the taxonRankName as a comment for troubleshooting -->
                    <xsl:comment>
                        <xsl:value-of select="name(preceding-sibling::*[1])" />
                        <xsl:value-of select="': '" />
                        <xsl:value-of select="preceding-sibling::*[1]" />
                    </xsl:comment>
                    <xsl:element name="dcterms:scientificName">
                        <xsl:value-of select="." />
                    </xsl:element>
                </xsl:for-each>
            </xsl:if>
    </xsl:template>

    <!-- template that matches dataset/coverage/geographicCoverage , creates dcterms:spatial -->    
    <xsl:template match="dataset/coverage/geographicCoverage" name="set-spatial">
            <xsl:if test="geographicDescription != ''">
                <xsl:element name="dcterms:spatial">
                    <xsl:value-of select="geographicDescription" />
                </xsl:element>
            </xsl:if>
    </xsl:template>

    <!-- template that matches dataset/coverage/temporalCoverage , creates dcterms:temporal -->    
    <xsl:template match="dataset/coverage/temporalCoverage" name="set-temporal">
        <xsl:choose>
            <xsl:when test="singleDateTime/calendarDate != ''">
                <xsl:element name="dcterms:temporal">
                    <xsl:value-of select="singleDateTime/calendarDate" />
                    <xsl:if test="singleDateTime/time != ''">
                        <xsl:value-of select="' '" />
                        <xsl:value-of select="singleDateTime/time" />
                    </xsl:if>
                </xsl:element>
            </xsl:when>
            <xsl:when test="rangeOfDates/beginDate/calendarDate != ''">
                <xsl:element name="dcterms:temporal">
                    <!-- add the begin date/time -->
                    <xsl:value-of select="rangeOfDates/beginDate/calendarDate" />
                    <xsl:if test="rangeOfDates/beginDate/time != ''">
                        <xsl:value-of select="' '" />
                        <xsl:value-of select="rangeOfDates/beginDate/time" />
                    </xsl:if>

                    <xsl:value-of select="' TO '" />
                    
                    <!-- add the end date/time -->
                    <xsl:value-of select="rangeOfDates/endDate/calendarDate" />
                    <xsl:if test="rangeOfDates/endDate/time != ''">
                        <xsl:value-of select="' '" />
                        <xsl:value-of select="rangeOfDates/endDate/time" />
                    </xsl:if>
                </xsl:element>
                
            </xsl:when>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>