Project

General

Profile

« Previous | Next » 

Revision 62697

Added by Alessia Bardi over 1 year ago

format

View differences:

xslt_cleaning_oaire2datacite_hadoop.xml
1 1
<RESOURCE_PROFILE>
2 2
    <HEADER>
3
        <RESOURCE_IDENTIFIER value="5c777768-c164-41aa-90f1-58d17b4b272d_VHJhbnNmb3JtYXRpb25SdWxlRFNSZXNvdXJjZXMvVHJhbnNmb3JtYXRpb25SdWxlRFNSZXNvdXJjZVR5cGU="/>
3
        <RESOURCE_IDENTIFIER
4
                value="5c777768-c164-41aa-90f1-58d17b4b272d_VHJhbnNmb3JtYXRpb25SdWxlRFNSZXNvdXJjZXMvVHJhbnNmb3JtYXRpb25SdWxlRFNSZXNvdXJjZVR5cGU="/>
4 5
        <RESOURCE_TYPE value="TransformationRuleDSResourceType"/>
5 6
        <RESOURCE_KIND value="TransformationRuleDSResources"/>
6 7
        <RESOURCE_URI value=""/>
......
14 15
            <SCRIPT>
15 16
                <TITLE>xslt_cleaning_oaire2datacite_hadoop</TITLE>
16 17
                <CODE><!-- adaptation 2021-08-23 ; ACz/UNIBI -->
17
                    <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">
18
                    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
19
                                    xmlns:oaire="http://namespace.openaire.eu/schema/oaire/"
20
                                    xmlns:vocabulary="http://eu/dnetlib/transform/clean"
21
                                    xmlns:dateCleaner="http://eu/dnetlib/transform/dateISO"
22
                                    xmlns:oaf="http://namespace.openaire.eu/oaf"
23
                                    xmlns:oai="http://www.openarchives.org/OAI/2.0/"
24
                                    xmlns:datacite="http://datacite.org/schema/kernel-4"
25
                                    xmlns:dri="http://www.driver-repository.eu/namespace/dri"
26
                                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
27
                                    xmlns:dr="http://www.driver-repository.eu/namespace/dr"
28
                                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
29
                                    xmlns:dc="http://purl.org/dc/elements/1.1/"
30
                                    exclude-result-prefixes="xsl vocabulary dateCleaner" version="2.0">
18 31
                        <xsl:param name="varOfficialName"/>
19 32
                        <xsl:param name="varDataSourceId"/>
20 33
                        <xsl:param name="varAKA" select="'aka_________::'"/>
......
44 57
                        <xsl:param name="varRSF" select="'rsf_________::'"/>
45 58
                        <xsl:param name="varSFI" select="'sfi_________::'"/>
46 59
                        <xsl:param name="varSFRS" select="'sfrs________::'"/>
47
                        <xsl:param name="varSGOV" select="'sgov________::'"/><!-- SGOV to be added, awaiting DOI from Pilar, found project ids not in CSV list? -->
60
                        <xsl:param name="varSGOV"
61
                                   select="'sgov________::'"/><!-- SGOV to be added, awaiting DOI from Pilar, found project ids not in CSV list? -->
48 62
                        <xsl:param name="varSNSF" select="'snsf________::'"/>
49
                        <xsl:param name="varTARA" select="'taraexp_____::'"/><!-- TARA to be added, awaiting DOI from André -->
63
                        <xsl:param name="varTARA"
64
                                   select="'taraexp_____::'"/><!-- TARA to be added, awaiting DOI from André -->
50 65
                        <xsl:param name="varTUBITAK" select="'tubitakf____::'"/>
51
                        <xsl:param name="varUKRI" select="'ukri________::'"/><!-- UKRI replace RCUK namespace:  'rcuk________::'  -->
66
                        <xsl:param name="varUKRI"
67
                                   select="'ukri________::'"/><!-- UKRI replace RCUK namespace:  'rcuk________::'  -->
52 68
                        <xsl:param name="varWT" select="'wt__________::'"/>
53 69
                        <xsl:param name="index" select="0"/>
54 70
                        <xsl:param name="transDate" select="current-dateTime()"/>
55 71
                        <xsl:template match="/">
56
                            <xsl:variable name="datasourcePrefix" select="normalize-space(//oaf:datasourceprefix)"/><!-- TODO: termination handling at Spark level must be refined! -->
72
                            <xsl:variable name="datasourcePrefix"
73
                                          select="normalize-space(//oaf:datasourceprefix)"/><!-- TODO: termination handling at Spark level must be refined! -->
57 74
                            <xsl:if test="//oai:header/@status='deleted'">
58 75
                                <xsl:call-template name="terminate"/>
59 76
                            </xsl:if>
......
74 91
                            </xsl:if>
75 92
                        </xsl:template>
76 93
                        <xsl:template name="validRecord">
77
                        <record>
78
                            <xsl:apply-templates select="//*[local-name() = 'header']"/>
79
                            <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) --><!--
94
                            <record>
95
                                <xsl:apply-templates select="//*[local-name() = 'header']"/>
96
                                <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) --><!--
80 97
                     <xsl:variable name='varCobjCategory' select="TransformationFunction:convertString($tf, distinct-values(//*[local-name()='resourceType'][1]/@uri), 'TextTypologies')" />
81 98
                     <xsl:variable name="varSuperType" select="TransformationFunction:convertString($tf, $varCobjCategory, 'SuperTypes')"/>
82 99
                -->
83
                                <xsl:variable name="varTypLst" select="distinct-values((//*[local-name()='resourceType']/(., @*)))"/>
84
                                <xsl:variable name="varCobjCatLst" select="distinct-values((for $i in $varTypLst      return vocabulary:clean( normalize-space($i), 'dnet:publication_resource')))"/>
85
                                <xsl:variable name="varCobjSupLst" select="for $i in $varCobjCatLst      return concat($i, '###', vocabulary:clean( normalize-space($i), 'dnet:result_typologies'))"/>
86
                                <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]"/>
87
                                <xsl:variable name="varSuperType" select="substring-after($varCobjSup, '###')"/>
88
                                <xsl:variable name="varCobjCategory" select="substring-before($varCobjSup, '###')"/><!-- ~~~~~ pre-detect, -clean, -deduplicat PIDs and store in variable ~~~~~ -->
89
                                <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 --><!--
100
                                    <xsl:variable name="varTypLst"
101
                                                  select="distinct-values((//*[local-name()='resourceType']/(., @*)))"/>
102
                                    <xsl:variable name="varCobjCatLst"
103
                                                  select="distinct-values((for $i in $varTypLst      return vocabulary:clean( normalize-space($i), 'dnet:publication_resource')))"/>
104
                                    <xsl:variable name="varCobjSupLst"
105
                                                  select="for $i in $varCobjCatLst      return concat($i, '###', vocabulary:clean( normalize-space($i), 'dnet:result_typologies'))"/>
106
                                    <xsl:variable name="varCobjSup"
107
                                                  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]"/>
108
                                    <xsl:variable name="varSuperType" select="substring-after($varCobjSup, '###')"/>
109
                                    <xsl:variable name="varCobjCategory"
110
                                                  select="substring-before($varCobjSup, '###')"/><!-- ~~~~~ pre-detect, -clean, -deduplicat PIDs and store in variable ~~~~~ -->
111
                                    <xsl:variable name="varKnownFileEndings"
112
                                                  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 --><!--
