Skip to content

Commit

Permalink
Merge pull request DSpace#9339 from the-library-code/DataCiteSchema4.5
Browse files Browse the repository at this point in the history
Update of DataCite crosswalk to metadata schema 4.5
tdonohue authored Feb 22, 2024
2 parents 8f8c304 + 1a56782 commit 422376d
Showing 2 changed files with 82 additions and 44 deletions.
120 changes: 79 additions & 41 deletions dspace/config/crosswalks/DIM2DataCite.xsl
Original file line number Diff line number Diff line change
@@ -3,24 +3,28 @@
<!--
Document : DIM2DataCite.xsl
Created on : January 23, 2013, 1:26 PM
Updated on : November 26, 2015, 3:00 PM
Author : pbecker, ffuerste
Updated on : Jaunary 30, 2024, 3:00 PM
Author : pbecker, ffuerste, ypaulsen
Description: Converts metadata from DSpace Intermediate Format (DIM) into
metadata following the DataCite Schema for the Publication and
Citation of Research Data, Version 3.1
metadata following the DataCite Metadata Schema 4.5
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dspace="http://www.dspace.org/xmlns/dspace/dim"
xmlns="http://datacite.org/schema/kernel-3"
xmlns="http://datacite.org/schema/kernel-4"
version="2.0">

<!-- CONFIGURATION -->
<!-- The parameters prefix, publisher, datamanager and hostinginstitution
moved to DSpace's configuration. They will be substituted automatically.
It is not necessary anymore to change this file.
Please take a look into the DSpace documentation for details on how to
change those. -->
<!-- DO NOT CHANGE ANYTHING BELOW THIS LINE EXCEPT YOU REALLY KNOW WHAT YOU ARE DOING! -->
<!-- This file handles the transformation of metadata into the DataCite
Schema. You should customize it to match your local metadata schema
and submission forms. Please note that this must produce valid XML
according to the DataCite Schema. Otherwise you will not be able
to register DOIs anymore. Please follow and reuse the examples
included in this file. For more information on the DataCite
Schema, see https://schema.datacite.org. -->

<!-- We need the prefix to determine DOIs that were minted by ourself. -->
<xsl:param name="prefix">10.5072/dspace-</xsl:param>
@@ -46,9 +50,9 @@
properties are in the metadata of the item to export.
The classe named above respects this.
-->
<resource xmlns="http://datacite.org/schema/kernel-3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://datacite.org/schema/kernel-3 http://schema.datacite.org/meta/kernel-3/metadata.xsd">
<resource xmlns="http://datacite.org/schema/kernel-4"
xsi:schemaLocation="http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4/metadata.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<!--
MANDATORY PROPERTIES
@@ -65,7 +69,7 @@
company as well. We have to ensure to use URIs of our prefix
as primary identifiers only.
-->
<xsl:apply-templates select="//dspace:field[@mdschema='dc' and @element='identifier' and starts-with(., concat('http://dx.doi.org/', $prefix))]" />
<xsl:apply-templates select="//dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and (contains(., $prefix))]" />

<!--
DataCite (2)
@@ -219,7 +223,18 @@
Template call for ResourceType
DataCite allows the ResourceType to ouccre not more than once.
-->
<xsl:apply-templates select="(//dspace:field[@mdschema='dc' and @element='type'])[1]" />
<!--<xsl:apply-templates select="(//dspace:field[@mdschema='dc' and @element='type'])[1]" />-->
<xsl:choose>
<xsl:when test="(//dspace:field[@mdschema='dc' and @element='type'])[1]">
<xsl:apply-templates select="(//dspace:field[@mdschema='dc' and @element='type'])[1]" />
</xsl:when>
<xsl:otherwise>
<xsl:element name="resourceType">
<xsl:attribute name="resourceTypeGeneral">Other</xsl:attribute>
<xsl:value-of>Other</xsl:value-of>
</xsl:element>
</xsl:otherwise>
</xsl:choose>

<!--
DataCite (11)
@@ -230,14 +245,22 @@
Occ: 0-n
Required Attribute: alternateIdentifierType (free format)
-->
<xsl:if test="//dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and not(starts-with(., concat('http://dx.doi.org/', $prefix)))]">
<xsl:if test="//dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and not(contains(., $prefix))]">
<xsl:element name="alternateIdentifiers">
<xsl:apply-templates select="//dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and not(starts-with(., concat('http://dx.doi.org/', $prefix)))]" />
<xsl:apply-templates select="//dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and not(contains(., $prefix))]" />
</xsl:element>
</xsl:if>

