diff test-data/iso2eml_all_in_one.xsl @ 0:4a9ac1df3278 draft default tip

"planemo upload for repository https://github.com/galaxyecology/tools-ecology/tree/main/tools-ecology/tools/xmlstarlet commit 6ebe0c98dd0d727b9202422e64f6d5f7697743fb"
author ecology
date Sun, 06 Mar 2022 22:10:31 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/iso2eml_all_in_one.xsl	Sun Mar 06 22:10:31 2022 +0000
@@ -0,0 +1,745 @@
+<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+    xmlns:eml="eml://ecoinformatics.org/eml-2.1.1" 
+    xmlns:stmml="http://www.xml-cml.org/schema/stmml" 
+    xmlns:sw="eml://ecoinformatics.org/software-2.1.1" 
+    xmlns:cit="eml://ecoinformatics.org/literature-2.1.1" 
+    xmlns:ds="eml://ecoinformatics.org/dataset-2.1.1" 
+    xmlns:prot="eml://ecoinformatics.org/protocol-2.1.1" 
+    xmlns:doc="eml://ecoinformatics.org/documentation-2.1.1" 
+    xmlns:res="eml://ecoinformatics.org/resource-2.1.1" 
+    xmlns:gmd="http://www.isotc211.org/2005/gmd" 
+    xmlns:gco="http://www.isotc211.org/2005/gco"
+    xmlns:gml="http://www.opengis.net/gml/3.2"
+    xmlns:gmx="http://www.isotc211.org/2005/gmx"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
+
+<!--xsl:import href="iso2eml-party.xsl"/>
+<xsl:import href="iso2eml-coverage.xsl"/>
+<xsl:import href="iso2eml-project.xsl"/-->
+
+<xsl:output method="xml" encoding="UTF-8" indent="yes" />
+<xsl:strip-space elements="*" />
+
+<xsl:template match="/gmd:MD_Metadata">
+<eml:eml>
+    <xsl:attribute name="xsi:schemaLocation">eml://ecoinformatics.org/eml-2.1.1 ~/development/eml/eml.xsd</xsl:attribute>
+    <!-- Add the packageId -->
+    <xsl:attribute name="packageId"><xsl:value-of select="normalize-space(gmd:fileIdentifier/gco:CharacterString)"/></xsl:attribute>
+    <xsl:attribute name="system"><xsl:value-of select="'knb'"/></xsl:attribute>
+    <xsl:attribute name="scope"><xsl:value-of select="'system'"/></xsl:attribute>
+    <dataset>
+        <!-- Add the title -->
+        <xsl:for-each select="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString">
+            <title><xsl:value-of select="normalize-space(.)"/></title>
+        </xsl:for-each>
+        
+        <!-- Add creators -->
+        <xsl:call-template name="creators">
+            <xsl:with-param name="doc" select="." />
+        </xsl:call-template>
+
+        <!-- Add additional parties -->
+        <xsl:call-template name="additional-parties">
+            <xsl:with-param name="doc" select="." />
+        </xsl:call-template>
+
+        <!-- Add the pubDate if available -->
+        <xsl:if test="gmd:dateStamp/gco:DateTime != ''">
+            <pubDate>
+                <xsl:choose>
+                    <xsl:when test="contains(gmd:dateStamp/gco:DateTime, 'T')">
+                        <xsl:value-of select="normalize-space(substring-before(gmd:dateStamp/gco:DateTime, 'T'))" />
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="normalize-space(gmd:dateStamp/gco:DateTime)" />
+                    </xsl:otherwise>
+                </xsl:choose>
+            </pubDate>
+        </xsl:if>
+            
+        <!-- Add the language -->
+        <xsl:if test="gmd:language/gco:CharacterString != ''">
+            <language><xsl:value-of select="normalize-space(gmd:language/gco:CharacterString)" /></language>           
+        </xsl:if>
+        
+        <!-- Add the abstract -->
+        <abstract>
+            <para><xsl:value-of select="normalize-space(gmd:identificationInfo/gmd:MD_DataIdentification/gmd:abstract/gco:CharacterString)" /></para>
+        </abstract>
+        
+        <!-- Add keywords -->
+        <xsl:if test="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords != ''">
+            <xsl:call-template name="keywords">
+                <xsl:with-param name="keys" select="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords" />
+            </xsl:call-template>
+        </xsl:if>
+
+        <!-- Add any gmd:topicCategory fields as keywords too -->
+        <xsl:if test="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:topicCategory != ''">
+            <xsl:call-template name="topics">
+                <xsl:with-param name="topics" select="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:topicCategory" />
+            </xsl:call-template>
+        </xsl:if>
+
+        <!-- Add intellectual rights -->
+        <!-- 
+            Note these rules are specific to the arcticdata.io content, 
+            and will need to be generalized
+        -->
+        <xsl:choose>
+            <xsl:when test="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation">
+                <!-- Transfer MD_Constraints/useLimitation directly -->
+                <intellectualRights>
+                    <para>
+                        <xsl:value-of select="normalize-space(gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation/gco:CharacterString)" />
+                    </para>
+                </intellectualRights>
+            </xsl:when>
+            <xsl:otherwise>
+                
+                <!-- Assign a CC-BY license -->
+                <intellectualRights>
+                    <para>
+                        <xsl:text>This work is licensed under the Creative Commons Attribution 4.0 International License.To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/.</xsl:text>
+                    </para>
+                </intellectualRights>
+                
+            </xsl:otherwise>
+        </xsl:choose>
+
+        <!-- Add distribution -->
+
+        <!-- Add coverage -->
+        <xsl:call-template name="coverage" />
+            
+        <!-- Add contacts -->
+        <xsl:call-template name="contacts">
+            <xsl:with-param name="doc" select="." />
+        </xsl:call-template>
+
+        
+        <!-- Add the publisher -->
+        <xsl:call-template name="publishers">
+            <xsl:with-param name="doc" select="." />
+        </xsl:call-template>
+
+        
+        <!-- Add the pubPlace  -->
+        
+        <!-- Add the methods   -->
+        
+        <!-- Add the project   -->
+        <xsl:call-template name="project">
+            <xsl:with-param name="doc" select="." />
+        </xsl:call-template>
+        
+        <!-- Add entities      -->
+        
+    </dataset>
+</eml:eml>
+</xsl:template>
+
+<!-- Process Keywords and associated thesuarus entries -->
+<xsl:template name="keywords">
+    <xsl:param name = "keys" />
+    <xsl:for-each select="$keys">
+        <xsl:variable name="kw-type" select="./gmd:MD_Keywords/gmd:type/gmd:MD_KeywordTypeCode/@codeListValue" />
+        <keywordSet>    
+            <xsl:for-each select="./gmd:MD_Keywords/gmd:keyword/gco:CharacterString">
+                <keyword>
+                    <!-- ISO: discipline, place, stratum, temporal, theme -->
+                    <!-- EML:             place, stratum, temporal, theme, taxonomic -->
+                    <xsl:if test="$kw-type != '' and (
+                        $kw-type = 'place' or $kw-type = 'stratum' or 
+                        $kw-type = 'temporal' or $kw-type = 'theme')">
+                        <xsl:attribute name="keywordType"><xsl:value-of select="normalize-space($kw-type)"/></xsl:attribute>
+                    </xsl:if>
+                    <xsl:value-of select="normalize-space(.)" />
+                </keyword>
+            </xsl:for-each>
+            <xsl:if test="./gmd:MD_Keywords/gmd:thesaurusName != ''">
+                <xsl:choose>
+                    <xsl:when test="./gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:collectiveTitle != ''">
+                        <keywordThesaurus>
+                            <xsl:value-of select="normalize-space(./gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:collectiveTitle/gco:CharacterString)" />
+                        </keywordThesaurus>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <keywordThesaurus>
+                            <xsl:value-of select="normalize-space(./gmd:MD_Keywords/gmd:thesaurusName/gmd:CI_Citation/gmd:title/gco:CharacterString)" />
+                        </keywordThesaurus>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:if>
+        </keywordSet>
+    </xsl:for-each>
+</xsl:template>
+
+<!-- Process Topics -->
+<xsl:template name="topics">
+    <xsl:param name = "topics" />
+    <xsl:for-each select="$topics">
+        <keywordSet>    
+            <xsl:for-each select="./gmd:MD_TopicCategoryCode">
+                <keyword>
+                    <xsl:value-of select="normalize-space(.)" />
+                </keyword>
+            </xsl:for-each>
+            <keywordThesaurus>ISO 19115:2003 MD_TopicCategoryCode</keywordThesaurus>
+        </keywordSet>
+    </xsl:for-each>
+</xsl:template>
+
+<!-- Match any geographic or temporal coverage elements -->
+<xsl:template name="coverage" match="gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent">
+	<!-- Add EML geographic and temporal coverages, if available -->
+		<!-- Add geographic coverages -->
+        <xsl:variable name="bboxCount" select="count(.//gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox)" />
+        <xsl:variable name="temporalCount" select="count(.//gmd:EX_Extent/gmd:temporalElement)" />
+        <xsl:variable name="descriptionCount" select="count(.//gmd:EX_Extent/gmd:description)" />
+        <xsl:variable name="exDescCount" select="count(.//gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription)" />
+        <xsl:if test="$temporalCount + $bboxCount &gt; 0">
+    		<coverage>
+                <xsl:choose>
+                    <xsl:when test="($descriptionCount + $exDescCount) &gt;= $bboxCount">
+
+                        <xsl:variable name="descriptions" >
+                            <xsl:if test="//gmd:EX_Extent/gmd:description">
+                                <xsl:for-each select=".//gmd:EX_Extent">
+                                    <xsl:copy-of select="gmd:description" />
+                                    <xsl:value-of select="'. '" />                                                           
+                                </xsl:for-each>                            
+                            </xsl:if>
+                        </xsl:variable>
+
+                        <xsl:variable name="codeDescriptions" >
+                            <xsl:for-each select=".//gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription">
+                                <xsl:value-of select="gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString" />
+                                    <xsl:if test="count(//gmd:EX_GeographicDescription) &gt; 1">
+                                        <xsl:value-of select="', '" />
+                                    </xsl:if>
+                            </xsl:for-each>
+                        </xsl:variable>
+                        			
+                        <xsl:apply-templates select=".//gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox">
+            			    <xsl:with-param name="allDescriptions" select="concat($descriptions, $codeDescriptions)" />
+            			</xsl:apply-templates> 
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:comment>No geographic description provided</xsl:comment>
+                        <xsl:apply-templates select=".//gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox">
+            			    <xsl:with-param name="allDescriptions" select="'No geographic description provided.'" />
+            			</xsl:apply-templates> 
+                    </xsl:otherwise>                
+                </xsl:choose>
+		
+    			<!-- Add temporal coverages -->
+    			<xsl:apply-templates select=".//gmd:EX_Extent/gmd:temporalElement" />                
+    		</coverage>
+        </xsl:if>
+		
+</xsl:template>
+		
+<!-- Handle geographic bounding boxes -->
+<xsl:template match="gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicBoundingBox">
+    <xsl:param name="allDescriptions" />
+		<xsl:comment>Geographic coverage</xsl:comment>
+	<!-- Handle geographic description -->
+	<xsl:choose>
+		<xsl:when test="$allDescriptions != ''">
+			
+       		<geographicCoverage>
+       			<geographicDescription>
+       				<xsl:value-of select="$allDescriptions" />
+       			</geographicDescription>
+       			<xsl:apply-templates select="../gmd:geographicElement/gmd:EX_GeographicBoundingBox" />
+           		<!-- Add bounding coordinates -->
+           		<boundingCoordinates>
+           			<westBoundingCoordinate>
+           				<xsl:value-of select="normalize-space(gmd:westBoundLongitude/gco:Decimal)" />
+           			</westBoundingCoordinate>
+           			<eastBoundingCoordinate>
+           				<xsl:value-of select="normalize-space(gmd:eastBoundLongitude/gco:Decimal)" />
+           			</eastBoundingCoordinate>
+           			<northBoundingCoordinate>
+           				<xsl:value-of select="normalize-space(gmd:northBoundLatitude/gco:Decimal)" />
+           			</northBoundingCoordinate>
+           			<southBoundingCoordinate>
+           				<xsl:value-of select="normalize-space(gmd:southBoundLatitude/gco:Decimal)" />
+           			</southBoundingCoordinate>
+           		</boundingCoordinates>
+       		</geographicCoverage>
+			
+		</xsl:when>
+		<xsl:otherwise>
+			
+			<!-- Make up a description from the bounding box -->
+			<xsl:if test=".//gmd:EX_GeographicBoundingBox">
+				
+				<geographicCoverage>
+					<geographicDescription>
+						<xsl:text>This research took place in the area bounded by: </xsl:text>
+						<xsl:value-of select="normalize-space(gmd:EX_GeographicBoundingBox/gmd:westBoundLongitude/gco:Decimal)" />
+						<xsl:text> West,</xsl:text>
+						<xsl:value-of select="normalize-space(gmd:EX_GeographicBoundingBox/gmd:eastBoundLongitude/gco:Decimal)" />
+						<xsl:text> East,</xsl:text>
+						<xsl:value-of select="normalize-space(gmd:EX_GeographicBoundingBox/gmd:northBoundLatitude/gco:Decimal)" />
+						<xsl:text> North,</xsl:text>
+						<xsl:value-of select="normalize-space(gmd:EX_GeographicBoundingBox/gmd:southBoundLatitude/gco:Decimal)" />
+						<xsl:text> South.</xsl:text>
+					</geographicDescription>
+               		<!-- Add bounding coordinates -->
+               		<boundingCoordinates>
+               			<westBoundingCoordinate>
+               				<xsl:value-of select="normalize-space(gmd:westBoundLongitude/gco:Decimal)" />
+               			</westBoundingCoordinate>
+               			<eastBoundingCoordinate>
+               				<xsl:value-of select="normalize-space(gmd:eastBoundLongitude/gco:Decimal)" />
+               			</eastBoundingCoordinate>
+               			<northBoundingCoordinate>
+               				<xsl:value-of select="normalize-space(gmd:northBoundLatitude/gco:Decimal)" />
+               			</northBoundingCoordinate>
+               			<southBoundingCoordinate>
+               				<xsl:value-of select="normalize-space(gmd:southBoundLatitude/gco:Decimal)" />
+               			</southBoundingCoordinate>
+               		</boundingCoordinates>
+				</geographicCoverage>
+				
+			</xsl:if>
+		</xsl:otherwise>
+	</xsl:choose>		
+</xsl:template>
+
+<!-- Handle temporal coverage elements -->
+<xsl:template name="temporalCoverage" match="gmd:EX_Extent/gmd:temporalElement">
+	<xsl:comment>Temporal coverage</xsl:comment>
+	<xsl:choose>
+		<xsl:when test="gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod">
+			
+			<!-- We have a period, use rangeOfDates -->
+			<temporalCoverage>
+				<rangeOfDates>
+					<beginDate>
+						<xsl:choose>
+							<xsl:when test="contains(gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition, 'T')">
+								<calendarDate>
+									<xsl:value-of select="normalize-space(substring-before(gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition, 'T'))" />
+								</calendarDate>
+								<time>
+									<xsl:value-of select="normalize-space(substring-after(gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition, 'T'))" />									
+								</time>								
+							</xsl:when>
+							<xsl:otherwise>
+								<calendarDate>
+									<xsl:value-of select="normalize-space(gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:beginPosition)" />
+								</calendarDate>								
+							</xsl:otherwise>
+						</xsl:choose>
+					</beginDate>
+					<endDate>
+						<xsl:choose>
+							<xsl:when test="contains(gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition, 'T')">
+								<calendarDate>
+									<xsl:value-of select="normalize-space(substring-before(gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition, 'T'))" />
+								</calendarDate>
+								<time>
+									<xsl:value-of select="normalize-space(substring-after(gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition, 'T'))" />									
+								</time>								
+							</xsl:when>
+							<xsl:otherwise>
+								<calendarDate>
+									<xsl:value-of select="normalize-space(gmd:EX_TemporalExtent/gmd:extent/gml:TimePeriod/gml:endPosition)" />
+								</calendarDate>								
+							</xsl:otherwise>
+						</xsl:choose>
+					</endDate>
+				</rangeOfDates>
+			</temporalCoverage>
+		</xsl:when>
+		<xsl:otherwise>
+			
+			<!-- No time period, look for time instant -->
+			<xsl:if test="gmd:EX_TemporalExtent/gmd:extent/gml:TimeInstant">
+				
+				<temporalCoverage>
+					<singleDateTime>
+						<calendarDate>
+							<xsl:value-of select="normalize-space(gmd:EX_TemporalExtent/gmd:extent/gml:TimeInstant/gml:timePosition)" />
+						</calendarDate>
+					</singleDateTime>
+				</temporalCoverage>
+				
+			</xsl:if>
+		</xsl:otherwise>
+	</xsl:choose>
+</xsl:template>
+
+    <!-- Match any gmd:credit elements, and if they are present, add a project entry with funding fields -->
+    <xsl:template name="project">
+        <xsl:param name = "doc" />
+        <xsl:variable name="awardCount" select="count(./gmd:identificationInfo/gmd:MD_DataIdentification/gmd:credit)" />
+        <!-- Add funding elements -->
+        <xsl:if test="$awardCount &gt; 0">
+            <project>
+                <!-- Add the project title -->
+                <title><xsl:value-of select="normalize-space(./gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:title[1]/gco:CharacterString)"/></title>
+
+                <!-- Add the project abstract -->
+                <xsl:if test='./gmd:identificationInfo/gmd:MD_DataIdentification/gmd:abstract[1]/gco:CharacterString != ""'>
+                    <abstract><xsl:value-of select="normalize-space(./gmd:identificationInfo/gmd:MD_DataIdentification/gmd:abstract[1]/gco:CharacterString)"/></abstract>
+                </xsl:if>
+
+                <!-- Add personnel from the PI list or the author list -->
+                <xsl:choose>
+                    <!-- Select PIs from the citation -->
+                    <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator" or @codeListValue="coPrincipalInvestigator" or @codeListValue="collaboratingPrincipalInvestigator"]]!=""'>
+                        <xsl:for-each select='gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator" or @codeListValue="coPrincipalInvestigator" or @codeListValue="collaboratingPrincipalInvestigator"]]'>
+                            <personnel>
+                                <xsl:call-template name="party">
+                                    <xsl:with-param name="party" select = "." />
+                                </xsl:call-template>
+                                <role>principalInvestigator</role>
+                            </personnel>
+                        </xsl:for-each>
+                    </xsl:when>
+                    <!-- Alternatively, select PIs from anywhere in the doc -->
+                    <xsl:when test='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator" or @codeListValue="coPrincipalInvestigator" or @codeListValue="collaboratingPrincipalInvestigator"]] != ""'>
+                        <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator" or @codeListValue="coPrincipalInvestigator" or @codeListValue="collaboratingPrincipalInvestigator"]]'>
+                            <personnel>
+                                <xsl:call-template name="party">
+                                    <xsl:with-param name="party" select = "." />
+                                </xsl:call-template>
+                                <role>principalInvestigator</role>
+                            </personnel>
+                        </xsl:for-each>
+                    </xsl:when>
+                    <!-- Otherwise, select the author anywhere in the document -->
+                    <xsl:otherwise>
+                        <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="author"]]'>
+                            <personnel>
+                                <xsl:call-template name="party">
+                                    <xsl:with-param name="party" select = "." />
+                                </xsl:call-template>
+                                <role>principalInvestigator</role>
+                            </personnel>
+                        </xsl:for-each>
+                    </xsl:otherwise>
+                </xsl:choose>
+
+                <!-- Add all of the funding from gmd:credit -->
+                <funding>
+                    <xsl:for-each select="./gmd:identificationInfo/gmd:MD_DataIdentification/gmd:credit">
+                        <para><xsl:value-of select="."/></para>
+                    </xsl:for-each>
+                </funding>
+            </project>
+        </xsl:if>
+            
+    </xsl:template>
+
+<!-- Add creator -->
+<xsl:template name="creators">
+    <xsl:param name = "doc" />
+    <xsl:choose>
+        <!-- First add any authors from the gmd:citation -->
+        <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="author"]]!=""'>
+            <xsl:for-each select='gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="author"]]'>
+                <creator>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </creator>
+            </xsl:for-each>
+        </xsl:when>
+        <!-- Alternatively, add authors from anywhere in the document -->
+        <xsl:when test='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="author"]] != "" '>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="author"]]'>
+                <creator>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </creator>
+            </xsl:for-each>
+        </xsl:when>
+        <!-- Alternatively, add principalInvestigators from anywhere in the document -->
+        <xsl:when test='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator"]] != "" '>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator"]]'>
+                <creator>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </creator>
+            </xsl:for-each>
+        </xsl:when>
+        <!-- Alternatively, add pointOfContact from the citation in the document -->
+        <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="pointOfContact"]] != "" '>
+            <xsl:for-each select='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="pointOfContact"]]'>
+                <creator>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </creator>
+            </xsl:for-each>
+        </xsl:when>
+        <!-- Alternatively, add pointOfContact from anywhere in the document -->
+        <xsl:when test='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="pointOfContact"]] != "" '>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="pointOfContact"]]'>
+                <creator>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </creator>
+            </xsl:for-each>
+        </xsl:when>
+        <!-- Finally, if all else fails, add the Arctic Data Center -->
+        <xsl:otherwise>
+            <creator>
+                <organizationName>NSF Arctic Data Center</organizationName>
+            </creator>
+        </xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+<!-- Add associatedParty: principalInvestigator
+    First, check to see if principalInvestigators are listed in the gmd:citation, and if so, use them;
+    If not, then search the whole document and use any found.  This avoids duplication.
+-->
+<xsl:template name="additional-parties">
+    <xsl:param name = "doc" />
+    <!-- Roles to be handled: originator|principalInvestigator|resourceProvider|distributor -->
+
+    <!-- principalInvestigators -->
+    <xsl:choose>
+        <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator"]]!=""'>
+            <xsl:for-each select='gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator"]]'>
+                <associatedParty>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                    <role>principalInvestigator</role>
+                </associatedParty>
+            </xsl:for-each>
+        </xsl:when>
+        <xsl:otherwise>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="principalInvestigator"]]'>
+                <associatedParty>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                    <role>principalInvestigator</role>
+                </associatedParty>
+            </xsl:for-each>
+        </xsl:otherwise>
+    </xsl:choose>
+
+    <!-- coPrincipalInvestigator -->
+    <xsl:choose>
+        <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="coPrincipalInvestigator"]]!=""'>
+            <xsl:for-each select='gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="coPrincipalInvestigator"]]'>
+                <associatedParty>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                    <role>coPrincipalInvestigator</role>
+                </associatedParty>
+            </xsl:for-each>
+        </xsl:when>
+        <xsl:otherwise>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="coPrincipalInvestigator"]]'>
+                <associatedParty>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                    <role>coPrincipalInvestigator</role>
+                </associatedParty>
+            </xsl:for-each>
+        </xsl:otherwise>
+    </xsl:choose>
+
+    <!-- collaboratingPrincipalInvestigator -->
+    <xsl:choose>
+        <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="collaboratingPrincipalInvestigator"]]!=""'>
+            <xsl:for-each select='gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="collaboratingPrincipalInvestigator"]]'>
+                <associatedParty>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                    <role>collaboratingPrincipalInvestigator</role>
+                </associatedParty>
+            </xsl:for-each>
+        </xsl:when>
+        <xsl:otherwise>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="collaboratingPrincipalInvestigator"]]'>
+                <associatedParty>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                    <role>collaboratingPrincipalInvestigator</role>
+                </associatedParty>
+            </xsl:for-each>
+        </xsl:otherwise>
+    </xsl:choose>
+
+    <!-- originators -->
+    <xsl:choose>
+        <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="originator"]]!=""'>
+            <xsl:for-each select='gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="originator"]]'>
+                <associatedParty>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                    <role>originator</role>
+                </associatedParty>
+            </xsl:for-each>
+        </xsl:when>
+        <xsl:otherwise>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="originator"]]'>
+                <associatedParty>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                    <role>originator</role>
+                </associatedParty>
+            </xsl:for-each>
+        </xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+
+<!-- Add contacts -->
+<xsl:template name="contacts">
+    <xsl:param name = "doc" />
+    <xsl:choose>
+        <!-- Add contacts from the citation in the document -->
+        <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="pointOfContact"]]!=""'>
+            <xsl:for-each select='gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="pointOfContact"]]'>
+                <contact>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </contact>
+            </xsl:for-each>
+        </xsl:when>
+        <!-- Alternatively, add contacts from anywhere in the document -->
+        <xsl:when test='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="pointOfContact"]] != "" '>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="pointOfContact"]]'>
+                <contact>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </contact>
+            </xsl:for-each>
+        </xsl:when>
+        <!-- Alternatively, add the first author as a contact -->
+        <!--
+        <xsl:when test='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="author"]] != "" '>
+            <contact>
+                <xsl:call-template name="party">
+                    <xsl:with-param name="party" select = '$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="author"]][1]' />
+                </xsl:call-template>
+            </contact>
+        </xsl:when>
+        -->
+        <!-- Finally, if all else fails, add the Arctic Data Center -->
+        <xsl:otherwise>
+            <contact>
+                <organizationName>NSF Arctic Data Center</organizationName>
+            </contact>
+        </xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+<!-- Add publishers
+    First, check to see if publishers are listed in the gmd:citation, and if so, use them;
+    If not, then search the whole document and use any found.  This avoids duplication.
+-->
+<xsl:template name="publishers">
+    <xsl:param name = "doc" />
+    <!-- publisher -->
+    <xsl:choose>
+        <xsl:when test='$doc/gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="publisher"]]!=""'>
+            <xsl:for-each select='gmd:identificationInfo/gmd:MD_DataIdentification/gmd:citation/gmd:CI_Citation/gmd:citedResponsibleParty/gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="publisher"]]'>
+                <publisher>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </publisher>
+            </xsl:for-each>
+        </xsl:when>
+        <xsl:otherwise>
+            <xsl:for-each select='$doc//gmd:CI_ResponsibleParty[gmd:role/gmd:CI_RoleCode[@codeListValue="publisher"]]'>
+                <publisher>
+                    <xsl:call-template name="party">
+                        <xsl:with-param name="party" select = "." />
+                    </xsl:call-template>
+                </publisher>
+            </xsl:for-each>
+        </xsl:otherwise>
+    </xsl:choose>
+</xsl:template>
+
+<!-- Handle eml-party fields -->    
+<xsl:template name="party">
+    <xsl:param name = "party" />
+    <xsl:apply-templates />   
+    <xsl:if test="$party//gmd:voice/gco:CharacterString!=''">
+        <phone><xsl:value-of select="normalize-space($party//gmd:voice/gco:CharacterString)"/></phone>
+    </xsl:if>
+    <xsl:if test="$party//gmd:CI_Address/gmd:electronicMailAddress/gco:CharacterString!=''">
+        <electronicMailAddress><xsl:value-of select="normalize-space($party//gmd:CI_Address/gmd:electronicMailAddress/gco:CharacterString)"/></electronicMailAddress>
+    </xsl:if>
+    <xsl:if test="$party//gmd:onlineResource/gmd:CI_OnlineResource/gmd:linkage/gmd:URL!=''">
+        <onlineUrl><xsl:value-of select="normalize-space($party//gmd:onlineResource/gmd:CI_OnlineResource/gmd:linkage/gmd:URL)"/></onlineUrl>
+    </xsl:if>
+</xsl:template>
+
+<!-- Add an individualName -->
+<xsl:template match="gmd:individualName">
+    <individualName>
+        <surName><xsl:value-of select="normalize-space(gco:CharacterString)"/></surName>
+    </individualName>
+</xsl:template>
+
+<!-- Add an organizationName -->
+<xsl:template match="gmd:organisationName">
+    <organizationName><xsl:value-of select="normalize-space(gco:CharacterString)"/></organizationName>
+</xsl:template>
+
+<!-- Add a positionName -->
+<xsl:template match="gmd:positionName">
+    <positionName><xsl:value-of select="normalize-space(gco:CharacterString)"/></positionName>
+</xsl:template>
+
+<!-- voice, email, and role are all noops so they can be reordered correctly -->
+<xsl:template match="gmd:voice" />
+<xsl:template match="gmd:electronicMailAddress" />
+<xsl:template match="gmd:role" />
+<xsl:template match="gmd:onlineResource" />
+
+<!-- Add an Address -->
+<xsl:template match="gmd:CI_Address"> 
+    <xsl:if test="gmd:deliveryPoint/gco:CharacterString!='' or gmd:city/gco:CharacterString!='' or gmd:administrativeArea/gco:CharacterString!='' or gmd:postalCode/gco:CharacterString!='' or gmd:country/gco:CharacterString!=''">
+    <address>
+        <xsl:if test="gmd:deliveryPoint/gco:CharacterString!=''">
+            <deliveryPoint><xsl:value-of select="normalize-space(gmd:deliveryPoint/gco:CharacterString)"/></deliveryPoint>
+        </xsl:if>
+        <xsl:if test="gmd:city/gco:CharacterString!=''">
+            <city><xsl:value-of select="normalize-space(gmd:city/gco:CharacterString)"/></city>
+        </xsl:if>
+        <xsl:if test="gmd:administrativeArea/gco:CharacterString!=''">
+            <administrativeArea><xsl:value-of select="normalize-space(gmd:administrativeArea/gco:CharacterString)"/></administrativeArea>
+        </xsl:if>
+        <xsl:if test="gmd:postalCode/gco:CharacterString!=''">
+            <postalCode><xsl:value-of select="normalize-space(gmd:postalCode/gco:CharacterString)"/></postalCode>
+        </xsl:if>
+        <xsl:if test="gmd:country/gco:CharacterString!=''">
+            <country><xsl:value-of select="normalize-space(gmd:country/gco:CharacterString)"/></country>
+        </xsl:if>
+    </address>
+    </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>