1
|
<RESOURCE_PROFILE>
|
2
|
<HEADER>
|
3
|
<RESOURCE_IDENTIFIER value="_VHJhbnNmb3JtYXRpb25SdWxlRFNSZXNvdXJjZXMvVHJhbnNmb3JtYXRpb25SdWxlRFNSZXNvdXJjZVR5cGU="/>
|
4
|
<RESOURCE_TYPE value="TransformationRuleDSResourceType"/>
|
5
|
<RESOURCE_KIND value="TransformationRuleDSResources"/>
|
6
|
<RESOURCE_URI value=""/>
|
7
|
<DATE_OF_CREATION value="2023-11-28T14:38:50+00:00"/>
|
8
|
</HEADER>
|
9
|
<BODY>
|
10
|
<CONFIGURATION>
|
11
|
<SOURCE_METADATA_FORMAT interpretation="cleaned" layout="store" name="odf"/>
|
12
|
<SINK_METADATA_FORMAT name="odf_hbase"/>
|
13
|
<IMPORTED/>
|
14
|
<SCRIPT>
|
15
|
<TITLE>xslt_cleaning_oaire2datacite_hadoop</TITLE>
|
16
|
<CODE><!--
|
17
|
adaptation 2023-11-28 for FWF project links (without validationDate - setting the validationDate caused the rule to skip almost all records for unknown reasons; Alessia Bardi/CNR
|
18
|
adaptation 2023-05-09 for ROHub types in EOSC Future ; Alessia Bardi/CNR
|
19
|
adaptation 2021-08-23 ; ACz/UNIBI
|
20
|
-->
|
21
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:oaire="http://namespace.openaire.eu/schema/oaire/" xmlns:vocabulary="http://eu/dnetlib/transform/clean" xmlns:dateCleaner="http://eu/dnetlib/transform/dateISO" xmlns:oaf="http://namespace.openaire.eu/oaf" xmlns:oai="http://www.openarchives.org/OAI/2.0/" xmlns:datacite="http://datacite.org/schema/kernel-4" xmlns:dri="http://www.driver-repository.eu/namespace/dri" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dr="http://www.driver-repository.eu/namespace/dr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" exclude-result-prefixes="xsl vocabulary dateCleaner" version="2.0">
|
22
|
<xsl:param name="varOfficialName"/>
|
23
|
<xsl:param name="varDataSourceId"/>
|
24
|
<xsl:param name="varAKA" select="'aka_________::'"/>
|
25
|
<xsl:param name="varARC" select="'arc_________::'"/>
|
26
|
<xsl:param name="varANR" select="'anr_________::'"/>
|
27
|
<xsl:param name="varCHISTERA" select="'chistera____::'"/>
|
28
|
<xsl:param name="varCONICYT" select="'conicytf____::'"/>
|
29
|
<xsl:param name="varDFG" select="'dfgf________::'"/>
|
30
|
<xsl:param name="varEUENVAGENCY" select="'euenvagency_::'"/>
|
31
|
<xsl:param name="varFCT" select="'fct_________::'"/>
|
32
|
<xsl:param name="varFP7" select="'corda_______::'"/>
|
33
|
<xsl:param name="varFWF" select="'fwf_________::'"/>
|
34
|
<xsl:param name="varGSRI" select="'gsri________::'"/>
|
35
|
<xsl:param name="varGSRT" select="'gsrt________::'"/>
|
36
|
<xsl:param name="varH2020" select="'corda__h2020::'"/>
|
37
|
<xsl:param name="varHEUROPE" select="'corda_____he::'"/>
|
38
|
<xsl:param name="varHRZZ" select="'irb_hr______::'"/><!-- HRZZ not found -->
|
39
|
<xsl:param name="varINNOVIRIS" select="'innoviris___::'"/>
|
40
|
<xsl:param name="varMESTD" select="'mestd_______::'"/>
|
41
|
<xsl:param name="varMIUR" select="'miur________::'"/>
|
42
|
<xsl:param name="varMZOS" select="'irb_hr______::'"/>
|
43
|
<xsl:param name="varNHMRC" select="'nhmrc_______::'"/>
|
44
|
<xsl:param name="varNIH" select="'nih_________::'"/>
|
45
|
<xsl:param name="varNSF" select="'nsf_________::'"/>
|
46
|
<xsl:param name="varNWO" select="'nwo_________::'"/>
|
47
|
<xsl:param name="varRIF" select="'rif_________::'"/>
|
48
|
<xsl:param name="varRSF" select="'rsf_________::'"/>
|
49
|
<xsl:param name="varSFI" select="'sfi_________::'"/>
|
50
|
<xsl:param name="varSFRS" select="'sfrs________::'"/>
|
51
|
<xsl:param name="varSGOV" select="'sgov________::'"/><!-- SGOV to be added, awaiting DOI from Pilar, found project ids not in CSV list? -->
|
52
|
<xsl:param name="varSNSF" select="'snsf________::'"/>
|
53
|
<xsl:param name="varTARA" select="'taraexp_____::'"/><!-- TARA to be added, awaiting DOI from André -->
|
54
|
<xsl:param name="varTUBITAK" select="'tubitakf____::'"/>
|
55
|
<xsl:param name="varUKRI" select="'ukri________::'"/><!-- UKRI replace RCUK namespace: 'rcuk________::' -->
|
56
|
<xsl:param name="varWT" select="'wt__________::'"/>
|
57
|
<xsl:param name="index" select="0"/>
|
58
|
<xsl:param name="transDate" select="current-dateTime()"/>
|
59
|
<xsl:template match="/">
|
60
|
<xsl:variable name="datasourcePrefix" select="normalize-space(//oaf:datasourceprefix)"/><!-- TODO: termination handling at Spark level must be refined! -->
|
61
|
<xsl:if test="//oai:header/@status='deleted'">
|
62
|
<xsl:call-template name="terminate"/>
|
63
|
</xsl:if>
|
64
|
<xsl:for-each select="//*[local-name() = 'date'][@dateType='Issued']">
|
65
|
<xsl:if test="string-length(normalize-space(.)) < 4"><!-- xsl:call-template name="terminate"/ --></xsl:if>
|
66
|
</xsl:for-each>
|
67
|
<xsl:call-template name="checkIdentifierType"/>
|
68
|
<xsl:call-template name="validRecord"/>
|
69
|
</xsl:template>
|
70
|
<xsl:template name="terminate">
|
71
|
<xsl:message terminate="yes">
|
72
|
record is not i+t v4 compliant, transformation is interrupted.
|
73
|
</xsl:message>
|
74
|
</xsl:template><!-- ## check datacite:identifier identifierType vocabulary - https://openaire-guidelines-for-literature-repository-managers.readthedocs.io/en/latest/field_resourceidentifier.html#attribute-identifiertype-m ## -->
|
75
|
<xsl:template name="checkIdentifierType">
|
76
|
<xsl:if test="lower-case(//*[local-name() = 'identifier']/@identifierType) != 'ark' and lower-case(//*[local-name() = 'identifier']/@identifierType) != 'doi' and lower-case(//*[local-name() = 'identifier']/@identifierType) != 'handle' and lower-case(//*[local-name() = 'identifier']/@identifierType) != 'igsn' and lower-case(//*[local-name() = 'identifier']/@identifierType) != 'purl' and lower-case(//*[local-name() = 'identifier']/@identifierType) != 'url' and lower-case(//*[local-name() = 'identifier']/@identifierType) != 'urn' and lower-case(//*[local-name() = 'identifier']/@identifierType) != 'w3id'">
|
77
|
<xsl:call-template name="terminate"/>
|
78
|
</xsl:if>
|
79
|
</xsl:template>
|
80
|
<xsl:template name="validRecord">
|
81
|
<record>
|
82
|
<xsl:apply-templates select="//*[local-name() = 'header']"/>
|
83
|
<metadata><!-- ~~~~~ pre-detect resourceType, superType and store in variable ~~~~~ --><!-- optimize resourceType, superType in case of several statements (e.g. FU Berlin unfortunately contains record with several) --><!--
|
84
|
<xsl:variable name='varCobjCategory' select="TransformationFunction:convertString($tf, distinct-values(//*[local-name()='resourceType'][1]/@uri), 'TextTypologies')" />
|
85
|
<xsl:variable name="varSuperType" select="TransformationFunction:convertString($tf, $varCobjCategory, 'SuperTypes')"/>
|
86
|
-->
|
87
|
<xsl:variable name="varTypLst" select="distinct-values((//*[local-name()='resourceType']/(., @*)))"/>
|
88
|
<xsl:variable name="varCobjCatLst" select="distinct-values((for $i in $varTypLst return vocabulary:clean( normalize-space($i), 'dnet:publication_resource')))"/>
|
89
|
<xsl:variable name="varCobjSupLst" select="for $i in $varCobjCatLst return concat($i, '###', vocabulary:clean( normalize-space($i), 'dnet:result_typologies'))"/>
|
90
|
<xsl:variable name="varCobjSup" select="( $varCobjSupLst[not(substring-after(., '###') = 'other') and not(substring-before(., '###') = ('0038', '0039', '0040'))][1], $varCobjSupLst[not(substring-after(., '###') = 'other')][1], $varCobjSupLst[not(substring-before(., '###') = ('0020', '0000'))][1], $varCobjSupLst[not(substring-before(., '###') = ('0000'))][1], $varCobjSupLst[not(substring-before(., '###') = ('0000'))][1], '0000')[1]"/>
|
91
|
<xsl:variable name="varSuperType" select="substring-after($varCobjSup, '###')"/>
|
92
|
<xsl:variable name="varCobjCategory" select="substring-before($varCobjSup, '###')"/><!-- ~~~~~ pre-detect, -clean, -deduplicat PIDs and store in variable ~~~~~ -->
|
93
|
<xsl:variable name="varKnownFileEndings" select="('.bmp', '.doc', '.docx', '.epub', '.flv', '.jpeg', '.jpg', '.m4v', '.mp4', '.mpg', '.odp', '.pdf', '.png', '.ppt', '.tiv', '.txt', '.xls', '.xlsx', '.zip')"/><!-- landingPage URL --><!-- either generate landing pages (as often not given), or compare URL with baseURL --><!--
|
94
|
// covered in comparison: URL encoded baseURLs, item URL und baseURL differing only in prefix www. or postfix port
|
95
|
// not covered in comparison: URL encoded item URL, URLs being a substring of URLs (like item URL http://def.br/... and baseURL http://abcdef.br/...), ports when only in baseURL or only in item URL
|
96
|
// tries to not consider higher level URLs as item URLs (e.g. journal URLs) by enforcing something after /
|
97
|
-->
|
98
|
<xsl:variable name="varOrigBaseUrl" select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and not(./*[local-name() = 'originDescription'])]/*[local-name() = 'baseURL']"/>
|
99
|
<xsl:variable name="varAggrBaseUrl" select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and (./*[local-name() = 'originDescription'])]/*[local-name() = 'baseURL']"/>
|
100
|
<xsl:variable name="varLandingPage" select="( //datacite:identifier[(contains(substring-after(., '://'), '/') and contains($varOrigBaseUrl, substring-before(substring-after(., '://'), '/'))) or (contains(substring-after(., '://'), ':') and contains($varOrigBaseUrl, substring-before(substring-after(., '://'), ':')))][not(replace(lower-case(.), '.*(\.[a-z]*)$', '$1') = $varKnownFileEndings)], //datacite:identifier[(contains(substring-after(., '://'), '/') and contains($varAggrBaseUrl, substring-before(substring-after(., '://'), '/'))) or (contains(substring-after(., '://'), ':') and contains($varAggrBaseUrl, substring-before(substring-after(., '://'), ':')))][not(replace(lower-case(.), '.*(\.[a-z]*)$', '$1') = $varKnownFileEndings)], //oaf:datasourceprefix[. = 'od_______268']/concat('https://qspace.library.queensu.ca/handle/', substring-after(//dri:recordIdentifier, 'oai:qspace.library.queensu.ca:')), //oaf:datasourceprefix[. = 'od_______307']/concat('http://repositorium.sdum.uminho.pt/handle/', substring-after(//dri:recordIdentifier, 'oai:repositorium.sdum.uminho.pt:')), //oaf:datasourceprefix[. = 'od_______317']/concat('https://papyrus.bib.umontreal.ca/xmlui/handle/', substring-after(//dri:recordIdentifier, 'oai:papyrus.bib.umontreal.ca:')), //oaf:datasourceprefix[. = 'od______1318']/concat('https://orbi.uliege.be/handle/', substring-after(//dri:recordIdentifier, 'oai:orbi.ulg.ac.be:')), //oaf:datasourceprefix[. = 'od______1388']/concat('http://rabida.uhu.es/dspace/handle/', substring-after(//dri:recordIdentifier, 'oai:rabida.uhu.es:')), //oaf:datasourceprefix[. = 'od______1472']/concat('https://gredos.usal.es/handle/', substring-after(//dri:recordIdentifier, 'oai:gredos.usal.es:')), //oaf:datasourceprefix[. = 'od______1560']/concat('https://riunet.upv.es/handle/', substring-after(//dri:recordIdentifier, 'oai:riunet.upv.es:')), //oaf:datasourceprefix[. = 'od______3158']/concat('https://open.uct.ac.za/handle/', substring-after(//dri:recordIdentifier, 'oai:localhost:')), //oaf:datasourceprefix[. = 'od______4225']/concat('https://repository.rothamsted.ac.uk/item/', substring-after(//dri:recordIdentifier, 'oai:repository.rothamsted.ac.uk:')), //oaf:datasourceprefix[. = 'od______9626']/(//datacite:identifier)[@identifierType='Handle'][not(contains(., '/handle/123456789/'))], //oaf:datasourceprefix[not(. = ('od_______268', 'od_______307', 'od______1318', 'od______1388', 'od______1472', 'od______4225'))]/(//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*) = ('url', 'uri')][not(contains(., 'doi.org/')) and not(contains(., '/doi/')) and not(contains(., '/pmc/'))][starts-with(., 'http')] )[1]"/><!-- IDs (identifier and alternateIdentifier, not relatedIdentifier) --><!-- container PIDs (ISSNs, ISBNs) often erroneously stuffed in alternateIdentifier for contained items (journal articles, book chapters, ...), are to be shifted into relatedIdentifier instead -->
|
101
|
<xsl:variable name="varPidDoi" select="concat(' DOI:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[contains(., 'doi.org/10.')]/lower-case(substring-after(., 'doi.org/')), (//datacite:identifier, //datacite:alternateIdentifier)[contains(., 'info:doi:')]/substring-after(., 'info:doi:'), (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='doi'][not(contains(., 'doi.org/10.')) and not(contains(., 'info:doi:')) and not(contains(., '/doi/'))]/lower-case(.), (//datacite:identifier, //datacite:alternateIdentifier)[matches(., '.*/doi/.*/10\..*')]/replace(., '.*/doi/.*/(10\..*)$', '$1') )), ' DOI:::'))"/>
|
102
|
<xsl:variable name="varPidHandle" select="concat(' Handle:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[contains(., 'hdl.handle.net/')][not(contains(., '123456789'))]/substring-after(., 'hdl.handle.net/'), (//datacite:identifier, //datacite:alternateIdentifier)[contains(., 'info:hdl:')][not(contains(., '123456789'))]/substring-after(., 'info:hdl:'), (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='handle'][not(starts-with(., 'http')) and not(contains(., 'hdl.handle.net/')) and not(contains(., 'info:hdl:')) and not(contains(., '/handle/123456789/'))] )), ' Handle:::'))"/>
|
103
|
<xsl:variable name="varPidUrn" select="concat(' URN:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'urn:nbn:')]/concat('urn:nbn:', substring-after(lower-case(.), 'urn:nbn:')), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'http') and (contains(lower-case(.), '://nbn-resolving.org/urn:nbn:') or contains(lower-case(.), '://nbn-resolving.de/urn/resolver.pl?urn:nbn:') or contains(lower-case(.), '://nbn-resolving.de/urn:nbn:') or contains(lower-case(.), '://resolver.obvsg.at/urn:nbn:') or contains(lower-case(.), '://urn.fi/urn:nbn:') or contains(lower-case(.), '://urn.kb.se/resolve?urn=urn:nbn:'))]/concat('urn:nbn:', substring-after(lower-case(.), 'urn:nbn:')) )), ' URN:::'))"/>
|
104
|
<xsl:variable name="varPidArk" select="concat(' ARK:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(., 'http') and contains(., '/ark:/')]/concat('ark:/', substring-after(., '/ark:/')) )), ' ARK:::'))"/>
|
105
|
<xsl:variable name="varPidPmid" select="concat(' PMID:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(., 'http') and contains(., '://www.ncbi.nlm.nih.gov/pmc/articles/')]/substring-after(., '://www.ncbi.nlm.nih.gov/pmc/articles/'), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(., 'info:pmid/')]/substring-after(., 'info:pmid/'), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'pmid:') or starts-with(lower-case(.), 'pubmed:')]/substring-after(., ':'), (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='pmc'][not(contains(., 'ncbi.nlm.nih.gov'))][not(contains(., ':'))], (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='pmid'][not(contains(., ':'))] )), ' PMID:::'))"/>
|
106
|
<xsl:variable name="varPidPmcid" select="concat(' PMCID:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(., 'http') and (contains(lower-case(.), '://www.ncbi.nlm.nih.gov/pmc/articles/pmc') or contains(lower-case(.), '://europepmc.org/articles/pmc'))]/substring-after(., '/articles/'), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'pmcid:') or starts-with(lower-case(.), 'pmc:')]/substring-after(., ':'), (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='pmcid'] )), ' PMCID:::'))"/>
|
107
|
<xsl:variable name="varPidHal" select="concat(' HAL:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='hal' and (starts-with(., 'hal-') or starts-with(., 'halshs-') or starts-with(., 'halsde-'))], (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(., 'http') and (contains(., '://hal.archives-ouvertes.fr/hal') or contains(., '://hal.inria.fr/hal') or contains(., '://halshs.archives-ouvertes.fr/hal') or contains(., '://halsde.archives-ouvertes.fr/hal'))]/substring-after(., '.fr/') )), ' HAL:::'))"/>
|
108
|
<xsl:variable name="varPidBibc" select="concat(' BIBC:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'bibcode:')]/substring-after(lower-case(.), 'bibcode:'), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(., 'http') and contains(lower-case(.), 'bibcode=')]/substring(substring-after(lower-case(.), 'bibcode='), 1, 19) )), ' BIBC:::'))"/>
|
109
|
<xsl:variable name="varPidArxiv" select="concat(' arXiv:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'arxiv:')]/substring-after(lower-case(.), 'arxiv:'), (//datacite:identifier, //datacite:alternateIdentifier)[(starts-with(., 'http') or starts-with(lower-case(.), 'arxiv: http')) and contains(., '://arxiv.org/abs/')]/substring-after(., '://arxiv.org/abs/'), (//datacite:identifier, //datacite:alternateIdentifier)[(starts-with(., 'http') or starts-with(lower-case(.), 'arxiv: http')) and contains(., '://arxiv.org/pdf/')]/substring-before(substring-after(lower-case(.), '://arxiv.org/pdf/'), '.pdf'), (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='arxiv'] )), ' arXiv:::'))"/>
|
110
|
<xsl:variable name="varPidWos" select="concat(' WOS:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='wos'][not(starts-with(lower-case(.), 'wos:'))], (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'wos:') and not(starts-with(lower-case(.), 'wos: wos:'))]/substring-after(lower-case(.), 'wos:'), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'wos: wos:')]/substring-after(lower-case(.), 'wos: wos:') )), ' WOS:::'))"/>
|
111
|
<xsl:variable name="varPidScp" select="concat(' SCP:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(lower-case(.), 'scopus_id:') or starts-with(lower-case(.), 'scopus:')]/substring-after(., ':'), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(normalize-space(.), 'scopus: eid=')]/substring-after(., 'eid=2-s2.0-'), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(normalize-space(.), 'http') and contains(., '://www.scopus.com/inward/record.ur') and contains(., 'scp=')]/substring-after(., 'scp='), (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(normalize-space(.), 'http') and contains(., '://www.scopus.com/inward/record.ur') and contains(., 'eid=2-s2.0-')]/substring-after(., 'eid=2-s2.0-') )), ' SCP:::'))"/>
|
112
|
<xsl:variable name="varPidUrl" select="concat(' URL:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='url'] [not(contains(., 'doi.org/10.')) and not(contains(., 'info:doi:')) and not(matches(., '.*/doi/.*/10\..*'))] [not(contains(., 'hdl.handle.net/')) and not(contains(., 'info:hdl:'))] [not(contains(., '://www.ncbi.nlm.nih.gov/pmc/articles/'))] [not(. = $varLandingPage)] )), ' URL:::'))"/>
|
113
|
<xsl:variable name="varPidIsbn" select="concat(' ISBN:::', string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='isbn' and not(contains(., ':')) and not($varCobjCategory = '0013')], (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)='isbn' and starts-with(lower-case(.), 'urn:isbn') and not($varCobjCategory = '0013')]/substring-after(lower-case(.), 'urn:isbn:') )), ' ISBN:::'))"/>
|
114
|
<xsl:variable name="varPidIssn" select="string-join(distinct-values(( (//datacite:identifier, //datacite:alternateIdentifier)[lower-case(@*)=('issn', 'pissn', 'eissn', 'lissn') and matches(., '.*\d{4}[\s-]?\d{3}[\dXx].*') and not($varCobjCategory = '0001')]/concat(' ', upper-case((@identifierType, @alternateIdentifierType)), ':::', replace(., '^.*(\d{4})[\s-]?(\d{3}[\dXx]).*$', '$1-$2')) )), '')"/><!-- heap all IDs, drop landingPage URL -->
|
115
|
<xsl:variable name="varPidW3id" select="concat(' w3id:::', string-join(distinct-values(( (//datacite:identifier)[@identifierType='w3id']/text(), ' w3id:::'))))"/><!-- heap all IDs, drop landingPage URL -->
|
116
|
<xsl:variable name="varPidPre" select="concat($varPidDoi[not(. = ' DOI:::')], $varPidHandle[not(. = ' Handle:::')], $varPidUrn[not(. = ' URN:::')], $varPidArk[not(. = ' ARK:::')], $varPidPmid[not(. = ' PMID:::')], $varPidPmcid[not(. = ' PMCID:::')], $varPidHal[not(. = ' HAL:::')], $varPidBibc[not(. = ' BIBC:::')], $varPidArxiv[not(. = ' arXiv:::')], $varPidWos[not(. = ' WOS:::')], $varPidScp[not(. = ' SCP:::')], $varPidUrl[not(. = ' URL:::')], $varPidIsbn[not(. = ' ISBN:::')], $varPidIssn[not(. = ' ISSN:::')], $varPidW3id[not(. = ' w3id:::')])"/><!--
|
117
|
<xsl:variable name="varPid" select="concat($varPidPre, $varLandingPage[string-length($varPidPre) = 0]/concat('landingPage:::', .))"/>
|
118
|
<xsl:variable name="varPid" select="concat($varPidPre, concat(' landingPage:::', $varLandingPage[string-length($varPidPre) = 0], .))"/>
|
119
|
-->
|
120
|
<xsl:variable name="varPid" select="concat($varPidPre, //oaf:datasourceprefix[string-length($varPidPre) = 0]/concat(' landingPage:::', $varLandingPage))"/><!-- relatedIdentifier --><!-- container PIDs (ISSNs, ISBNs) often erroneously stuffed in alternateIdentifier for contained items (journal articles, book chapters, ...), are to be shifted into relatedIdentifier instead -->
|
121
|
<xsl:variable name="varRelPidDoi" select="concat(' DOI:::', string-join(distinct-values(( (//datacite:relatedIdentifier)[contains(., 'doi.org/10.')]/concat(lower-case(substring-after(., 'doi.org/')), ':::', @relationType), (//datacite:relatedIdentifier)[contains(., 'info:doi:')]/concat(substring-after(., 'info:doi:'), ':::', @relationType), (//datacite:relatedIdentifier)[@relatedIdentifierType='DOI'][not(contains(., 'doi.org/10.')) and not(contains(., 'info:doi:')) and not(contains(., '/doi/'))]/concat(lower-case(.), ':::', @relationType), (//datacite:relatedIdentifier)[matches(., '.*/doi/.*/10\..*')]/concat(replace(., '.*/doi/.*/(10\..*)$', '$1'), ':::', @relationType) )), ' DOI:::'))"/>
|
122
|
<xsl:variable name="varRelPidHandle" select="concat(' Handle:::', string-join(distinct-values(( (//datacite:relatedIdentifier)[contains(., 'hdl.handle.net/')]/concat(substring-after(., 'hdl.handle.net/'), ':::', @relationType), (//datacite:relatedIdentifier)[contains(., 'info:hdl:')]/concat(substring-after(., 'info:hdl:'), ':::', @relationType), (//datacite:relatedIdentifier)[lower-case(@relatedIdentifierType)='handle'][not(contains(., 'hdl.handle.net/')) and not(contains(., 'info:hdl:'))]/concat(., ':::', @relationType) )), ' Handle:::'))"/>
|
123
|
<xsl:variable name="varRelPidPmid" select="concat(' PMID:::', string-join(distinct-values(( (//datacite:relatedIdentifier)[contains(., '://www.ncbi.nlm.nih.gov/pmc/articles/')]/concat(substring-after(., '://www.ncbi.nlm.nih.gov/pmc/articles/'), ':::', @relationType), (//datacite:relatedIdentifier)[lower-case(@*)='pmc'][not(contains(., 'ncbi.nlm.nih.gov'))]/concat(., ':::', @relationType) )), ' PMID:::'))"/>
|
124
|
<xsl:variable name="varRelPidPmcid" select="concat(' PMCID:::', string-join(distinct-values(( (//datacite:relatedIdentifier)[lower-case(@*)='pmcid'] /concat(., ':::', @relationType) )), ' PMCID:::'))"/>
|
125
|
<xsl:variable name="varRelPidArxiv" select="concat(' arXiv:::', string-join(distinct-values(( (//datacite:relatedIdentifier)[lower-case(@*)='arxiv'] /concat(., ':::', @relationType) )), ' arXiv:::'))"/>
|
126
|
<xsl:variable name="varRelPidWos" select="concat(' WOS:::', string-join(distinct-values(( (//datacite:relatedIdentifier)[lower-case(@*)='wos'][not(starts-with(lower-case(.), 'wos:'))]/concat(., ':::', @relationType), (//datacite:relatedIdentifier)[starts-with(lower-case(.), 'wos:')]/concat(substring-after(lower-case(.), 'wos:'), ':::', @relationType) )), ' WOS:::'))"/>
|
127
|
<xsl:variable name="varRelPidUrl" select="concat(' URL:::', string-join(distinct-values(( (//datacite:relatedIdentifier)[lower-case(@*)='url'] [not(contains(., 'doi.org/10.')) and not(contains(., 'info:doi:')) and not(matches(., '.*/doi/.*/10\..*'))] [not(contains(., 'hdl.handle.net/')) and not(contains(., 'info:hdl:'))] [not(contains(., '://www.ncbi.nlm.nih.gov/pmc/articles/'))] /concat(., ':::', @relationType) )), ' URL:::'))"/>
|
128
|
<xsl:variable name="varRelPidW3id" select="concat(' w3id:::', string-join(distinct-values(((//datacite:relatedIdentifier)[lower-case(@*) = 'w3id'][not(starts-with(lower-case(.), 'w3id:'))]/concat(., ':::', @relationType), (//datacite:relatedIdentifier)[starts-with(lower-case(.), 'w3id:')]/concat(substring-after(lower-case(.), 'w3id:'), ':::', @relationType))), ' w3id:::'))"/>
|
129
|
<xsl:variable name="varRelPid" select="concat($varRelPidDoi[not(. = ' DOI:::')], $varRelPidHandle[not(. = ' Handle:::')], $varRelPidPmid[not(. = ' PMID:::')], $varRelPidPmcid[not(. = ' PMCID:::')], $varRelPidArxiv[not(. = ' arXiv:::')], $varRelPidWos[not(. = ' WOS:::')], $varRelPidW3id[not(. = ' w3id:::')], $varRelPidUrl[not(. = ' URL:::')])"/><!-- container PIDs --><!-- TODO --><!-- drop oaire resource --><!-- <oaire:resource xmlns="http://namespace.openaire.eu/schema/oaire/"> -->
|
130
|
<datacite:resource><!-- ~~~~~ IDs ~~~~~ --><!-- choose 'best' PID among identifiers and alternateIdentifers, and cut off DOI resolver prefix to just get the number part -->
|
131
|
<datacite:identifier>
|
132
|
<xsl:attribute name="identifierType" select="substring-before(tokenize(normalize-space($varPid), ' ')[1], ':::')"/>
|
133
|
<xsl:value-of select="substring-after(tokenize(normalize-space($varPid), ' ')[1], ':::')"/>
|
134
|
</datacite:identifier>
|
135
|
<datacite:alternateIdentifiers>
|
136
|
<xsl:for-each select="tokenize(normalize-space($varPid), ' ')[position() > 1][string-length(substring-after(., ':::')) > 0]">
|
137
|
<datacite:alternateIdentifier>
|
138
|
<xsl:attribute name="alternateIdentifierType" select="substring-before(., ':::')"/>
|
139
|
<xsl:value-of select="substring-after(., ':::')"/>
|
140
|
</datacite:alternateIdentifier>
|
141
|
</xsl:for-each>
|
142
|
<xsl:for-each select="(//datacite:alternateIdentifier, //datacite:identifier) [not($varCobjCategory = '0001' and ./@*[local-name()=('identifierType', 'alternateIdentifierType')]/lower-case(.) = ('issn', 'pissn', 'eissn', 'lissn'))] [not($varCobjCategory = '0013' and ./@*[local-name()=('identifierType', 'alternateIdentifierType')]/lower-case(.) = 'isbn')] [not(ends-with(., 'pdf'))] [not(@*[local-name()=('identifierType', 'alternateIdentifierType')]/lower-case(.) = ('doi', 'handle', 'urn', 'pmid', 'pmcid', 'arxiv', 'wos', 'url', 'isbn', 'issn', 'eissn', 'lissn', 'pissn'))] [not(. = $varLandingPage)]">
|
143
|
<datacite:alternateIdentifier>
|
144
|
<xsl:attribute name="alternateIdentifierType" select="./@*[local-name()=('identifierType', 'alternateIdentifierType')]"/>
|
145
|
<xsl:value-of select="."/>
|
146
|
</datacite:alternateIdentifier>
|
147
|
</xsl:for-each>
|
148
|
<xsl:if test="not(starts-with(normalize-space(lower-case($varPid)), 'landingpage')) and string-length($varLandingPage) > 0">
|
149
|
<datacite:alternateIdentifier>
|
150
|
<xsl:attribute name="alternateIdentifierType" select="'landingPage'"/>
|
151
|
<xsl:value-of select="$varLandingPage"/>
|
152
|
</datacite:alternateIdentifier>
|
153
|
</xsl:if>
|
154
|
</datacite:alternateIdentifiers>
|
155
|
<datacite:relatedIdentifiers>
|
156
|
<xsl:for-each select="(//datacite:relatedIdentifier) [not(@relatedIdentifierType/lower-case(.) = ('doi', 'handle', 'pmid', 'pmcid', 'wos', 'url'))] [not(starts-with(lower-case(.), 'wos:') or contains(., 'hdl.handle.net/') or contains(., 'doi.org/10.'))] [not(@relatedIdentifierType/lower-case(.) = ('issn', 'pissn', 'eissn', 'lissn', 'isbn') and @relationType/lower-case(.) = 'ispartof')]">
|
157
|
<datacite:relatedIdentifier>
|
158
|
<xsl:attribute name="relatedIdentifierType" select="./@relatedIdentifierType"/>
|
159
|
<xsl:attribute name="relationType" select="./@relationType"/>
|
160
|
<xsl:value-of select=".[not(@relatedIdentifierType/lower-case(.) = ('issn', 'pissn', 'eissn', 'lissn'))], .[@relatedIdentifierType/lower-case(.) = ('issn', 'pissn', 'eissn', 'lissn')]/concat(substring(., 1, 4), '-', substring(., string-length(.)-3, 4))"/>
|
161
|
</datacite:relatedIdentifier>
|
162
|
</xsl:for-each>
|
163
|
</datacite:relatedIdentifiers><!-- change namespace/format from oaire to datacite for description, language, rights, ... -->
|
164
|
<xsl:for-each select="//oaire:resourceType">
|
165
|
<datacite:resourceType>
|
166
|
<xsl:attribute name="xs:anyURI" select="@uri"/>
|
167
|
<xsl:value-of select="."/>
|
168
|
</datacite:resourceType>
|
169
|
</xsl:for-each>
|
170
|
<xsl:for-each select="distinct-values(//oaire:version)">
|
171
|
<datacite:version>
|
172
|
<xsl:value-of select="."/>
|
173
|
</datacite:version>
|
174
|
</xsl:for-each>
|
175
|
<xsl:if test="(//datacite:rights, //oaire:licenseCondition)[string-length(.) > 0 or string-length(@rightsURI) > 0 or string-length(@uri) > 0]">
|
176
|
<datacite:rightsList>
|
177
|
<xsl:for-each select="(//datacite:rights | //oaire:licenseCondition)[string-length(.) > 0 or string-length(@rightsURI) > 0 or string-length(@uri) > 0]">
|
178
|
<datacite:rights>
|
179
|
<xsl:attribute name="rightsURI" select="(@rightsURI, @uri)[1]"/>
|
180
|
<xsl:value-of select="."/>
|
181
|
</datacite:rights>
|
182
|
</xsl:for-each>
|
183
|
</datacite:rightsList>
|
184
|
</xsl:if>
|
185
|
<xsl:if test="//datacite:title">
|
186
|
<datacite:titles>
|
187
|
<xsl:for-each select="//datacite:title">
|
188
|
<datacite:title>
|
189
|
<xsl:for-each select="@*">
|
190
|
<xsl:copy/>
|
191
|
</xsl:for-each>
|
192
|
<xsl:value-of select="."/>
|
193
|
</datacite:title>
|
194
|
</xsl:for-each>
|
195
|
</datacite:titles>
|
196
|
</xsl:if>
|
197
|
<xsl:if test="//dc:description">
|
198
|
<datacite:descriptions>
|
199
|
<xsl:for-each select="//dc:description">
|
200
|
<datacite:description>
|
201
|
<xsl:attribute name="descriptionType" select="'Abstract'"/>
|
202
|
<xsl:for-each select="@*">
|
203
|
<xsl:copy/>
|
204
|
</xsl:for-each>
|
205
|
<xsl:value-of select="."/>
|
206
|
</datacite:description>
|
207
|
</xsl:for-each>
|
208
|
</datacite:descriptions>
|
209
|
</xsl:if>
|
210
|
<xsl:for-each select="distinct-values(//dc:language)[string-length(normalize-space(.)) > 0]">
|
211
|
<datacite:language>
|
212
|
<xsl:value-of select="normalize-space(.)"/>
|
213
|
</datacite:language>
|
214
|
</xsl:for-each>
|
215
|
<xsl:for-each select="distinct-values(//dc:publisher)[string-length(normalize-space(.)) > 0]">
|
216
|
<datacite:publisher>
|
217
|
<xsl:value-of select="normalize-space(.)"/>
|
218
|
</datacite:publisher>
|
219
|
</xsl:for-each>
|
220
|
<xsl:if test="//dc:format[string-length(normalize-space(.)) > 0]">
|
221
|
<datacite:formats>
|
222
|
<xsl:for-each select="distinct-values(//dc:format)[string-length(normalize-space(.)) > 0]">
|
223
|
<datacite:format>
|
224
|
<xsl:value-of select="normalize-space(.)"/>
|
225
|
</datacite:format>
|
226
|
</xsl:for-each>
|
227
|
</datacite:formats>
|
228
|
</xsl:if>
|
229
|
<xsl:if test="//oaire:fundingReference[./oaire:awardNumber]">
|
230
|
<datacite:fundingReferences>
|
231
|
<xsl:for-each select="//oaire:fundingReference[./oaire:awardNumber]">
|
232
|
<datacite:fundingReference>
|
233
|
<datacite:funderName>
|
234
|
<xsl:value-of select="./oaire:funderName"/>
|
235
|
</datacite:funderName>
|
236
|
<datacite:funderIdentifier>
|
237
|
<xsl:attribute name="funderIdentifierType" select="'Crossref Funder ID'"/>
|
238
|
<xsl:value-of select="./oaire:funderIdentifier"/>
|
239
|
</datacite:funderIdentifier>
|
240
|
<datacite:awardNumber>
|
241
|
<xsl:value-of select="./oaire:awardNumber"/>
|
242
|
</datacite:awardNumber><!--<xsl:value-of select="."/>-->
|
243
|
</datacite:fundingReference>
|
244
|
</xsl:for-each>
|
245
|
</datacite:fundingReferences>
|
246
|
</xsl:if>
|
247
|
<xsl:apply-templates select="(//*[local-name()='resource'], //*[local-name() = 'oai_openaire'])/*[not(local-name() = ('identifier', 'alternateIdentifiers', 'alternateIdentifier', 'relatedIdentifiers', 'relatedIdentifier', 'description', 'titles', 'title', 'language', 'publisher', 'resourceType', 'version', 'fundingReferences', 'fundingReference', 'rights', 'licenseCondition', 'file', 'format', 'audience', 'source', 'coverage'))][not(starts-with(local-name(), 'citation'))]"/><!-- </oaire:resource> -->
|
248
|
</datacite:resource><!-- ~~~~~ put oaf elements below datacite:resource ~~~~~ --><!-- oaf:identifier -->
|
249
|
<xsl:for-each select="tokenize(normalize-space($varPid), ' ')[string-length(substring-after(normalize-space(.), ':::')) > 0]">
|
250
|
<oaf:identifier>
|
251
|
<xsl:attribute name="identifierType" select="substring-before(normalize-space(.), ':::')"/>
|
252
|
<xsl:value-of select="substring-after(normalize-space(.), ':::')"/>
|
253
|
</oaf:identifier>
|
254
|
</xsl:for-each>
|
255
|
<xsl:if test="not(starts-with(normalize-space(lower-case($varPid)), 'landingpage')) and string-length($varLandingPage) > 0">
|
256
|
<oaf:identifier>
|
257
|
<xsl:attribute name="identifierType" select="'landingPage'"/>
|
258
|
<xsl:value-of select="$varLandingPage"/>
|
259
|
</oaf:identifier>
|
260
|
</xsl:if>
|
261
|
<xsl:if test="//*[local-name() = 'about']/*[local-name() = 'provenance']/*[local-name() = 'originDescription']/*[local-name() = 'originDescription']/*[local-name() = 'identifier' and string-length(.) > 0]">
|
262
|
<oaf:identifier>
|
263
|
<xsl:attribute name="identifierType" select="'oai-original'"/>
|
264
|
<xsl:value-of select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and not(./*[local-name() = 'originDescription'])]/*[local-name() = 'identifier']"/>
|
265
|
</oaf:identifier>
|
266
|
</xsl:if>
|
267
|
<xsl:variable name="varEmbargoEndDate" select="dateCleaner:dateISO(normalize-space(//*[local-name()='date'][@dateType='Available']))"/><!-- resourceType, superType -->
|
268
|
<xsl:choose>
|
269
|
<xsl:when test="lower-case(//*[local-name()='resourceType']/@resourceTypeGeneral) = ('dataset', 'software', 'literature', 'publication', 'other research product') or not(//*[local-name()='resourceType']/@resourceTypeGeneral)">
|
270
|
<dr:CobjCategory>
|
271
|
<xsl:variable name="varCobjCategory" select="vocabulary:clean( //*[local-name()='resourceType']/@resourceTypeGeneral, 'dnet:publication_resource')"/>
|
272
|
<xsl:variable name="varSuperType" select="vocabulary:clean( $varCobjCategory, 'dnet:result_typologies')"/>
|
273
|
<xsl:attribute name="type">
|
274
|
<xsl:value-of select="$varSuperType"/>
|
275
|
</xsl:attribute><!-- EOSC Future: special handling of research objects from ROHub -->
|
276
|
<xsl:choose>
|
277
|
<xsl:when test="$varDataSourceId = 'fairsharing_::4119'">
|
278
|
<xsl:value-of select="vocabulary:clean(//*[local-name()='resourceType']/text(), 'dnet:publication_resource')"/>
|
279
|
</xsl:when>
|
280
|
<xsl:otherwise>
|
281
|
<xsl:value-of select="$varCobjCategory"/>
|
282
|
</xsl:otherwise>
|
283
|
</xsl:choose>
|
284
|
</dr:CobjCategory><!--
|
285
|
<dr:CobjCategory>
|
286
|
<xsl:attribute name="type" select="//oaf:datasourceprefix[. = '_______qeios' and contains(//dri:recordIdentifier, '/definition/')]/'other', //oaf:datasourceprefix[not(. = '_______qeios' and contains(//dri:recordIdentifier, '/definition/'))]/$varSuperType"/>
|
287
|
<xsl:value-of select="$varCobjCategory"/>
|
288
|
</dr:CobjCategory>
|
289
|
-->
|
290
|
</xsl:when><!-- drop journals --><!-- TODO: termination handling must refine -->
|
291
|
<xsl:when test="lower-case(//*[local-name()='resourceType']/@uri) = 'http://purl.org/coar/resource_type/c_0640'">
|
292
|
<xsl:call-template name="terminate"/>
|
293
|
</xsl:when><!--
|
294
|
<xsl:otherwise>
|
295
|
<xsl:call-template name="terminate"/>
|
296
|
</xsl:otherwise>
|
297
|
-->
|
298
|
</xsl:choose><!-- review status -->
|
299
|
<xsl:variable name="varRefereedConvt" select="for $i in ( //*[local-name()='resourceType']/(., @uri), //oai:setSpec, //*[local-name()='description']) return vocabulary:clean( normalize-space($i), 'dnet:review_levels')"/>
|
300
|
<xsl:variable name="varRefereedIdntf" select="( //*[local-name()=('identifier', 'alternateIdentifier', 'file')][count(//*[local-name()=('metadata', 'resource')]//*[local-name()=('identifier', 'alternateIdentifier', 'file')]) = 1][matches(lower-case(.), '(^|.*[\.\-_\\/\s\(\)%\d#:])pre[\.\-_\\/\s\(\)%\d#:]?prints?([\.\-_\\/\s\(\)%\d#:].*)?$')]/'0002', //*[local-name()=('identifier', 'alternateIdentifier', 'file')][count(//*[local-name()=('metadata', 'resource')]//*[local-name()=('identifier', 'alternateIdentifier', 'file')]) = 1][matches(lower-case(.), '(^|.*[\.\-_\\/\s\(\)%\d#:])refereed([\.\-_\\/\s\(\)%\d#:].*)?$')]/'0001', //*[local-name()=('identifier', 'alternateIdentifier', 'file')][count(//*[local-name()=('metadata', 'resource')]//*[local-name()=('identifier', 'alternateIdentifier', 'file')]) = 1][matches(lower-case(.), '.*-peer-reviewed-(fulltext-)?article-.*')]/'0001')"/>
|
301
|
<xsl:variable name="varRefereedSourc" select="(//*[local-name()=('publisher', 'source', 'citationTitle')][matches(lower-case(.), '.*[\s\-\.\\_/:%]pre[\s\-\.\\_/:%]?prints?([\s\-\.\\_/:%].*|$)')]/'0002')"/>
|
302
|
<xsl:variable name="varRefereedReltn" select="//*[local-name() = 'relatedIdentifier'][./@relationType/lower-case(.)='isreviewedby']/'0001'"/>
|
303
|
<xsl:variable name="varRefereedDesct" select="(//*[local-name() = 'description'] [matches(lower-case(.), '.*(this\s*book|this\s*volume|it)\s*(constitutes|presents)\s*the\s*(thoroughly\s*)?refereed') or matches(lower-case(.), '.*peer[\.\-_/\s\(\)]?review\s*under\s*responsibility\s*of.*') or matches(lower-case(.), '(this|a)\s*(article|preprint)\s*(has\s*been\s*)?(peer[\-\s]*)?reviewed\s*and\s*recommended\s*by\s*peer[\-\s]*community')]/'0001')"/>
|
304
|
<xsl:variable name="varRefereedTitle" select="(//*[local-name()=('title')][matches(lower-case(.), '.*\[.*peer[\s\-\._]*review\s*:.*\]\s*$')]/'0001')"/>
|
305
|
<xsl:variable name="varRefereedVersn" select="vocabulary:clean( normalize-space( //*[local-name()='version']), 'dnet:review_levels')"/>
|
306
|
<xsl:variable name="varRefereed" select="($varRefereedConvt, $varRefereedIdntf, $varRefereedSourc, $varRefereedReltn, $varRefereedDesct, $varRefereedTitle, $varRefereedVersn)"/>
|
307
|
<xsl:choose>
|
308
|
<xsl:when test="count($varRefereed[. = '0001']) > 0">
|
309
|
<oaf:refereed>
|
310
|
<xsl:value-of select="'0001'"/>
|
311
|
</oaf:refereed>
|
312
|
</xsl:when>
|
313
|
<xsl:when test="count($varRefereed[. = '0002']) > 0">
|
314
|
<oaf:refereed>
|
315
|
<xsl:value-of select="'0002'"/>
|
316
|
</oaf:refereed>
|
317
|
</xsl:when>
|
318
|
</xsl:choose>
|
319
|
<oaf:dateAccepted>
|
320
|
<xsl:value-of select="dateCleaner:dateISO( normalize-space(//datacite:date[@dateType = 'Issued']))"/>
|
321
|
</oaf:dateAccepted><!--
|
322
|
<oaf:accessrights>
|
323
|
<xsl:variable name='varAccessRights' select="TransformationFunction:convertString($tf, (//*[local-name() = 'rights']/(@uri, @rightsURI))[1], 'AccessRights')" />
|
324
|
</oaf:accessrights>
|
325
|
<xsl:choose>
|
326
|
<xsl:when test="not($varAccessRights = 'EMBARGO' and not((xs:date( max( ($varEmbargoEndDate, '0001-01-01') ) ) gt current-date())))">
|
327
|
<xsl:value-of select="TransformationFunction:convertString($tf, (//*[local-name() = 'rights']/(@uri, @rightsURI))[1], 'AccessRights')"/>
|
328
|
</xsl:when>
|
329
|
<xsl:when test="$varAccessRights = 'EMBARGO' and not((xs:date( max( ($varEmbargoEndDate, '0001-01-01') ) ) gt current-date()))">
|
330
|
<xsl:value-of select="'OPEN'"/>
|
331
|
</xsl:when>
|
332
|
</xsl:choose>
|
333
|
-->
|
334
|
<xsl:variable name="varAccessRights" select="string-join((for $i in ((//*[local-name() = 'rights'], //*[lower-case(local-name())='licensecondition'])/(@*, .)) return vocabulary:clean( $i, 'dnet:access_modes')), ' ')"/>
|
335
|
<oaf:accessrights>
|
336
|
<xsl:choose>
|
337
|
<xsl:when test="contains($varAccessRights, 'OPEN SOURCE')">
|
338
|
<xsl:value-of select="'OPEN SOURCE'"/>
|
339
|
</xsl:when>
|
340
|
<xsl:when test="contains($varAccessRights, 'OPEN')">
|
341
|
<xsl:value-of select="'OPEN'"/>
|
342
|
</xsl:when>
|
343
|
<xsl:when test="contains($varAccessRights, 'EMBARGO') and not((xs:date( max( ($varEmbargoEndDate, '0001-01-01') ) ) gt current-date()))">
|
344
|
<xsl:value-of select="'OPEN'"/>
|
345
|
</xsl:when>
|
346
|
<xsl:when test="contains($varAccessRights, 'EMBARGO') and (xs:date( max( ($varEmbargoEndDate, '0001-01-01') ) ) gt current-date())">
|
347
|
<xsl:value-of select="'EMBARGO'"/>
|
348
|
</xsl:when>
|
349
|
<xsl:when test="contains($varAccessRights, 'RESTRICTED')">
|
350
|
<xsl:value-of select="'RESTRICTED'"/>
|
351
|
</xsl:when>
|
352
|
<xsl:when test="contains($varAccessRights, 'CLOSED')">
|
353
|
<xsl:value-of select="'CLOSED'"/>
|
354
|
</xsl:when>
|
355
|
</xsl:choose>
|
356
|
</oaf:accessrights>
|
357
|
<xsl:for-each select="//*[local-name()='licenseCondition'] [string-length(.) > 0 or string-length(@uri) > 0] [(starts-with(@uri, 'http') and (contains(@uri, '://creativecommons.org/licenses/') or contains(@uri, '://creativecommons.org/publicdomain/') or contains(@uri, '://opensource.org/licenses/') or contains(@uri, '://opendatacommons.org/licenses/') or contains(@uri, '://rightsstatements.org/page/') or contains(@uri, '://rightsstatements.org/vocab/') or contains(@uri, '://www.opendefinition.org/licenses/') or contains(@uri, '://www.gnu.org/licenses/') or contains(@uri, '://artlibre.org/licence/') or contains(@uri, '://repositorio.uca.edu.sv/jspui/licencias/') or contains(@uri, '://bibliotecavirtual.unl.edu.ar/licencia/'))) or matches(., '^CC[- ]BY([- ](NC([- ](ND|SA))?|ND|SA))([- ]\d(\.\d)?)?$', 'i')]">
|
358
|
<oaf:license>
|
359
|
<xsl:value-of select=".[not(./@uri)], .[./@uri]/@uri"/>
|
360
|
</oaf:license>
|
361
|
</xsl:for-each>
|
362
|
<oaf:language>
|
363
|
<xsl:value-of select="vocabulary:clean( //*[local-name()='language'], 'dnet:languages')"/>
|
364
|
</oaf:language>
|
365
|
<xsl:call-template name="funding"/>
|
366
|
<oaf:hostedBy>
|
367
|
<xsl:attribute name="name">
|
368
|
<xsl:value-of select="$varOfficialName"/>
|
369
|
</xsl:attribute>
|
370
|
<xsl:attribute name="id">
|
371
|
<xsl:value-of select="$varDataSourceId"/>
|
372
|
</xsl:attribute>
|
373
|
</oaf:hostedBy>
|
374
|
<oaf:collectedFrom>
|
375
|
<xsl:attribute name="name">
|
376
|
<xsl:value-of select="$varOfficialName"/>
|
377
|
</xsl:attribute>
|
378
|
<xsl:attribute name="id">
|
379
|
<xsl:value-of select="$varDataSourceId"/>
|
380
|
</xsl:attribute>
|
381
|
</oaf:collectedFrom>
|
382
|
<xsl:for-each select="//*[local-name()='subject']">
|
383
|
<xsl:if test="starts-with(./text(), 'EOSC::')">
|
384
|
<oaf:eoscifguidelines>
|
385
|
<xsl:attribute name="code" select="./text()"/>
|
386
|
<xsl:attribute name="label" select="./text()"/>
|
387
|
<xsl:attribute name="url"/>
|
388
|
<xsl:attribute name="semanticrelation" select="string('compliesWith')"/>
|
389
|
</oaf:eoscifguidelines>
|
390
|
</xsl:if>
|
391
|
</xsl:for-each><!-- oaf:container --><!-- TODO: set @typ --><!--
|
392
|
<xsl:variable name="varCitation" select="//*[starts-with(local-name(), 'citation')]" />
|
393
|
<xsl:variable name="varSource" select="//dc:source[//oaf:datasourceprefix[.=('od______1514', 'od______3158')]]" />
|
394
|
--><!-- test
|
395
|
<xsl:if test="contains($varContainerPid, ':::')">
|
396
|
<oaf:container>
|
397
|
<xsl:for-each select="tokenize(normalize-space($varContainerPid), ' ')">
|
398
|
<xsl:attribute name="{lower-case(substring-before(., ':::'))}" select="substring-before(substring-after(., ':::'), ':::')"/>
|
399
|
<xsl:attribute name="typ" select="substring-after(substring-after(., ':::'), ':::')"/>
|
400
|
</xsl:for-each>
|
401
|
<xsl:choose>
|
402
|
<xsl:when test="lower-case(substring-before(., ':::')) = ('issn', 'pissn', 'eissn', 'lissn')">
|
403
|
<xsl:attribute name="vol" select="$varCitation[local-name(.) = 'citationVolume']"/>
|
404
|
<xsl:attribute name="iss" select="$varCitation[local-name(.) = 'citationIssue']"/>
|
405
|
<xsl:attribute name="sp" select="$varCitation[local-name(.) = 'citationStartPage']"/>
|
406
|
<xsl:attribute name="ep" select="$varCitation[local-name(.) = 'citationEndPage']"/>
|
407
|
</xsl:when>
|
408
|
<xsl:when test="lower-case(substring-before(., ':::')) = 'isbn'">
|
409
|
<xsl:attribute name="edt" select="$varCitation[local-name(.) = 'citationEdition']"/>
|
410
|
<xsl:attribute name="sp" select="$varCitation[local-name(.) = 'citationStartPage']"/>
|
411
|
<xsl:attribute name="ep" select="$varCitation[local-name(.) = 'citationEndPage']"/>
|
412
|
</xsl:when>
|
413
|
</xsl:choose>
|
414
|
<xsl:value-of select="$varCitation[local-name(.) = 'citationTitle'], $varSource" />
|
415
|
</oaf:container>
|
416
|
</xsl:if>
|
417
|
test --><!-- Huelva marks L, E ISSNs as ISSNs, with mark within field in spaces or after blanc --><!-- Qeios declares many records as text, although many seem to be definitions which are also related to 'journal' volumes/issues --><!-- oaf:fulltext--><!-- toDo: clarify if fulltext should be filled when URL given and rights oa --><!--
|
418
|
<xsl:if test="//*[local-name() = 'file']">
|
419
|
<oaf:fulltext>
|
420
|
<xsl:value-of select="//*[local-name() = 'file']"/>
|
421
|
</oaf:fulltext>
|
422
|
</xsl:if>
|
423
|
-->
|
424
|
</metadata>
|
425
|
<xsl:copy-of select="//*[local-name() = 'about']"/>
|
426
|
</record>
|
427
|
</xsl:template><!-- Remove EOSC:: subjects, they need to go to eoscifguidelines -->
|
428
|
<xsl:template match="//*[local-name()='subject' and starts-with(./text(), 'EOSC::')]"/>
|
429
|
<xsl:template match="node()|@*">
|
430
|
<xsl:copy copy-namespaces="no">
|
431
|
<xsl:apply-templates select="node()|@*"/>
|
432
|
</xsl:copy>
|
433
|
</xsl:template>
|
434
|
<xsl:template match="//*[local-name() = 'metadata']//*[local-name() = 'resource']">
|
435
|
<xsl:copy copy-namespaces="no">
|
436
|
<xsl:apply-templates select="node()|@*"/>
|
437
|
</xsl:copy>
|
438
|
</xsl:template>
|
439
|
<xsl:template name="funding"><!-- funding -->
|
440
|
<xsl:for-each select="//*[local-name()='fundingReference'][./*[local-name()='awardNumber']]">
|
441
|
<xsl:choose><!-- FP7 -->
|
442
|
<xsl:when test="(./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100004963|10.13039/100011199|10.13039/100011102)\s*$')] or (./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100000780)$')] and ./*[local-name()='fundingStream'] = ('Framework Programme Seven', 'FP7')) or (./*[local-name()='funderName'] = 'European Commission' and ./*[local-name()='fundingStream'] = ('Framework Programme Seven', 'FP7'))) and ./*[local-name()='awardNumber'][matches(., '.*(^|[^\d])\d\d\d\d\d\d($|[^\d]).*')]">
|
443
|
<oaf:projectid>
|
444
|
<xsl:value-of select="concat($varFP7, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
|
445
|
</oaf:projectid>
|
446
|
</xsl:when><!-- H2020 (Horizon 2020 Framework Programme) --><!-- -->
|
447
|
<xsl:when test="(./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100010661)\s*')] or (./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100000780)$')] and ./*[local-name()='fundingStream'] = ('Horizon 2020 Framework Programme', 'H2020')) or (./*[local-name()='funderName'] = 'European Commission' and ./*[local-name()='fundingStream'] = ('Horizon 2020 Framework Programme', 'H2020'))) and ./*[local-name()='awardNumber'][matches(., '.*(^|[^\d])\d\d\d\d\d\d($|[^\d]).*')]">
|
448
|
<oaf:projectid>
|
449
|
<xsl:value-of select="concat($varH2020, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
|
450
|
</oaf:projectid>
|
451
|
</xsl:when><!-- HE (Horizon Europe Framework Programme) --><!-- -->
|
452
|
<xsl:when test="(./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100018693)\s*')] or (./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100000780)$')] and ./*[local-name()='fundingStream'] = ('Horizon Europe Framework Programme', 'HE')) or (./*[local-name()='funderName'] = 'European Commission' and ./*[local-name()='fundingStream'] = ('Horizon Europe Framework Programme', 'HE'))) and ./*[local-name()='awardNumber'][matches(., '.*(^|[^\d])\d\d\d\d\d\d\d\d($|[^\d]).*')]">
|
453
|
<oaf:projectid>
|
454
|
<xsl:value-of select="concat($varHEUROPE, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
|
455
|
</oaf:projectid>
|
456
|
</xsl:when><!-- AKA -->
|
457
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100002341)\s*$') ] or ./*[local-name()='funderName'][contains(., 'Suomen Akatemia') or contains(., 'Academy of Finland')]">
|
458
|
<oaf:projectid>
|
459
|
<xsl:value-of select="concat($varAKA, ./*[local-name()='awardNumber'])"/>
|
460
|
</oaf:projectid>
|
461
|
</xsl:when><!-- ARC -->
|
462
|
<xsl:when test="(./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100000923)\s*$')] or ./*[local-name()='funderName'][contains(., 'Australian Research Council')]) and ./*[local-name()='awardNumber'][matches(., '^\d{6}$')]">
|
463
|
<oaf:projectid>
|
464
|
<xsl:value-of select="concat($varAKA, replace(./*[local-name()='awardNumber'], '.*(^\d{6}$).*', '$2'))"/>
|
465
|
</oaf:projectid>
|
466
|
</xsl:when><!-- CONICYT -->
|
467
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100002848)\s*$')] or ./*[local-name()='funderName'][contains(., 'Comisión Nacional de Investigación Científica y Tecnológica') or contains(., 'CONICYT')]">
|
468
|
<oaf:projectid>
|
469
|
<xsl:value-of select="concat($varCONICYT, ./*[local-name()='awardNumber'])"/>
|
470
|
</oaf:projectid>
|
471
|
</xsl:when><!-- DFG -->
|
472
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100001659)\s*$')] or ./*[local-name()='funderName'][contains(., 'Deutsche Forschungsgemeinschaft') or contains(., 'DFG') or contains(., 'Deutsche Forschungsgemeinschaft (DFG)')]">
|
473
|
<oaf:projectid>
|
474
|
<xsl:value-of select="concat($varDFG, ./*[local-name()='awardNumber'])"/>
|
475
|
</oaf:projectid>
|
476
|
</xsl:when><!----><!-- FCT -->
|
477
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100001871)\s*$')] or ./*[local-name()='funderName'][contains(., 'Fundação para a Ciência e a Tecnologia')]">
|
478
|
<oaf:projectid>
|
479
|
<xsl:value-of select="concat($varFCT, ./*[local-name()='awardNumber'])"/>
|
480
|
</oaf:projectid>
|
481
|
</xsl:when><!-- FWF -->
|
482
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100002428)\s*$')] or ./*[local-name()='funderName'][contains(., 'Fonds zur Förderung der Wissenschaftlichen Forschung') or contains(., 'Austrian Science Fund')]">
|
483
|
<oaf:projectid>
|
484
|
<xsl:if test="$varDataSourceId = 'opendoar____::2639'">
|
485
|
<xsl:attribute name="validationDate"
|
486
|
select="substring-before(//*[local-name() = 'header']/*[local-name() = 'dateOfCollection'], 'T')"
|
487
|
/>
|
488
|
</xsl:if>
|
489
|
<xsl:value-of select="concat($varFWF, translate(./*[local-name()='awardNumber'], ' ', '_'))"/>
|
490
|
</oaf:projectid>
|
491
|
</xsl:when><!-- MESTD -->
|
492
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100001871)\s*$')] or ./*[local-name()='funderName'][(contains(., 'Ministarstvo Prosvete, Nauke i Tehnolo') and contains(., 'kog Razvoja')) or contains(., 'MESTD')]">
|
493
|
<oaf:projectid>
|
494
|
<xsl:value-of select="concat($varMESTD, ./*[local-name()='awardNumber'])"/>
|
495
|
</oaf:projectid>
|
496
|
</xsl:when><!-- MZOS -->
|
497
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100006588)\s*$')] or ./*[local-name()='funderName'][contains(., 'Ministarstvo Znanosti, Obrazovanja i Sporta') or contains(., 'Ministry of Science, Education and Sports')]">
|
498
|
<oaf:projectid>
|
499
|
<xsl:value-of select="concat($varMZOS, ./*[local-name()='awardNumber'])"/>
|
500
|
</oaf:projectid>
|
501
|
</xsl:when><!-- NHMRC -->
|
502
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100000925)\s*$')] or ./*[local-name()='funderName'][contains(., 'National Health and Medical Research Council') or contains(., 'NHMRC')]">
|
503
|
<oaf:projectid>
|
504
|
<xsl:value-of select="concat($varNHMRC, ./*[local-name()='awardNumber'])"/>
|
505
|
</oaf:projectid>
|
506
|
</xsl:when><!-- NIH -->
|
507
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100000002)\s*$')] or ./*[local-name()='funderName'][contains(., 'National Institutes of Health')]">
|
508
|
<oaf:projectid>
|
509
|
<xsl:value-of select="concat($varNIH, ./*[local-name()='awardNumber'])"/>
|
510
|
</oaf:projectid>
|
511
|
</xsl:when><!-- NSF -->
|
512
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100000001)\s*$')] or ./*[local-name()='funderName'][contains(., 'National Science Foundation')]">
|
513
|
<oaf:projectid>
|
514
|
<xsl:value-of select="concat($varNSF, ./*[local-name()='awardNumber'])"/>
|
515
|
</oaf:projectid>
|
516
|
</xsl:when><!-- NWO -->
|
517
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100003246)\s*$')] or ./*[local-name()='funderName'][contains(., 'Netherlands Organisation for Scientific Research') or contains(., 'Nederlandse Organisatie voor Wetenschappelijk Onderzoek')]">
|
518
|
<oaf:projectid>
|
519
|
<xsl:value-of select="concat($varNWO, ./*[local-name()='awardNumber'])"/>
|
520
|
</oaf:projectid>
|
521
|
</xsl:when><!-- RCUK -->
|
522
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100000690)\s*$')] or ./*[local-name()='funderName'][contains(., 'Research Councils UK') or contains(., 'RCUK')]">
|
523
|
<oaf:projectid>
|
524
|
<xsl:value-of select="concat($varUKRI, ./*[local-name()='awardNumber'])"/>
|
525
|
</oaf:projectid>
|
526
|
</xsl:when><!-- SFI -->
|
527
|
<xsl:when test="(./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100001602)\s*$')] or ./*[local-name()='funderName'][contains(., 'Science Foundation Ireland')]) and ./*[local-name()='awardNumber'][matches(., '.*([\dA-Za-z\.\-]+/)+[\dA-Za-z\.\-]+.*')]">
|
528
|
<oaf:projectid>
|
529
|
<xsl:value-of select="concat($varSFI, replace(./*[local-name()='awardNumber'], '.*(^|\s)(([\dA-Za-z\.\-]+/)+[\dA-Za-z\.\-]+)($|\s).*', '$2'))"/>
|
530
|
</oaf:projectid>
|
531
|
</xsl:when><!-- SNSF -->
|
532
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100001711)\s*$')] or ./*[local-name()='funderName'][contains(., 'Swiss National Science Foundation') or contains(., 'Schweizerischer Nationalfonds zur Förderung der Wissenschaftlichen Forschung')]">
|
533
|
<oaf:projectid>
|
534
|
<xsl:value-of select="concat($varSNSF, ./*[local-name()='awardNumber'])"/>
|
535
|
</oaf:projectid>
|
536
|
</xsl:when><!-- TUBITAK -->
|
537
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100004410)\s*$')] or ./*[local-name()='funderName'][contains(., 'Turkish National Science and Research Council') or (contains(., 'Türkiye Bilimsel ve Teknolojik Ara') and contains(., 'rma Kurumu'))]">
|
538
|
<oaf:projectid>
|
539
|
<xsl:value-of select="concat($varTUBITAK, ./*[local-name()='awardNumber'])"/>
|
540
|
</oaf:projectid>
|
541
|
</xsl:when><!-- UKRI -->
|
542
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100014013)\s*$')] or ./*[local-name()='funderName'][contains(., 'UK Research and Innovation') or contains(., 'UKRI')]">
|
543
|
<oaf:projectid>
|
544
|
<xsl:value-of select="concat($varUKRI, ./*[local-name()='awardNumber'])"/>
|
545
|
</oaf:projectid>
|
546
|
</xsl:when><!-- WT -->
|
547
|
<xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100004440)\s*$')] or ./*[local-name()='funderName'][contains(., 'Wellcome Trust') or . = 'WT']">
|
548
|
<oaf:projectid>
|
549
|
<xsl:value-of select="concat($varWT, ./*[local-name()='awardNumber'])"/>
|
550
|
</oaf:projectid>
|
551
|
</xsl:when>
|
552
|
</xsl:choose>
|
553
|
</xsl:for-each>
|
554
|
</xsl:template><!-- toDo: improve by selecting all attributes -->
|
555
|
<xsl:template match="//*[local-name()='nameIdentifier']">
|
556
|
<datacite:nameIdentifier>
|
557
|
<xsl:attribute name="nameIdentifierScheme" select="./@*[local-name()=('nameIdentifierScheme')]"/>
|
558
|
<xsl:attribute name="schemeURI" select="./@*[local-name()=('schemeURI')]"/>
|
559
|
<xsl:choose>
|
560
|
<xsl:when test=".[contains(., 'orcid.org/')]">
|
561
|
<xsl:value-of select="substring-after(., 'orcid.org/')"/>
|
562
|
</xsl:when>
|
563
|
<xsl:when test=".[contains(., 'researcherid.com/rid/')]">
|
564
|
<xsl:value-of select="substring-after(., 'researcherid.com/rid/')"/>
|
565
|
</xsl:when>
|
566
|
<xsl:otherwise>
|
567
|
<xsl:value-of select="."/>
|
568
|
</xsl:otherwise>
|
569
|
</xsl:choose>
|
570
|
</datacite:nameIdentifier>
|
571
|
</xsl:template>
|
572
|
<xsl:template match="//*[local-name() = 'header']">
|
573
|
<header xmlns="HTTP://www.openarchives.org/OAI/2.0/">
|
574
|
<xsl:apply-templates select="node()|@*"/>
|
575
|
<xsl:element name="dr:dateOfTransformation">
|
576
|
<xsl:value-of select="$transDate"/>
|
577
|
</xsl:element>
|
578
|
</header>
|
579
|
</xsl:template>
|
580
|
</xsl:stylesheet>
|
581
|
</CODE>
|
582
|
</SCRIPT>
|
583
|
</CONFIGURATION>
|
584
|
<STATUS/>
|
585
|
<SECURITY_PARAMETERS/>
|
586
|
</BODY>
|
587
|
</RESOURCE_PROFILE>
|