<!--
DataCite (12)
Add relatedIdentifier.
DataCite requires a relatedIdentifierType, but we do not know which
type of identifier is part of the dc.relation.* fields within DSpace.
Skip the related identifier until we find a proper solution.
-->

<!--
DataCite (13)
Add sizes.
-->
<xsl:if test="//dspace:field[@mdschema='dc' and @element='format' and @qualifier='extent']">
@@ -246,7 +269,7 @@
</xsl:element>
</xsl:if>

<!-- DataCite (13)
<!-- DataCite (14)
Add formats.
-->
<xsl:if test="//dspace:field[@mdschema='dc' and @element='format'][not(@qualifier='extent')]">
@@ -255,6 +278,13 @@
</xsl:element>
</xsl:if>

<!--
DataCite (15)
Add version.
As we currently do not link versions as related identifier, we skip
the version information too.
-->

<!--
DataCite (16)
Rights.
@@ -283,7 +313,15 @@
GeoLocation
DSpace currently doesn't store geolocations.
-->

<!--
DataCite (19)
FundingReference
DSpace currently doesn't store FundingReference.
-->
<!--
DataCite (20)
RelatedItem
-->
</resource>
</xsl:template>

@@ -295,9 +333,14 @@
company as well. We have to ensure to use URIs of our prefix
as primary identifiers only.
-->
<xsl:template match="dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and starts-with(., concat('http://dx.doi.org/', $prefix))]">
<xsl:template match="dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and (contains(., $prefix))]">
<identifier identifierType="DOI">
<xsl:value-of select="substring(., 19)"/>
<xsl:if test="starts-with(string(text()), 'https://doi.org/')">
<xsl:value-of select="substring(., 17)"/>
</xsl:if>
<xsl:if test="starts-with(string(text()), 'http://dx.doi.org/')">
<xsl:value-of select="substring(., 19)"/>
</xsl:if>
</identifier>
</xsl:template>

