<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:output encoding="ISO-8859-1"/>
<xsl:strip-space elements="*"/>

<xsl:param name="packageDir" select="''"/>

  <xsl:variable name="pack" select="/"/>
	<xsl:variable name="acb6" select="document(concat($packageDir,$pack/package/acl))"/>
	<xsl:variable name="dsb6" select="document(concat($packageDir,$pack/package/@id))"/>
  
  <xsl:include href="eml2entphy.xsl"/>
  <xsl:include href="eml2project.xsl"/>

  <xsl:template match="/">

 	<!-- assign variables for input docs i.e. beta6 dataset and access -->
 

    <eml:eml
      packageId = "{$dsb6/dataset/identifier}"
      system= "knb"
      xmlns:eml="eml://ecoinformatics.org/eml-2.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:ds="eml://ecoinformatics.org/dataset-2.0.0"
      xmlns:stmml="http://www.xml-cml.org/schema/stmml"
      xsi:schemaLocation="eml://ecoinformatics.org/eml-2.0.0 eml.xsd"> 
      <dataset>
        <xsl:if test="$dsb6/dataset/shortName!=''">
          <xsl:element name="shortName">
            <xsl:value-of select="$dsb6/dataset/shortName"/>
          </xsl:element>
        </xsl:if>  
        <xsl:if test="$dsb6/dataset/title!=''">
          <xsl:element name="title">
            <xsl:value-of select="$dsb6/dataset/title"/>
          </xsl:element>
        </xsl:if> 
        
        <!-- eml2 has a 'creator' tag with 'ResponsibleParty' content while           -->
        <!-- beta6 has an 'originator' tag with a 'role' element                      -->
        <!-- eml2 also has separate elements for metadataProvider and associatedParty -->
        <!-- use the 'role' value from emlb6 to detemine where info goes in eml2      -->
        <xsl:for-each select="$dsb6/dataset/originator/role">
          <xsl:choose>
            <xsl:when test="((.='Originator')or(.='originator')or(.='Principal Investigator')or(.=''))">
              <xsl:element name="creator">
                <xsl:call-template name="responsibleParty"/>
              </xsl:element>  
            </xsl:when>
            <xsl:otherwise>  <!-- creator is a required element; this put some info there if role is missing -->
           <!--   <xsl:element name="creator">
                <xsl:call-template name="responsibleParty"/>
              </xsl:element> --> 
            </xsl:otherwise>
          </xsl:choose>  
        </xsl:for-each>
          
        <xsl:for-each select="$dsb6/dataset/originator/role">
          <xsl:if test="(.='Metadata Provider')">
            <xsl:element name="metadataProvider">
              <xsl:call-template name="responsibleParty"/>
            </xsl:element>
          </xsl:if>
        </xsl:for-each>

          <xsl:for-each select="$dsb6/dataset/originator/role">
          <xsl:if test="((.!='Metadata Provider')and(.!='Originator')and(.!='Data Contact')and(.!='Principal Investigator')and(.!=''))">
            <xsl:element name="associatedParty">
              <xsl:call-template name="responsibleParty"/>
              <xsl:element name="role">
                <xsl:value-of select="."/>
              </xsl:element>
            </xsl:element>
          </xsl:if>
          </xsl:for-each>
          <xsl:if test="$dsb6/dataset/pubDate!=''">
            <xsl:element name="pubDate">
              <xsl:value-of select="$dsb6/dataset/pubDate"/>
            </xsl:element>
          </xsl:if>
	    <!-- Note - b6 has a 'pubPlace' element that occurs later in eml2 -->      


          <xsl:if test="$dsb6/dataset/series!=''">
            <xsl:element name="series">
              <xsl:value-of select="$dsb6/dataset/series"/>
            </xsl:element>
          </xsl:if>

          <xsl:if test="$dsb6/dataset/abstract!=''">
            <xsl:element name="abstract">
              <xsl:for-each select="$dsb6/dataset/abstract/paragraph">
                <xsl:element name="para">
                  <xsl:value-of select="."/>
                </xsl:element>
              </xsl:for-each>  
            </xsl:element>
          </xsl:if>

          <xsl:for-each select="$dsb6/dataset/keywordSet">
            <xsl:element name="keywordSet">
              <xsl:for-each select="./keyword">
               <xsl:choose>
               <xsl:when test="./@keywordType!=''">
                <keyword keywordType="{./@keywordType}">
                  <xsl:value-of select="."/>
                </keyword> 
               </xsl:when>
               <xsl:otherwise>
                <keyword>
                  <xsl:value-of select="."/>
                </keyword> 
               </xsl:otherwise>
               </xsl:choose>
              </xsl:for-each>
              <xsl:for-each select="./keywordThesaurus">
                <xsl:element name="keywordThesaurus">
                  <xsl:value-of select="."/>
                </xsl:element>
              </xsl:for-each>
            </xsl:element>
          </xsl:for-each>


          
          <xsl:if test="$dsb6/dataset/additionalInfo!=''">
            <xsl:element name="additionalInfo">
              <xsl:for-each select="$dsb6/dataset/additionalInfo/paragraph">
                <xsl:element name="para">
                  <xsl:value-of select="."/>
                </xsl:element>
              </xsl:for-each>  
            </xsl:element>
          </xsl:if>

          <xsl:if test="$dsb6/dataset/rights!=''">
            <xsl:element name="intellectualRights">
              <xsl:for-each select="$dsb6/dataset/rights/paragraph">
                <xsl:element name="para">
                  <xsl:value-of select="."/>
                </xsl:element>
              </xsl:for-each>  
            </xsl:element>
          </xsl:if>
          
          <xsl:if test="(($dsb6/dataset/onlineURL!='')or($dsb6/dataset/offlineMedium!=''))">
            <xsl:if test="($dsb6/dataset/onlineURL!='')">
              <xsl:element name="distribution">
                <xsl:element name="online">
                  <xsl:element name="url">
                    <xsl:value-of select="$dsb6/dataset/onlineURL/url"/>
                  </xsl:element>
                </xsl:element>
              </xsl:element>
            </xsl:if>
          <xsl:if test="($dsb6/dataset/offlineMedium!='')">
              <xsl:element name="distribution">
                <xsl:element name="offline">
                  <xsl:if test="$dsb6/dataset/offlineMedium/medName!=''"> 
                    <xsl:element name="mediumName">
                      <xsl:value-of select="$dsb6/dataset/offlineMedium/medName"/>
                    </xsl:element>
                  </xsl:if>
                  <xsl:if test="$dsb6/dataset/offlineMedium/medDensity!=''"> 
                    <xsl:element name="mediumDensity">
                      <xsl:value-of select="$dsb6/dataset/offlineMedium/medDensity"/>
                    </xsl:element>
                  </xsl:if>
                  <xsl:if test="$dsb6/dataset/offlineMedium/medDensityUnits!=''"> 
                    <xsl:element name="mediumDensityUnits">
                      <xsl:value-of select="$dsb6/dataset/offlineMedium/medDensityUnits"/>
                    </xsl:element>
                  </xsl:if>
                  <xsl:if test="$dsb6/dataset/offlineMedium/medVolume!=''"> 
                    <xsl:element name="mediumVolume">
                      <xsl:value-of select="$dsb6/dataset/offlineMedium/medVolume"/>
                    </xsl:element>
                  </xsl:if>
                  <xsl:if test="$dsb6/dataset/offlineMedium/medFormat!=''"> 
                    <xsl:element name="mediumFormat">
                      <xsl:value-of select="$dsb6/dataset/offlineMedium/medFormat"/>
                    </xsl:element>
                  </xsl:if>
                  <xsl:if test="$dsb6/dataset/offlineMedium/medNote!=''"> 
                    <xsl:element name="mediumNote">
                      <xsl:value-of select="$dsb6/dataset/offlineMedium/medNote"/>
                    </xsl:element>
                  </xsl:if>
                </xsl:element>
              </xsl:element>
            </xsl:if>
          </xsl:if>

          
        <xsl:if test="(($dsb6/dataset/temporalCov!='')or($dsb6/dataset/geographicCov!='')or($dsb6/dataset/taxonomicCov!=''))">
          <xsl:element name="coverage">
            
            <xsl:if test="$dsb6/dataset/geographicCov!=''">            
              <xsl:for-each select="$dsb6/dataset/geographicCov">
                <xsl:element name="geographicCoverage">
                  <xsl:call-template name="geographicCoverage"/>
                </xsl:element> 
              </xsl:for-each>
            </xsl:if>

            <xsl:if test="$dsb6/dataset/temporalCov!=''">
              <xsl:for-each select="$dsb6/dataset/temporalCov">
                <xsl:element name="temporalCoverage">
                  <xsl:call-template name="temporalCoverage"/>
                </xsl:element> 
              </xsl:for-each>
            </xsl:if>
            
            <xsl:if test="$dsb6/dataset/taxonomicCov/taxoncl!=''">
              <xsl:for-each select="$dsb6/dataset/taxonomicCov">
                <xsl:element name="taxonomicCoverage">
                  <xsl:call-template name="taxonomicCoverage"/>
                </xsl:element> 
              </xsl:for-each>
            </xsl:if>
            
          </xsl:element> 
        </xsl:if>  

        <xsl:for-each select="$dsb6/dataset/originator/role">
          <xsl:if test="(.='Data Contact')">                 
       <!--   <xsl:when test="$dsb6/dataset/originator/role[contains(.,'ontact')]"> -->
              <xsl:element name="contact">
                <xsl:call-template name="responsibleParty"/>
              </xsl:element>
        <!--  </xsl:when>
          <xsl:otherwise>
              <xsl:element name="contact">
                <xsl:call-template name="responsibleParty"/>
              </xsl:element>  
          </xsl:otherwise>
        </xsl:choose> -->
	</xsl:if>
        </xsl:for-each>

          <xsl:if test="$dsb6/dataset/pubPlace!=''">
            <xsl:element name="pubPlace">
              <xsl:value-of select="$dsb6/dataset/pubPlace"/>
            </xsl:element>
          </xsl:if>
          <!-- if beta6 has a project module, its information is inserted here in a 'method'
               element followed by a 'project' element-->
          <xsl:for-each select="$pack/package/project">
            <xsl:call-template name="project">
              <xsl:with-param name="projectID">
                <xsl:value-of select="$pack/package/project"/>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>
          
          <access
            order="{$acb6/acl/@order}"
            authSystem="{$acb6/acl/@authSystem}" >
            <xsl:for-each select="$acb6/acl/*">
              <xsl:if test="name(.)='allow'">
                <xsl:element name="allow">
                  <xsl:element name="principal">
                    <xsl:value-of select="./principal"/>
                  </xsl:element>
                  <xsl:element name="permission">
                    <xsl:value-of select="./permission"/>
                  </xsl:element>
                </xsl:element>
              </xsl:if>  
              <xsl:if test="name(.)='deny'">
                <xsl:element name="deny">
                    <xsl:element name="principal">
                      <xsl:value-of select="./principal"/>
                    </xsl:element>
                    <xsl:element name="permission">
                    <xsl:value-of select="../deny/permission"/>
                  </xsl:element>
                </xsl:element>
              </xsl:if>
          </xsl:for-each>
          </access>
          
          <xsl:for-each select="$pack/package/entities/entity">  
            <xsl:element name="dataTable">
              <xsl:call-template name="dataSet">
                <xsl:with-param name="enb6ID" select="./@id"/>
                <xsl:with-param name="phb6ID" select="./physical"/>
                <xsl:with-param name="datab6ID" select="./dataFile"/>
                <xsl:with-param name="attb6ID" select="./attribute"/>
              </xsl:call-template>
            
            </xsl:element>
          </xsl:for-each>  
        </dataset>
    </eml:eml>
	</xsl:template>
  
  <!--templates to be called from main template              -->
  <xsl:template name="responsibleParty">
    <xsl:choose>
      <xsl:when test="../individualName!='' or ../organizationName!='' or ../positionName!=''">
              <xsl:if test="../individualName!=''">
                <xsl:element name="individualName">
                  <xsl:if test="../individualName/salutation!=''">
                    <xsl:element name="salutation">
                      <xsl:value-of select="../individualName/salutation"/>
                    </xsl:element>
                  </xsl:if>
                  <xsl:if test="../individualName/givenName!=''">
                    <xsl:element name="givenName">
                      <xsl:value-of select="../individualName/givenName"/>
                    </xsl:element>
                  </xsl:if>
                  <xsl:if test="../individualName/surName!=''">
                    <xsl:element name="surName">
                      <xsl:value-of select="../individualName/surName"/>
                    </xsl:element>
                  </xsl:if>
                </xsl:element>
              </xsl:if>
                
                <xsl:if test="../organizationName!=''">
                  <xsl:element name="organizationName">
                   <xsl:value-of select="../organizationName"/>
                  </xsl:element>
                </xsl:if>

                <xsl:if test="../positionName!=''">
                  <xsl:element name="positionName">
                   <xsl:value-of select="../positionName"/>
                  </xsl:element>
                </xsl:if>
      </xsl:when>
      <xsl:otherwise>
                  <xsl:element name="organizationName">
                   <xsl:value-of select="'N/A'"/>
                  </xsl:element>
      </xsl:otherwise>       
    </xsl:choose>

                <xsl:if test="../address!=''">
                  <xsl:element name="address">
                    <xsl:if test="../address/deliveryPoint!=''">
                      <xsl:element name="deliveryPoint">
                        <xsl:value-of select="../address/deliveryPoint"/>
                      </xsl:element>
                    </xsl:if>

                    <xsl:if test="../address/city!=''">
                      <xsl:element name="city">
                        <xsl:value-of select="../address/city"/>
                      </xsl:element>
                    </xsl:if>

                    <xsl:if test="../address/administrativeArea!=''">
                      <xsl:element name="administrativeArea">
                        <xsl:value-of select="../address/administrativeArea"/>
                      </xsl:element>
                    </xsl:if>

                    <xsl:if test="../address/postalCode!=''">
                      <xsl:element name="postalCode">
                        <xsl:value-of select="../address/postalCode"/>
                      </xsl:element>
                    </xsl:if>

                    <xsl:if test="../address/country!=''">
                      <xsl:element name="country">
                        <xsl:value-of select="../address/country"/>
                      </xsl:element>
                    </xsl:if>
                  </xsl:element>
                </xsl:if>

                <xsl:if test="../phone!=''">
                  <xsl:element name="phone">
                   <xsl:value-of select="../phone"/>
                  </xsl:element>
                </xsl:if>

                <xsl:if test="../electronicMailAddress!=''">
                  <xsl:element name="electronicMailAddress">
                   <xsl:value-of select="../electronicMailAddress"/>
                  </xsl:element>
                </xsl:if>
              
                <xsl:if test="../onlineLink!=''">
                  <xsl:element name="onlineUrl">
                   <xsl:value-of select="../onlineLink"/>
                  </xsl:element>
                </xsl:if>
  </xsl:template>