90 113
                     // covered in comparison: URL encoded baseURLs, item URL und baseURL differing only in prefix www. or postfix port
91 114
                     // 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
92 115
                     // tries to not consider higher level URLs as item URLs (e.g. journal URLs) by enforcing something after /
93 116
                -->
94
                                <xsl:variable name="varOrigBaseUrl" select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and not(./*[local-name() = 'originDescription'])]/*[local-name() = 'baseURL']"/>
95
                                <xsl:variable name="varAggrBaseUrl" select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and (./*[local-name() = 'originDescription'])]/*[local-name() = 'baseURL']"/>
96
                                <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 -->
97
                                <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:::'))"/>
98
                                <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:::'))"/>
99
                                <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:::'))"/>
100
                                <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:::'))"/>
101
                                <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:::'))"/>
102
                                <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:::'))"/>
103
                                <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:::'))"/>
104
                                <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:::'))"/>
105
                                <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:::'))"/>
106
                                <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:::'))"/>
107
                                <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:::'))"/>
108
                                <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:::'))"/>
109
                                <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:::'))"/>
110
                                <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 -->
111
                                <xsl:variable name="varPidW3id" select="concat(' w3id:::', string-join(distinct-values((                                     (//datacite:identifier)[@identifierType='w3id']/text(), ' w3id:::'))))"/><!-- heap all IDs, drop landingPage URL -->
112
                                <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="varOrigBaseUrl"
118
                                                  select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and not(./*[local-name() = 'originDescription'])]/*[local-name() = 'baseURL']"/>
119
                                    <xsl:variable name="varAggrBaseUrl"
120
                                                  select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and (./*[local-name() = 'originDescription'])]/*[local-name() = 'baseURL']"/>
121
                                    <xsl:variable name="varLandingPage"
122
                                                  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 -->
123
                                    <xsl:variable name="varPidDoi"
124
                                                  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:::'))"/>
125
                                    <xsl:variable name="varPidHandle"
126
                                                  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:::'))"/>
127
                                    <xsl:variable name="varPidUrn"
128
                                                  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:::'))"/>
129
                                    <xsl:variable name="varPidArk"
130
                                                  select="concat(' ARK:::', string-join(distinct-values((                                     (//datacite:identifier, //datacite:alternateIdentifier)[starts-with(., 'http') and contains(., '/ark:/')]/concat('ark:/', substring-after(., '/ark:/'))                                 )), ' ARK:::'))"/>
131
                                    <xsl:variable name="varPidPmid"
132
                                                  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:::'))"/>
133
                                    <xsl:variable name="varPidPmcid"
134
                                                  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:::'))"/>
135
                                    <xsl:variable name="varPidHal"
136
                                                  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:::'))"/>
137
                                    <xsl:variable name="varPidBibc"
138
                                                  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:::'))"/>
139
                                    <xsl:variable name="varPidArxiv"
140
                                                  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:::'))"/>
141
                                    <xsl:variable name="varPidWos"
142
                                                  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:::'))"/>
143
                                    <xsl:variable name="varPidScp"
144
                                                  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:::'))"/>
145
                                    <xsl:variable name="varPidUrl"
146
                                                  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:::'))"/>
147
                                    <xsl:variable name="varPidIsbn"
148
                                                  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:::'))"/>
149
                                    <xsl:variable name="varPidIssn"
150
                                                  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 -->
151
                                    <xsl:variable name="varPidW3id"
152
                                                  select="concat(' w3id:::', string-join(distinct-values((                                     (//datacite:identifier)[@identifierType='w3id']/text(), ' w3id:::'))))"/><!-- heap all IDs, drop landingPage URL -->
153
                                    <xsl:variable name="varPidPre"
154
                                                  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:::')])"/><!--
113 155
                     <xsl:variable name="varPid" select="concat($varPidPre, $varLandingPage[string-length($varPidPre) = 0]/concat('landingPage:::', .))"/>
114 156
                     <xsl:variable name="varPid" select="concat($varPidPre, concat(' landingPage:::', $varLandingPage[string-length($varPidPre) = 0], .))"/>
115 157
                -->
116
                                <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 -->
117
                                <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:::'))"/>
118
                                <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:::'))"/>
119
                                <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:::'))"/>
120
                                <xsl:variable name="varRelPidPmcid" select="concat(' PMCID:::', string-join(distinct-values((                                     (//datacite:relatedIdentifier)[lower-case(@*)='pmcid']                                     /concat(., ':::', @relationType)                                 )), ' PMCID:::'))"/>
121
                                <xsl:variable name="varRelPidArxiv" select="concat(' arXiv:::', string-join(distinct-values((                                     (//datacite:relatedIdentifier)[lower-case(@*)='arxiv']                                     /concat(., ':::', @relationType)                                 )), ' arXiv:::'))"/>
122
                                <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:::'))"/>
123
                                <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:::'))"/>
124
                                <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:::'))"/>
125
                                <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/"> -->
126
                                <datacite:resource><!-- ~~~~~ IDs ~~~~~ --><!-- choose 'best' PID among identifiers and alternateIdentifers, and cut off DOI resolver prefix to just get the number part -->
127
                                    <datacite:identifier>
128
                                        <xsl:attribute name="identifierType" select="substring-before(tokenize(normalize-space($varPid), ' ')[1], ':::')"/>
129
                                        <xsl:value-of select="substring-after(tokenize(normalize-space($varPid), ' ')[1], ':::')"/>
130
                                    </datacite:identifier>
131
                                    <datacite:alternateIdentifiers>
132
                                        <xsl:for-each select="tokenize(normalize-space($varPid), ' ')[position() &gt; 1][string-length(substring-after(., ':::')) &gt; 0]">
133
                                            <datacite:alternateIdentifier>
134
                                                <xsl:attribute name="alternateIdentifierType" select="substring-before(., ':::')"/>
135
                                                <xsl:value-of select="substring-after(., ':::')"/>
136
                                            </datacite:alternateIdentifier>
158
                                    <xsl:variable name="varPid"
159
                                                  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 -->
160
                                    <xsl:variable name="varRelPidDoi"
161
                                                  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:::'))"/>
162
                                    <xsl:variable name="varRelPidHandle"
163
                                                  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:::'))"/>
164
                                    <xsl:variable name="varRelPidPmid"
165
                                                  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:::'))"/>
166
                                    <xsl:variable name="varRelPidPmcid"
167
                                                  select="concat(' PMCID:::', string-join(distinct-values((                                     (//datacite:relatedIdentifier)[lower-case(@*)='pmcid']                                     /concat(., ':::', @relationType)                                 )), ' PMCID:::'))"/>
168
                                    <xsl:variable name="varRelPidArxiv"
169
                                                  select="concat(' arXiv:::', string-join(distinct-values((                                     (//datacite:relatedIdentifier)[lower-case(@*)='arxiv']                                     /concat(., ':::', @relationType)                                 )), ' arXiv:::'))"/>
170
                                    <xsl:variable name="varRelPidWos"
171
                                                  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:::'))"/>
172
                                    <xsl:variable name="varRelPidUrl"
173
                                                  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:::'))"/>
174
                                    <xsl:variable name="varRelPidW3id"
175
                                                  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:::'))"/>
176
                                    <xsl:variable name="varRelPid"
177
                                                  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/"> -->
178
                                    <datacite:resource><!-- ~~~~~ IDs ~~~~~ --><!-- choose 'best' PID among identifiers and alternateIdentifers, and cut off DOI resolver prefix to just get the number part -->
179
                                        <datacite:identifier>
180
                                            <xsl:attribute name="identifierType"
181
                                                           select="substring-before(tokenize(normalize-space($varPid), ' ')[1], ':::')"/>
182
                                            <xsl:value-of
183
                                                    select="substring-after(tokenize(normalize-space($varPid), ' ')[1], ':::')"/>
184
                                        </datacite:identifier>
185
                                        <datacite:alternateIdentifiers>
186
                                            <xsl:for-each
187
                                                    select="tokenize(normalize-space($varPid), ' ')[position() &gt; 1][string-length(substring-after(., ':::')) &gt; 0]">
188
                                                <datacite:alternateIdentifier>
189
                                                    <xsl:attribute name="alternateIdentifierType"
190
                                                                   select="substring-before(., ':::')"/>
191
                                                    <xsl:value-of select="substring-after(., ':::')"/>
192
                                                </datacite:alternateIdentifier>
193
                                            </xsl:for-each>
194
                                            <xsl:for-each
195
                                                    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)]">
196
                                                <datacite:alternateIdentifier>
197
                                                    <xsl:attribute name="alternateIdentifierType"
198
                                                                   select="./@*[local-name()=('identifierType', 'alternateIdentifierType')]"/>
199
                                                    <xsl:value-of select="."/>
200
                                                </datacite:alternateIdentifier>
201
                                            </xsl:for-each>
202
                                            <xsl:if test="not(starts-with(normalize-space(lower-case($varPid)), 'landingpage')) and string-length($varLandingPage) &gt; 0">
203
                                                <datacite:alternateIdentifier>
204
                                                    <xsl:attribute name="alternateIdentifierType"
205
                                                                   select="'landingPage'"/>
206
                                                    <xsl:value-of select="$varLandingPage"/>
207
                                                </datacite:alternateIdentifier>
208
                                            </xsl:if>
209
                                        </datacite:alternateIdentifiers>
210
                                        <datacite:relatedIdentifiers>
211
                                            <xsl:for-each
212
                                                    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')]">
213
                                                <datacite:relatedIdentifier>
214
                                                    <xsl:attribute name="relatedIdentifierType"
215
                                                                   select="./@relatedIdentifierType"/>
216
                                                    <xsl:attribute name="relationType" select="./@relationType"/>
217
                                                    <xsl:value-of
218
                                                            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))"/>
219
                                                </datacite:relatedIdentifier>
220
                                            </xsl:for-each>
221
                                        </datacite:relatedIdentifiers><!-- change namespace/format from oaire to datacite for description, language, rights, ... -->
222
                                        <xsl:for-each select="//oaire:resourceType">
223
                                            <datacite:resourceType>
224
                                                <xsl:attribute name="xs:anyURI" select="@uri"/>
225
                                                <xsl:value-of select="."/>
226
                                            </datacite:resourceType>
137 227
                                        </xsl:for-each>
138
                                        <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)]">
139
                                            <datacite:alternateIdentifier>
140
                                                <xsl:attribute name="alternateIdentifierType" select="./@*[local-name()=('identifierType', 'alternateIdentifierType')]"/>
228
                                        <xsl:for-each select="distinct-values(//oaire:version)">
229
                                            <datacite:version>
141 230
                                                <xsl:value-of select="."/>
142
                                            </datacite:alternateIdentifier>
231
                                            </datacite:version>
143 232
                                        </xsl:for-each>
144
                                        <xsl:if test="not(starts-with(normalize-space(lower-case($varPid)), 'landingpage')) and string-length($varLandingPage) &gt; 0">
145
                                            <datacite:alternateIdentifier>
146
                                                <xsl:attribute name="alternateIdentifierType" select="'landingPage'"/>
147
                                                <xsl:value-of select="$varLandingPage"/>
148
                                            </datacite:alternateIdentifier>
233
                                        <xsl:if test="(//datacite:rights, //oaire:licenseCondition)[string-length(.) &gt; 0 or string-length(@rightsURI) &gt; 0 or string-length(@uri) &gt; 0]">
234
                                            <datacite:rightsList>
235
                                                <xsl:for-each
236
                                                        select="(//datacite:rights | //oaire:licenseCondition)[string-length(.) &gt; 0 or string-length(@rightsURI) &gt; 0 or string-length(@uri) &gt; 0]">
237
                                                    <datacite:rights>
238
                                                        <xsl:attribute name="rightsURI" select="(@rightsURI, @uri)[1]"/>
239
                                                        <xsl:value-of select="."/>
240
                                                    </datacite:rights>
241
                                                </xsl:for-each>
242
                                            </datacite:rightsList>
149 243
                                        </xsl:if>
150
                                    </datacite:alternateIdentifiers>
151
                                    <datacite:relatedIdentifiers>
152
                                        <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')]">
153
                                            <datacite:relatedIdentifier>
154
                                                <xsl:attribute name="relatedIdentifierType" select="./@relatedIdentifierType"/>
155
                                                <xsl:attribute name="relationType" select="./@relationType"/>
156
                                                <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))"/>
157
                                            </datacite:relatedIdentifier>
244
                                        <xsl:if test="//datacite:title">
245
                                            <datacite:titles>
246
                                                <xsl:for-each select="//datacite:title">
247
                                                    <datacite:title>
248
                                                        <xsl:for-each select="@*">
249
                                                            <xsl:copy/>
250
                                                        </xsl:for-each>
251
                                                        <xsl:value-of select="."/>
252
                                                    </datacite:title>
253
                                                </xsl:for-each>
254
                                            </datacite:titles>
255
                                        </xsl:if>
256
                                        <xsl:if test="//dc:description">
257
                                            <datacite:descriptions>
258
                                                <xsl:for-each select="//dc:description">
259
                                                    <datacite:description>
260
                                                        <xsl:attribute name="descriptionType" select="'Abstract'"/>
261
                                                        <xsl:for-each select="@*">
262
                                                            <xsl:copy/>
263
                                                        </xsl:for-each>
264
                                                        <xsl:value-of select="."/>
265
                                                    </datacite:description>
266
                                                </xsl:for-each>
267
                                            </datacite:descriptions>
268
                                        </xsl:if>
269
                                        <xsl:for-each
270
                                                select="distinct-values(//dc:language)[string-length(normalize-space(.)) &gt; 0]">
271
                                            <datacite:language>
272
                                                <xsl:value-of select="normalize-space(.)"/>
273
                                            </datacite:language>
158 274
                                        </xsl:for-each>
159
                                    </datacite:relatedIdentifiers><!-- change namespace/format from oaire to datacite for description, language, rights, ... -->
160
                                    <xsl:for-each select="//oaire:resourceType">
161
                                        <datacite:resourceType>
162
                                            <xsl:attribute name="xs:anyURI" select="@uri"/>
163
                                            <xsl:value-of select="."/>
164
                                        </datacite:resourceType>
275
                                        <xsl:for-each
276
                                                select="distinct-values(//dc:publisher)[string-length(normalize-space(.)) &gt; 0]">
277
                                            <datacite:publisher>
278
                                                <xsl:value-of select="normalize-space(.)"/>
279
                                            </datacite:publisher>
280
                                        </xsl:for-each>
281
                                        <xsl:if test="//dc:format[string-length(normalize-space(.)) &gt; 0]">
282
                                            <datacite:formats>
283
                                                <xsl:for-each
284
                                                        select="distinct-values(//dc:format)[string-length(normalize-space(.)) &gt; 0]">
285
                                                    <datacite:format>
286
                                                        <xsl:value-of select="normalize-space(.)"/>
287
                                                    </datacite:format>
288
                                                </xsl:for-each>
289
                                            </datacite:formats>
290
                                        </xsl:if>
291
                                        <xsl:if test="//oaire:fundingReference[./oaire:awardNumber]">
292
                                            <datacite:fundingReferences>
293
                                                <xsl:for-each select="//oaire:fundingReference[./oaire:awardNumber]">
294
                                                    <datacite:fundingReference>
295
                                                        <datacite:funderName>
296
                                                            <xsl:value-of select="./oaire:funderName"/>
297
                                                        </datacite:funderName>
298
                                                        <datacite:funderIdentifier>
299
                                                            <xsl:attribute name="funderIdentifierType"
300
                                                                           select="'Crossref Funder ID'"/>
301
                                                            <xsl:value-of select="./oaire:funderIdentifier"/>
302
                                                        </datacite:funderIdentifier>
303
                                                        <datacite:awardNumber>
304
                                                            <xsl:value-of select="./oaire:awardNumber"/>
305
                                                        </datacite:awardNumber><!--<xsl:value-of select="."/>-->
306
                                                    </datacite:fundingReference>
307
                                                </xsl:for-each>
308
                                            </datacite:fundingReferences>
309
                                        </xsl:if>
310
                                        <xsl:apply-templates
311
                                                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> -->
312
                                    </datacite:resource><!-- ~~~~~ put oaf elements below datacite:resource ~~~~~ --><!-- oaf:identifier -->
313
                                    <xsl:for-each
314
                                            select="tokenize(normalize-space($varPid), ' ')[string-length(substring-after(normalize-space(.), ':::')) &gt; 0]">
315
                                        <oaf:identifier>
316
                                            <xsl:attribute name="identifierType"
317
                                                           select="substring-before(normalize-space(.), ':::')"/>
318
                                            <xsl:value-of select="substring-after(normalize-space(.), ':::')"/>
319
                                        </oaf:identifier>
165 320
                                    </xsl:for-each>
166
                                    <xsl:for-each select="distinct-values(//oaire:version)">
167
                                        <datacite:version>
168
                                            <xsl:value-of select="."/>
169
                                        </datacite:version>
170
                                    </xsl:for-each>
171
                                    <xsl:if test="(//datacite:rights, //oaire:licenseCondition)[string-length(.) &gt; 0 or string-length(@rightsURI) &gt; 0 or string-length(@uri) &gt; 0]">
172
                                        <datacite:rightsList>
173
                                            <xsl:for-each select="(//datacite:rights | //oaire:licenseCondition)[string-length(.) &gt; 0 or string-length(@rightsURI) &gt; 0 or string-length(@uri) &gt; 0]">
174
                                                <datacite:rights>
175
                                                    <xsl:attribute name="rightsURI" select="(@rightsURI, @uri)[1]"/>
176
                                                    <xsl:value-of select="."/>
177
                                                </datacite:rights>
178
                                            </xsl:for-each>
179
                                        </datacite:rightsList>
321
                                    <xsl:if test="not(starts-with(normalize-space(lower-case($varPid)), 'landingpage')) and string-length($varLandingPage) &gt; 0">
322
                                        <oaf:identifier>
323
                                            <xsl:attribute name="identifierType" select="'landingPage'"/>
324
                                            <xsl:value-of select="$varLandingPage"/>
325
                                        </oaf:identifier>
180 326
                                    </xsl:if>
181
                                    <xsl:if test="//datacite:title">
182
                                        <datacite:titles>
183
                                            <xsl:for-each select="//datacite:title">
184
                                                <datacite:title>
185
                                                    <xsl:for-each select="@*">
186
                                                        <xsl:copy/>
187
                                                    </xsl:for-each>
188
                                                    <xsl:value-of select="."/>
189
                                                </datacite:title>
190
                                            </xsl:for-each>
191
                                        </datacite:titles>
327
                                    <xsl:if test="//*[local-name() = 'about']/*[local-name() = 'provenance']/*[local-name() = 'originDescription']/*[local-name() = 'originDescription']/*[local-name() = 'identifier' and string-length(.) &gt; 0]">
328
                                        <oaf:identifier>
329
                                            <xsl:attribute name="identifierType" select="'oai-original'"/>
330
                                            <xsl:value-of
331
                                                    select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and not(./*[local-name() = 'originDescription'])]/*[local-name() = 'identifier']"/>
332
                                        </oaf:identifier>
192 333
                                    </xsl:if>
193
                                    <xsl:if test="//dc:description">
194
                                        <datacite:descriptions>
195
                                            <xsl:for-each select="//dc:description">
196
                                                <datacite:description>
197
                                                    <xsl:attribute name="descriptionType" select="'Abstract'"/>
198
                                                    <xsl:for-each select="@*">
199
                                                        <xsl:copy/>
200
                                                    </xsl:for-each>
201
                                                    <xsl:value-of select="."/>
202
                                                </datacite:description>
203
                                            </xsl:for-each>
204
                                        </datacite:descriptions>
205
                                    </xsl:if>
206
                                    <xsl:for-each select="distinct-values(//dc:language)[string-length(normalize-space(.)) &gt; 0]">
207
                                        <datacite:language>
208
                                            <xsl:value-of select="normalize-space(.)"/>
209
                                        </datacite:language>
210
                                    </xsl:for-each>
211
                                    <xsl:for-each select="distinct-values(//dc:publisher)[string-length(normalize-space(.)) &gt; 0]">
212
                                        <datacite:publisher>
213
                                            <xsl:value-of select="normalize-space(.)"/>
214
                                        </datacite:publisher>
215
                                    </xsl:for-each>
216
                                    <xsl:if test="//dc:format[string-length(normalize-space(.)) &gt; 0]">
217
                                        <datacite:formats>
218
                                            <xsl:for-each select="distinct-values(//dc:format)[string-length(normalize-space(.)) &gt; 0]">
219
                                                <datacite:format>
220
                                                    <xsl:value-of select="normalize-space(.)"/>
221
                                                </datacite:format>
222
                                            </xsl:for-each>
223
                                        </datacite:formats>
224
                                    </xsl:if>
225
                                    <xsl:if test="//oaire:fundingReference[./oaire:awardNumber]">
226
                                        <datacite:fundingReferences>
227
                                            <xsl:for-each select="//oaire:fundingReference[./oaire:awardNumber]">
228
                                                <datacite:fundingReference>
229
                                                    <datacite:funderName>
230
                                                        <xsl:value-of select="./oaire:funderName"/>
231
                                                    </datacite:funderName>
232
                                                    <datacite:funderIdentifier>
233
                                                        <xsl:attribute name="funderIdentifierType" select="'Crossref Funder ID'"/>
234
                                                        <xsl:value-of select="./oaire:funderIdentifier"/>
235
                                                    </datacite:funderIdentifier>
236
                                                    <datacite:awardNumber>
237
                                                        <xsl:value-of select="./oaire:awardNumber"/>
238
                                                    </datacite:awardNumber><!--<xsl:value-of select="."/>-->
239
                                                </datacite:fundingReference>
240
                                            </xsl:for-each>
241
                                        </datacite:fundingReferences>
242
                                    </xsl:if>
243
                                    <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> -->
244
                                </datacite:resource><!-- ~~~~~ put oaf elements below datacite:resource ~~~~~ --><!-- oaf:identifier -->
245
                                <xsl:for-each select="tokenize(normalize-space($varPid), ' ')[string-length(substring-after(normalize-space(.), ':::')) &gt; 0]">
246
                                    <oaf:identifier>
247
                                        <xsl:attribute name="identifierType" select="substring-before(normalize-space(.), ':::')"/>
248
                                        <xsl:value-of select="substring-after(normalize-space(.), ':::')"/>
249
                                    </oaf:identifier>
250
                                </xsl:for-each>
251
                                <xsl:if test="not(starts-with(normalize-space(lower-case($varPid)), 'landingpage')) and string-length($varLandingPage) &gt; 0">
252
                                    <oaf:identifier>
253
                                        <xsl:attribute name="identifierType" select="'landingPage'"/>
254
                                        <xsl:value-of select="$varLandingPage"/>
255
                                    </oaf:identifier>
256
                                </xsl:if>
257
                                <xsl:if test="//*[local-name() = 'about']/*[local-name() = 'provenance']/*[local-name() = 'originDescription']/*[local-name() = 'originDescription']/*[local-name() = 'identifier' and string-length(.) &gt; 0]">
258
                                    <oaf:identifier>
259
                                        <xsl:attribute name="identifierType" select="'oai-original'"/>
260
                                        <xsl:value-of select="//*[local-name() = 'about']/*[local-name() = 'provenance']//*[local-name() = 'originDescription' and not(./*[local-name() = 'originDescription'])]/*[local-name() = 'identifier']"/>
261
                                    </oaf:identifier>
262
                                </xsl:if>
263
                                <xsl:variable name="varEmbargoEndDate" select="dateCleaner:dateISO(normalize-space(//*[local-name()='date'][@dateType='Available']))"/><!-- resourceType, superType -->
264
                                <xsl:choose>
265
                                    <xsl:when test="lower-case(//*[local-name()='resourceType']/@resourceTypeGeneral) = ('dataset', 'software', 'literature', 'publication', 'other research product') or not(//*[local-name()='resourceType']/@resourceTypeGeneral)">
266
                                        <dr:CobjCategory>
267
                                            <xsl:variable name="varCobjCategory" select="vocabulary:clean( //*[local-name()='resourceType']/@resourceTypeGeneral, 'dnet:publication_resource')"/>
268
                                            <xsl:variable name="varSuperType" select="vocabulary:clean( $varCobjCategory, 'dnet:result_typologies')"/>
269
                                            <xsl:attribute name="type">
270
                                                <xsl:value-of select="$varSuperType"/>
271
                                            </xsl:attribute>
272
                                            <xsl:value-of select="$varCobjCategory"/>
273
                                        </dr:CobjCategory><!--
334
                                    <xsl:variable name="varEmbargoEndDate"
335
                                                  select="dateCleaner:dateISO(normalize-space(//*[local-name()='date'][@dateType='Available']))"/><!-- resourceType, superType -->
336
                                    <xsl:choose>
337
                                        <xsl:when
338
                                                test="lower-case(//*[local-name()='resourceType']/@resourceTypeGeneral) = ('dataset', 'software', 'literature', 'publication', 'other research product') or not(//*[local-name()='resourceType']/@resourceTypeGeneral)">
274 339
                                            <dr:CobjCategory>
340
                                                <xsl:variable name="varCobjCategory"
341
                                                              select="vocabulary:clean( //*[local-name()='resourceType']/@resourceTypeGeneral, 'dnet:publication_resource')"/>
342
                                                <xsl:variable name="varSuperType"
343
                                                              select="vocabulary:clean( $varCobjCategory, 'dnet:result_typologies')"/>
344
                                                <xsl:attribute name="type">
345
                                                    <xsl:value-of select="$varSuperType"/>
346
                                                </xsl:attribute>
347
                                                <xsl:value-of select="$varCobjCategory"/>
348
                                            </dr:CobjCategory><!--
349
                                            <dr:CobjCategory>
275 350
                                                <xsl:attribute name="type" select="//oaf:datasourceprefix[. = '_______qeios' and contains(//dri:recordIdentifier, '/definition/')]/'other', //oaf:datasourceprefix[not(. = '_______qeios' and contains(//dri:recordIdentifier, '/definition/'))]/$varSuperType"/>
276 351
                                                <xsl:value-of select="$varCobjCategory"/>
277 352
                                            </dr:CobjCategory>
278 353
-->
279
                                    </xsl:when><!-- drop journals --><!--  TODO: termination handling must refine -->
280
                                    <xsl:when test="lower-case(//*[local-name()='resourceType']/@uri) = 'http://purl.org/coar/resource_type/c_0640'">
281
                                        <xsl:call-template name="terminate"/>
282
                                    </xsl:when><!--
354
                                        </xsl:when><!-- drop journals --><!--  TODO: termination handling must refine -->
355
                                        <xsl:when
356
                                                test="lower-case(//*[local-name()='resourceType']/@uri) = 'http://purl.org/coar/resource_type/c_0640'">
357
                                            <xsl:call-template name="terminate"/>
358
                                        </xsl:when><!--
283 359
                                        <xsl:otherwise>
284 360
                                            <xsl:call-template name="terminate"/>
285 361
                                        </xsl:otherwise>
286 362
-->
287
                                </xsl:choose><!-- review status -->
288
                                <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')"/>
289
                                <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')"/>
290
                                <xsl:variable name="varRefereedSourc" select="(//*[local-name()=('publisher', 'source', 'citationTitle')][matches(lower-case(.), '.*[\s\-\.\\_/:%]pre[\s\-\.\\_/:%]?prints?([\s\-\.\\_/:%].*|$)')]/'0002')"/>
291
                                <xsl:variable name="varRefereedReltn" select="//*[local-name() = 'relatedIdentifier'][./@relationType/lower-case(.)='isreviewedby']/'0001'"/>
292
                                <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')"/>
293
                                <xsl:variable name="varRefereedTitle" select="(//*[local-name()=('title')][matches(lower-case(.), '.*\[.*peer[\s\-\._]*review\s*:.*\]\s*$')]/'0001')"/>
294
                                <xsl:variable name="varRefereedVersn" select="vocabulary:clean( normalize-space( //*[local-name()='version']), 'dnet:review_levels')"/>
295
                                <xsl:variable name="varRefereed" select="($varRefereedConvt, $varRefereedIdntf, $varRefereedSourc, $varRefereedReltn, $varRefereedDesct, $varRefereedTitle, $varRefereedVersn)"/>
296
                                <xsl:choose>
297
                                    <xsl:when test="count($varRefereed[. = '0001']) &gt; 0">
298
                                        <oaf:refereed>
299
                                            <xsl:value-of select="'0001'"/>
300
                                        </oaf:refereed>
301
                                    </xsl:when>
302
                                    <xsl:when test="count($varRefereed[. = '0002']) &gt; 0">
303
                                        <oaf:refereed>
304
                                            <xsl:value-of select="'0002'"/>
305
                                        </oaf:refereed>
306
                                    </xsl:when>
307
                                </xsl:choose>
308
                                <oaf:dateAccepted>
309
                                    <xsl:value-of select="dateCleaner:dateISO( normalize-space(//datacite:date[@dateType = 'Issued']))"/>
310
                                </oaf:dateAccepted><!--
363
                                    </xsl:choose><!-- review status -->
364
                                    <xsl:variable name="varRefereedConvt"
365
                                                  select="for $i in (                             //*[local-name()='resourceType']/(., @uri), //oai:setSpec, //*[local-name()='description'])                      return vocabulary:clean( normalize-space($i), 'dnet:review_levels')"/>
366
                                    <xsl:variable name="varRefereedIdntf"
367
                                                  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')"/>
368
                                    <xsl:variable name="varRefereedSourc"
369
                                                  select="(//*[local-name()=('publisher', 'source', 'citationTitle')][matches(lower-case(.), '.*[\s\-\.\\_/:%]pre[\s\-\.\\_/:%]?prints?([\s\-\.\\_/:%].*|$)')]/'0002')"/>
370
                                    <xsl:variable name="varRefereedReltn"
371
                                                  select="//*[local-name() = 'relatedIdentifier'][./@relationType/lower-case(.)='isreviewedby']/'0001'"/>
372
                                    <xsl:variable name="varRefereedDesct"
373
                                                  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')"/>
374
                                    <xsl:variable name="varRefereedTitle"
375
                                                  select="(//*[local-name()=('title')][matches(lower-case(.), '.*\[.*peer[\s\-\._]*review\s*:.*\]\s*$')]/'0001')"/>
376
                                    <xsl:variable name="varRefereedVersn"
377
                                                  select="vocabulary:clean( normalize-space( //*[local-name()='version']), 'dnet:review_levels')"/>
378
                                    <xsl:variable name="varRefereed"
379
                                                  select="($varRefereedConvt, $varRefereedIdntf, $varRefereedSourc, $varRefereedReltn, $varRefereedDesct, $varRefereedTitle, $varRefereedVersn)"/>
380
                                    <xsl:choose>
381
                                        <xsl:when test="count($varRefereed[. = '0001']) &gt; 0">
382
                                            <oaf:refereed>
383
                                                <xsl:value-of select="'0001'"/>
384
                                            </oaf:refereed>
385
                                        </xsl:when>
386
                                        <xsl:when test="count($varRefereed[. = '0002']) &gt; 0">
387
                                            <oaf:refereed>
388
                                                <xsl:value-of select="'0002'"/>
389
                                            </oaf:refereed>
390
                                        </xsl:when>
391
                                    </xsl:choose>
392
                                    <oaf:dateAccepted>
393
                                        <xsl:value-of
394
                                                select="dateCleaner:dateISO( normalize-space(//datacite:date[@dateType = 'Issued']))"/>
395
                                    </oaf:dateAccepted><!--
311 396
                     <oaf:accessrights>
312 397
                     <xsl:variable name='varAccessRights' select="TransformationFunction:convertString($tf, (//*[local-name() = 'rights']/(@uri, @rightsURI))[1], 'AccessRights')" />
313 398
                     </oaf:accessrights>
......
320 405
                     </xsl:when>
321 406
                     </xsl:choose>
322 407
                -->
323
                                <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')), ' ')"/>
324
                                <oaf:accessrights>
325
                                    <xsl:choose>
326
                                        <xsl:when test="contains($varAccessRights, 'OPEN SOURCE')">
327
                                            <xsl:value-of select="'OPEN SOURCE'"/>
328
                                        </xsl:when>
329
                                        <xsl:when test="contains($varAccessRights, 'OPEN')">
330
                                            <xsl:value-of select="'OPEN'"/>
331
                                        </xsl:when>
332
                                        <xsl:when test="contains($varAccessRights, 'EMBARGO') and not((xs:date( max( ($varEmbargoEndDate, '0001-01-01') ) ) gt current-date()))">
333
                                            <xsl:value-of select="'OPEN'"/>
334
                                        </xsl:when>
335
                                        <xsl:when test="contains($varAccessRights, 'EMBARGO') and (xs:date( max( ($varEmbargoEndDate, '0001-01-01') ) ) gt current-date())">
336
                                            <xsl:value-of select="'EMBARGO'"/>
337
                                        </xsl:when>
338
                                        <xsl:when test="contains($varAccessRights, 'RESTRICTED')">
339
                                            <xsl:value-of select="'RESTRICTED'"/>
340
                                        </xsl:when>
341
                                        <xsl:when test="contains($varAccessRights, 'CLOSED')">
342
                                            <xsl:value-of select="'CLOSED'"/>
343
                                        </xsl:when>
344
                                    </xsl:choose>
345
                                </oaf:accessrights>
346
                                <xsl:for-each select="//*[local-name()='licenseCondition']                     [string-length(.) &gt; 0 or string-length(@uri) &gt; 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')]">
347
                                    <oaf:license>
348
                                        <xsl:value-of select=".[not(./@uri)], .[./@uri]/@uri"/>
349
                                    </oaf:license>
350
                                </xsl:for-each>
351
                                <oaf:language>
352
                                    <xsl:value-of select="vocabulary:clean( //*[local-name()='language'], 'dnet:languages')"/>
353
                                </oaf:language>
354
                                <xsl:call-template name="funding"/>
355
                                <oaf:hostedBy>
356
                                    <xsl:attribute name="name">
357
                                        <xsl:value-of select="$varOfficialName"/>
358
                                    </xsl:attribute>
359
                                    <xsl:attribute name="id">
360
                                        <xsl:value-of select="$varDataSourceId"/>
361
                                    </xsl:attribute>
362
                                </oaf:hostedBy>
363
                                <oaf:collectedFrom>
364
                                    <xsl:attribute name="name">
365
                                        <xsl:value-of select="$varOfficialName"/>
366
                                    </xsl:attribute>
367
                                    <xsl:attribute name="id">
368
                                        <xsl:value-of select="$varDataSourceId"/>
369
                                    </xsl:attribute>
370
                                </oaf:collectedFrom>
371
                                <xsl:for-each select="//*[local-name()='subject']">
372
                                    <xsl:if test="starts-with(./text(), 'EOSC::')">
373
                                        <oaf:eoscifguidelines>
374
                                            <xsl:attribute name="code" select="./text()"/>
375
                                            <xsl:attribute name="label" select="./text()"/>
376
                                            <xsl:attribute name="url"/>
377
                                            <xsl:attribute name="semanticrelation" select="string('compliesWith')"/>
378
                                        </oaf:eoscifguidelines>
379
                                    </xsl:if>
380
                                </xsl:for-each>
381
                                <!-- oaf:container --><!-- TODO: set @typ --><!--
408
                                    <xsl:variable name="varAccessRights"
409
                                                  select="string-join((for $i in ((//*[local-name() = 'rights'], //*[lower-case(local-name())='licensecondition'])/(@*, .)) return  vocabulary:clean( $i, 'dnet:access_modes')), ' ')"/>
410
                                    <oaf:accessrights>
411
                                        <xsl:choose>
412
                                            <xsl:when test="contains($varAccessRights, 'OPEN SOURCE')">
413
                                                <xsl:value-of select="'OPEN SOURCE'"/>
414
                                            </xsl:when>
415
                                            <xsl:when test="contains($varAccessRights, 'OPEN')">
416
                                                <xsl:value-of select="'OPEN'"/>
417
                                            </xsl:when>
418
                                            <xsl:when
419
                                                    test="contains($varAccessRights, 'EMBARGO') and not((xs:date( max( ($varEmbargoEndDate, '0001-01-01') ) ) gt current-date()))">
420
                                                <xsl:value-of select="'OPEN'"/>
421
                                            </xsl:when>
422
                                            <xsl:when
423
                                                    test="contains($varAccessRights, 'EMBARGO') and (xs:date( max( ($varEmbargoEndDate, '0001-01-01') ) ) gt current-date())">
424
                                                <xsl:value-of select="'EMBARGO'"/>
425
                                            </xsl:when>
426
                                            <xsl:when test="contains($varAccessRights, 'RESTRICTED')">
427
                                                <xsl:value-of select="'RESTRICTED'"/>
428
                                            </xsl:when>
429
                                            <xsl:when test="contains($varAccessRights, 'CLOSED')">
430
                                                <xsl:value-of select="'CLOSED'"/>
431
                                            </xsl:when>
432
                                        </xsl:choose>
433
                                    </oaf:accessrights>
434
                                    <xsl:for-each
435
                                            select="//*[local-name()='licenseCondition']                     [string-length(.) &gt; 0 or string-length(@uri) &gt; 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')]">
436
                                        <oaf:license>
437
                                            <xsl:value-of select=".[not(./@uri)], .[./@uri]/@uri"/>
438
                                        </oaf:license>
439
                                    </xsl:for-each>
440
                                    <oaf:language>
441
                                        <xsl:value-of
442
                                                select="vocabulary:clean( //*[local-name()='language'], 'dnet:languages')"/>
443
                                    </oaf:language>
444
                                    <xsl:call-template name="funding"/>
445
                                    <oaf:hostedBy>
446
                                        <xsl:attribute name="name">
447
                                            <xsl:value-of select="$varOfficialName"/>
448
                                        </xsl:attribute>
449
                                        <xsl:attribute name="id">
450
                                            <xsl:value-of select="$varDataSourceId"/>
451
                                        </xsl:attribute>
452
                                    </oaf:hostedBy>
453
                                    <oaf:collectedFrom>
454
                                        <xsl:attribute name="name">
455
                                            <xsl:value-of select="$varOfficialName"/>
456
                                        </xsl:attribute>
457
                                        <xsl:attribute name="id">
458
                                            <xsl:value-of select="$varDataSourceId"/>
459
                                        </xsl:attribute>
460
                                    </oaf:collectedFrom>
461
                                    <xsl:for-each select="//*[local-name()='subject']">
462
                                        <xsl:if test="starts-with(./text(), 'EOSC::')">
463
                                            <oaf:eoscifguidelines>
464
                                                <xsl:attribute name="code" select="./text()"/>
465
                                                <xsl:attribute name="label" select="./text()"/>
466
                                                <xsl:attribute name="url"/>
467
                                                <xsl:attribute name="semanticrelation" select="string('compliesWith')"/>
468
                                            </oaf:eoscifguidelines>
469
                                        </xsl:if>
470
                                    </xsl:for-each>
471
                                    <!-- oaf:container --><!-- TODO: set @typ --><!--
382 472
                <xsl:variable name="varCitation" select="//*[starts-with(local-name(), 'citation')]" />
383 473
                <xsl:variable name="varSource" select="//dc:source[//oaf:datasourceprefix[.=('od______1514', 'od______3158')]]" />
384 474
--><!-- test
......
411 501
                     </oaf:fulltext>
412 502
                     </xsl:if>
413 503
                -->
414
                            </metadata>
415
                            <xsl:copy-of select="//*[local-name() = 'about']"/>
416
                        </record>
504
                                </metadata>
505
                                <xsl:copy-of select="//*[local-name() = 'about']"/>
506
                            </record>
417 507
                        </xsl:template>
418 508
                        <!-- Remove EOSC:: subjects, they need to go to eoscifguidelines  -->
419 509
                        <xsl:template match="//*[local-name()='subject' and starts-with(./text(), 'EOSC::')]"/>
......
428 518
                            </xsl:copy>
429 519
                        </xsl:template>
430 520
                        <xsl:template name="funding"><!-- funding -->
431
                            <xsl:for-each select="//*[local-name()='fundingReference'][./*[local-name()='awardNumber']]">
521
                            <xsl:for-each
522
                                    select="//*[local-name()='fundingReference'][./*[local-name()='awardNumber']]">
432 523
                                <xsl:choose><!-- FP7 -->
433
                                    <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]).*')]">
524
                                    <xsl:when
525
                                            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]).*')]">
434 526
                                        <oaf:projectid>
435
                                            <xsl:value-of select="concat($varFP7, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
527
                                            <xsl:value-of
528
                                                    select="concat($varFP7, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
436 529
                                        </oaf:projectid>
437 530
                                    </xsl:when><!-- H2020 (Horizon 2020 Framework Programme) --><!-- -->
438
                                    <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]).*')]">
531
                                    <xsl:when
532
                                            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]).*')]">
439 533
                                        <oaf:projectid>
440
                                            <xsl:value-of select="concat($varH2020, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
534
                                            <xsl:value-of
535
                                                    select="concat($varH2020, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
441 536
                                        </oaf:projectid>
442 537
                                    </xsl:when><!-- HE (Horizon Europe Framework Programme) --><!-- -->
443
                                    <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]).*')]">
538
                                    <xsl:when
539
                                            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]).*')]">
444 540
                                        <oaf:projectid>
445
                                            <xsl:value-of select="concat($varHEUROPE, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
541
                                            <xsl:value-of
542
                                                    select="concat($varHEUROPE, replace(./*[local-name()='awardNumber'], '.*(^|[^\d])(\d\d\d\d\d\d\d\d)($|[^\d]).*', '$2'))"/>
446 543
                                        </oaf:projectid>
447 544
                                    </xsl:when><!-- AKA -->
448
                                    <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')]">
545
                                    <xsl:when
546
                                            test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100002341)\s*$') ]                     or ./*[local-name()='funderName'][contains(., 'Suomen Akatemia') or contains(., 'Academy of Finland')]">
449 547
                                        <oaf:projectid>
450 548
                                            <xsl:value-of select="concat($varAKA, ./*[local-name()='awardNumber'])"/>
451 549
                                        </oaf:projectid>
452 550
                                    </xsl:when><!-- ARC -->
453
                                    <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}$')]">
551
                                    <xsl:when
552
                                            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}$')]">
454 553
                                        <oaf:projectid>
455
                                            <xsl:value-of select="concat($varAKA, replace(./*[local-name()='awardNumber'], '.*(^\d{6}$).*', '$2'))"/>
554
                                            <xsl:value-of
555
                                                    select="concat($varAKA, replace(./*[local-name()='awardNumber'], '.*(^\d{6}$).*', '$2'))"/>
456 556
                                        </oaf:projectid>
457 557
                                    </xsl:when><!-- CONICYT -->
458
                                    <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')]">
558
                                    <xsl:when
559
                                            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')]">
459 560
                                        <oaf:projectid>
460
                                            <xsl:value-of select="concat($varCONICYT, ./*[local-name()='awardNumber'])"/>
561
                                            <xsl:value-of
562
                                                    select="concat($varCONICYT, ./*[local-name()='awardNumber'])"/>
461 563
                                        </oaf:projectid>
462 564
                                    </xsl:when><!-- DFG -->
463
                                    <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)')]">
565
                                    <xsl:when
566
                                            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)')]">
464 567
                                        <oaf:projectid>
465 568
                                            <xsl:value-of select="concat($varDFG, ./*[local-name()='awardNumber'])"/>
466 569
                                        </oaf:projectid>
467 570
                                    </xsl:when><!----><!-- FCT -->
468
                                    <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')]">
571
                                    <xsl:when
572
                                            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')]">
469 573
                                        <oaf:projectid>
470 574
                                            <xsl:value-of select="concat($varFCT, ./*[local-name()='awardNumber'])"/>
471 575
                                        </oaf:projectid>
472 576
                                    </xsl:when><!-- FWF -->
473
                                    <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')]">
577
                                    <xsl:when
578
                                            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')]">
474 579
                                        <oaf:projectid>
475 580
                                            <xsl:value-of select="concat($varFCT, ./*[local-name()='awardNumber'])"/>
476 581
                                        </oaf:projectid>
477 582
                                    </xsl:when><!-- MESTD -->
478
                                    <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')]">
583
                                    <xsl:when
584
                                            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')]">
479 585
                                        <oaf:projectid>
480 586
                                            <xsl:value-of select="concat($varMESTD, ./*[local-name()='awardNumber'])"/>
481 587
                                        </oaf:projectid>
482 588
                                    </xsl:when><!-- MZOS -->
483
                                    <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')]">
589
                                    <xsl:when
590
                                            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')]">
484 591
                                        <oaf:projectid>
485 592
                                            <xsl:value-of select="concat($varMZOS, ./*[local-name()='awardNumber'])"/>
486 593
                                        </oaf:projectid>
487 594
                                    </xsl:when><!-- NHMRC -->
488
                                    <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')]">
595
                                    <xsl:when
596
                                            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')]">
489 597
                                        <oaf:projectid>
490 598
                                            <xsl:value-of select="concat($varNHMRC, ./*[local-name()='awardNumber'])"/>
491 599
                                        </oaf:projectid>
492 600
                                    </xsl:when><!-- NIH -->
493
                                    <xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100000002)\s*$')]                     or ./*[local-name()='funderName'][contains(., 'National Institutes of Health')]">
601
                                    <xsl:when
602
                                            test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100000002)\s*$')]                     or ./*[local-name()='funderName'][contains(., 'National Institutes of Health')]">
494 603
                                        <oaf:projectid>
495 604
                                            <xsl:value-of select="concat($varNIH, ./*[local-name()='awardNumber'])"/>
496 605
                                        </oaf:projectid>
497 606
                                    </xsl:when><!-- NSF -->
498
                                    <xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100000001)\s*$')]                      or ./*[local-name()='funderName'][contains(., 'National Science Foundation')]">
607
                                    <xsl:when
608
                                            test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100000001)\s*$')]                      or ./*[local-name()='funderName'][contains(., 'National Science Foundation')]">
499 609
                                        <oaf:projectid>
500 610
                                            <xsl:value-of select="concat($varNSF, ./*[local-name()='awardNumber'])"/>
501 611
                                        </oaf:projectid>
502 612
                                    </xsl:when><!-- NWO -->
503
                                    <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')]">
613
                                    <xsl:when
614
                                            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')]">
504 615
                                        <oaf:projectid>
505 616
                                            <xsl:value-of select="concat($varNWO, ./*[local-name()='awardNumber'])"/>
506 617
                                        </oaf:projectid>
507 618
                                    </xsl:when><!-- RCUK -->
508
                                    <xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100000690)\s*$')]                      or ./*[local-name()='funderName'][contains(., 'Research Councils UK') or contains(., 'RCUK')]">
619
                                    <xsl:when
620
                                            test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/501100000690)\s*$')]                      or ./*[local-name()='funderName'][contains(., 'Research Councils UK') or contains(., 'RCUK')]">
509 621
                                        <oaf:projectid>
510 622
                                            <xsl:value-of select="concat($varUKRI, ./*[local-name()='awardNumber'])"/>
511 623
                                        </oaf:projectid>
512 624
                                    </xsl:when><!-- SFI -->
513
                                    <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\.\-]+.*')]">
625
                                    <xsl:when
626
                                            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\.\-]+.*')]">
514 627
                                        <oaf:projectid>
515
                                            <xsl:value-of select="concat($varSFI, replace(./*[local-name()='awardNumber'], '.*(^|\s)(([\dA-Za-z\.\-]+/)+[\dA-Za-z\.\-]+)($|\s).*', '$2'))"/>
628
                                            <xsl:value-of
629
                                                    select="concat($varSFI, replace(./*[local-name()='awardNumber'], '.*(^|\s)(([\dA-Za-z\.\-]+/)+[\dA-Za-z\.\-]+)($|\s).*', '$2'))"/>
516 630
                                        </oaf:projectid>
517 631
                                    </xsl:when><!-- SNSF -->
518
                                    <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')]">
632
                                    <xsl:when
633
                                            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')]">
519 634
                                        <oaf:projectid>
520 635
                                            <xsl:value-of select="concat($varSNSF, ./*[local-name()='awardNumber'])"/>
521 636
                                        </oaf:projectid>
522 637
                                    </xsl:when><!-- TUBITAK -->
523
                                    <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'))]">
638
                                    <xsl:when
639
                                            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'))]">
524 640
                                        <oaf:projectid>
525
                                            <xsl:value-of select="concat($varTUBITAK, ./*[local-name()='awardNumber'])"/>
641
                                            <xsl:value-of
642
                                                    select="concat($varTUBITAK, ./*[local-name()='awardNumber'])"/>
526 643
                                        </oaf:projectid>
527 644
                                    </xsl:when><!-- UKRI -->
528
                                    <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')]">
645
                                    <xsl:when
646
                                            test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100014013)\s*$')]                      or ./*[local-name()='funderName'][contains(., 'UK Research and Innovation') or contains(., 'UKRI')]">
529 647
                                        <oaf:projectid>
530 648
                                            <xsl:value-of select="concat($varUKRI, ./*[local-name()='awardNumber'])"/>
531 649
                                        </oaf:projectid>
532 650
                                    </xsl:when><!-- WT -->
533
                                    <xsl:when test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100004440)\s*$')]                      or ./*[local-name()='funderName'][contains(., 'Wellcome Trust') or . = 'WT']">
651
                                    <xsl:when
652
                                            test="./*[local-name()='funderIdentifier'][matches(., '.*(doi.org/)?(10.13039/100004440)\s*$')]                      or ./*[local-name()='funderName'][contains(., 'Wellcome Trust') or . = 'WT']">
534 653
                                        <oaf:projectid>
535 654
                                            <xsl:value-of select="concat($varWT, ./*[local-name()='awardNumber'])"/>
536 655
                                        </oaf:projectid>
......
540 659
                        </xsl:template><!-- toDo: improve by selecting all attributes -->
541 660
                        <xsl:template match="//*[local-name()='nameIdentifier']">
542 661
                            <datacite:nameIdentifier>
543
                                <xsl:attribute name="nameIdentifierScheme" select="./@*[local-name()=('nameIdentifierScheme')]"/>
662
                                <xsl:attribute name="nameIdentifierScheme"
663
                                               select="./@*[local-name()=('nameIdentifierScheme')]"/>
544 664
                                <xsl:attribute name="schemeURI" select="./@*[local-name()=('schemeURI')]"/>
545 665
                                <xsl:choose>
546 666
                                    <xsl:when test=".[contains(., 'orcid.org/')]">

Also available in: Unified diff