@@ -313,16 +356,20 @@
<!-- DataCite (3) :: Title -->
<xsl:template match="dspace:field[@mdschema='dc' and @element='title']">
<xsl:element name="title">
<xsl:attribute name="xml:lang"><xsl:value-of select="@lang" /></xsl:attribute>
<xsl:if test="@qualifier='alternative'">
<xsl:attribute name="xml:lang"><xsl:value-of select="@lang" /></xsl:attribute>
<xsl:attribute name="titleType">AlternativeTitle</xsl:attribute>
</xsl:if>
<!-- DSpace does include niehter a dc.title.subtitle nor a
dc.title.translated. If necessary, please create those in the
metadata field registry. -->
<xsl:if test="@qualifier='subtitle'">
<xsl:attribute name="xml:lang"><xsl:value-of select="@lang" /></xsl:attribute>
<xsl:attribute name="titleType">Subtitle</xsl:attribute>
</xsl:if>
<xsl:if test="@qualifier='translated'">
<xsl:attribute name="xml:lang"><xsl:value-of select="@lang" /></xsl:attribute>
<xsl:attribute name="titleType">TranslatedTitle</xsl:attribute>
</xsl:if>
<xsl:value-of select="." />
@@ -341,6 +388,7 @@
-->
<xsl:template match="//dspace:field[@mdschema='dc' and @element='subject']">
<xsl:element name="subject">
<xsl:attribute name="xml:lang"><xsl:value-of select="@lang" /></xsl:attribute>
<xsl:if test="@qualifier">
<xsl:attribute name="subjectScheme"><xsl:value-of select="@qualifier" /></xsl:attribute>
</xsl:if>
@@ -436,7 +484,7 @@
dissertations. DataCite uses submitted for the "date the
creator submits the resource to the publisher". -->
<xsl:if test="@qualifier='submitted'">
<xsl:attribute name="dateType">Issued</xsl:attribute>
<xsl:attribute name="dateType">Submitted</xsl:attribute>
</xsl:if>
<xsl:if test="@qualifier='updated'">
<xsl:attribute name="dateType">Updated</xsl:attribute>
@@ -473,24 +521,24 @@
<xsl:attribute name="resourceTypeGeneral">
<xsl:choose>
<xsl:when test="string(text())='Animation'">Audiovisual</xsl:when>
<xsl:when test="string(text())='Article'">Text</xsl:when>
<xsl:when test="string(text())='Book'">Text</xsl:when>
<xsl:when test="string(text())='Book chapter'">Text</xsl:when>
<xsl:when test="string(text())='Article'">JournalArticle</xsl:when>
<xsl:when test="string(text())='Book'">Book</xsl:when>
<xsl:when test="string(text())='Book chapter'">BookChapter</xsl:when>
<xsl:when test="string(text())='Dataset'">Dataset</xsl:when>
<xsl:when test="string(text())='Learning Object'">InteractiveResource</xsl:when>
<xsl:when test="string(text())='Image'">Image</xsl:when>
<xsl:when test="string(text())='Image, 3-D'">Image</xsl:when>
<xsl:when test="string(text())='Map'">Model</xsl:when>
<xsl:when test="string(text())='Musical Score'">Other</xsl:when>
<xsl:when test="string(text())='Plan or blueprint'">Model</xsl:when>
<xsl:when test="string(text())='Preprint'">Text</xsl:when>
<xsl:when test="string(text())='Presentation'">Text</xsl:when>
<xsl:when test="string(text())='Preprint'">Preprint</xsl:when>
<xsl:when test="string(text())='Presentation'">Other</xsl:when>
<xsl:when test="string(text())='Recording, acoustical'">Sound</xsl:when>
<xsl:when test="string(text())='Recording, musical'">Sound</xsl:when>
<xsl:when test="string(text())='Recording, oral'">Sound</xsl:when>
<xsl:when test="string(text())='Software'">Software</xsl:when>
<xsl:when test="string(text())='Technical Report'">Text</xsl:when>
<xsl:when test="string(text())='Thesis'">Text</xsl:when>
<xsl:when test="string(text())='Technical Report'">Report</xsl:when>
<xsl:when test="string(text())='Thesis'">Dissertation</xsl:when>
<xsl:when test="string(text())='Video'">Audiovisual</xsl:when>
<xsl:when test="string(text())='Working Paper'">Text</xsl:when>
<xsl:when test="string(text())='Other'">Other</xsl:when>
@@ -512,7 +560,7 @@
resolveUrlToHandle(context, altId) until one is recognized or all have
been tested.
-->
<xsl:template match="//dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and not(starts-with(., concat('http://dx.doi.org/', $prefix)))]">
<xsl:template match="//dspace:field[@mdschema='dc' and @element='identifier' and @qualifier and not(contains(., $prefix))]">
<xsl:element name="alternateIdentifier">
<xsl:if test="@qualifier">
<xsl:attribute name="alternateIdentifierType"><xsl:value-of select="@qualifier" /></xsl:attribute>
@@ -561,20 +609,9 @@
Adds Rights information
-->
<xsl:template match="//dspace:field[@mdschema='dc' and @element='rights']">
<xsl:choose>
<xsl:when test="@qualifier='uri'">
<xsl:element name="rights">
<xsl:attribute name="rightsURI">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="rights">
<xsl:value-of select="." />
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:element name="rights">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>

<!--
@@ -583,6 +620,7 @@
-->
<xsl:template match="//dspace:field[@mdschema='dc' and @element='description' and (@qualifier='abstract' or @qualifier='tableofcontents' or not(@qualifier))]">
<xsl:element name="description">
<xsl:attribute name="xml:lang"><xsl:value-of select="@lang" /></xsl:attribute>
<xsl:attribute name="descriptionType">
<xsl:choose>
<xsl:when test="@qualifier='abstract'">Abstract</xsl:when>
6 changes: 3 additions & 3 deletions dspace/config/dspace.cfg
Original file line number Diff line number Diff line change
@@ -603,13 +603,13 @@ crosswalk.dissemination.DataCite.stylesheet = crosswalks/DIM2DataCite.xsl
## For DataCite via EZID, comment above and uncomment this:
#crosswalk.dissemination.DataCite.stylesheet = crosswalks/DIM2EZID.xsl
crosswalk.dissemination.DataCite.schemaLocation = \
http://datacite.org/schema/kernel-3 \
http://schema.datacite.org/meta/kernel-3/metadata.xsd
http://datacite.org/schema/kernel-4 \
http://schema.datacite.org/meta/kernel-4/metadata.xsd
crosswalk.dissemination.DataCite.preferList = false
crosswalk.dissemination.DataCite.publisher = My University
#crosswalk.dissemination.DataCite.dataManager = # defaults to publisher
#crosswalk.dissemination.DataCite.hostingInstitution = # defaults to publisher
crosswalk.dissemination.DataCite.namespace = http://datacite.org/schema/kernel-3
crosswalk.dissemination.DataCite.namespace = http://datacite.org/schema/kernel-4

# Crosswalk Plugin Configuration:
# The purpose of Crosswalks is to translate an external metadata format to/from

0 comments on commit 422376d

Please sign in to comment.