<!-- temporal coverage template -->
  <xsl:template name="temporalCoverage">
    <xsl:if test="./sngdate!=''">
      <xsl:element name="singleDateTime">
        <xsl:element name="calendarDate">
           <xsl:call-template name="convertDate">
             <xsl:with-param name="string" select="./sngdate/caldate"/>
           </xsl:call-template>  
        </xsl:element>
        <xsl:if test="./sngdate/time!=''">
          <xsl:element name="time">
            <xsl:value-of select="./sngdate/time"/>
          </xsl:element>
        </xsl:if>  
      </xsl:element>
    </xsl:if>
   <xsl:if test="./mdattim!=''">
     <xsl:for-each select="./mdattim/*">
       <xsl:element name="singleDateTime">
          <xsl:element name="calendarDate">
           <xsl:call-template name="convertDate">
             <xsl:with-param name="string" select="./sngdate/caldate"/>
           </xsl:call-template>  
          </xsl:element>
          <xsl:if test="./sngdate/time!=''">
            <xsl:element name="time">
              <xsl:value-of select="./sngdate/time"/>
            </xsl:element>
            </xsl:if>
       </xsl:element>
     </xsl:for-each>
   </xsl:if>
   <xsl:if test="./rngdates!=''">
     <xsl:element name="rangeOfDates">
       <xsl:element name="beginDate">
         <xsl:element name="calendarDate">
           <xsl:call-template name="convertDate">
             <xsl:with-param name="string" select="./rngdates/begdate"/>
           </xsl:call-template>  
         </xsl:element>
         <xsl:if test="./rngdates/time!=''">
           <xsl:element name="time">
             <xsl:value-of select="./rngdates/begtime"/>
           </xsl:element>
         </xsl:if>  
       </xsl:element>
       <xsl:element name="endDate">
         <xsl:element name="calendarDate">
            <xsl:call-template name="convertDate">
             <xsl:with-param name="string" select="./rngdates/enddate"/>
           </xsl:call-template>  
         </xsl:element>
         <xsl:if test="./rngdates/time!=''">
           <xsl:element name="time">
             <xsl:value-of select="./rngdates/endtime"/>        
           </xsl:element>
         </xsl:if>
       </xsl:element>
     </xsl:element>
   </xsl:if>    
   </xsl:template>

  <!-- geographic coverage template -->
  <xsl:template name="geographicCoverage">
    <xsl:if test="./descgeog!=''">
      <xsl:element name="geographicDescription">
        <xsl:value-of select="./descgeog"/>
      </xsl:element>
    </xsl:if>
    <xsl:if test="./descgeog=''">
      <xsl:element name="geographicDescription">
        *
      </xsl:element>
    </xsl:if>
    <xsl:if test="./bounding!=''">
      <xsl:element name="boundingCoordinates">
        <xsl:element name="westBoundingCoordinate">
          <xsl:value-of select="./bounding/westbc"/>
        </xsl:element>
        <xsl:element name="eastBoundingCoordinate">
          <xsl:value-of select="./bounding/eastbc"/>
        </xsl:element>
        <xsl:element name="northBoundingCoordinate">
          <xsl:value-of select="./bounding/northbc"/>
        </xsl:element>
        <xsl:element name="southBoundingCoordinate">
          <xsl:value-of select="./bounding/southbc"/>
        </xsl:element>
      </xsl:element>
    </xsl:if>
  </xsl:template>

   
  <!-- taxonomic coverage template -->
  <xsl:template name="taxonomicCoverage">
  <!-- there does not seem to be an eml2 equivalent for the the 'keywtax' element of beta6 -->
     <xsl:if test="./taxoncl!=''">
      <xsl:for-each select="./taxoncl">
        <xsl:element name="taxonomicClassification">
          <xsl:element name="taxonRankName">
            <xsl:value-of select="./taxonrn"/>
          </xsl:element>
          <xsl:element name="taxonRankValue">
            <xsl:value-of select="./taxonrv"/>
          </xsl:element>
          <xsl:element name="commonName">
            <xsl:value-of select="./common"/>
          </xsl:element>
          <!-- need a recursive call here for another taxonomicClassification -->
        </xsl:element>
      </xsl:for-each>
    </xsl:if>
  </xsl:template>
  
  <!-- convert date format - assumes input in form ddMonthYear-->
  <!-- this routine only works for strings in the form above  -->
  <!-- need to add '0' for days less than 10; other month names -->
  <xsl:template name="convertDate">
    <xsl:param name="string"/>
    <xsl:variable name="ucstring" select="translate($string, 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
    <xsl:choose>
      <!-- first handle case where there is just a year (4 digits) -->
      <xsl:when test="((contains(translate($string, '0123456789', '9999999999'),'9999'))and(string-length($string)=4))">
        <xsl:value-of select="concat($string,'-01-01')"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'JAN')">
        <xsl:value-of select="concat(substring-after($ucstring,'JAN'),'-01-',substring-before($ucstring,'JAN'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'FEB')">
        <xsl:value-of select="concat(substring-after($ucstring,'FEB'),'-02-',substring-before($ucstring,'FEB'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'MAR')">
        <xsl:value-of select="concat(substring-after($ucstring,'MAR'),'-03-',substring-before($ucstring,'MAR'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'APR')">
        <xsl:value-of select="concat(substring-after($ucstring,'APR'),'-04-',substring-before($ucstring,'APR'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'MAY')">
        <xsl:value-of select="concat(substring-after($ucstring,'MAY'),'-05-',substring-before($ucstring,'MAY'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'JUN')">
        <xsl:value-of select="concat(substring-after($ucstring,'JUN'),'-06-',substring-before($ucstring,'JUN'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'JUNE')">
        <xsl:value-of select="concat(substring-after($ucstring,'JUNE'),'-06-',substring-before($ucstring,'JUNE'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'JUL')">
        <xsl:value-of select="concat(substring-after($ucstring,'JUL'),'-07-',substring-before($ucstring,'JUL'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'JULY')">
        <xsl:value-of select="concat(substring-after($ucstring,'JULY'),'-07-',substring-before($ucstring,'JULY'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'AUG')">
        <xsl:value-of select="concat(substring-after($ucstring,'AUG'),'-08-',substring-before($ucstring,'AUG'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'SEP')">
        <xsl:value-of select="concat(substring-after($ucstring,'SEP'),'-09-',substring-before($ucstring,'SEP'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'OCT')">
        <xsl:value-of select="concat(substring-after($ucstring,'OCT'),'-10-',substring-before($ucstring,'OCT'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'NOV')">
        <xsl:value-of select="concat(substring-after($ucstring,'NOV'),'-11-',substring-before($ucstring,'NOV'))"/>
      </xsl:when>
      <xsl:when test="contains($ucstring,'DEC')">
        <xsl:value-of select="concat(substring-after($ucstring,'DEC'),'-12-',substring-before($ucstring,'DEC'))"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$string"/>
      </xsl:otherwise>
    </xsl:choose>  

  </xsl:template>

  
</xsl:stylesheet>