stash-wrapper 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +46 -0
- data/.rubocop.yml +24 -0
- data/.ruby-version +1 -0
- data/.travis.yml +2 -0
- data/.yardopts +1 -0
- data/CHANGES.md +7 -0
- data/Gemfile +3 -0
- data/LICENSE.md +22 -0
- data/README.md +230 -0
- data/Rakefile +47 -0
- data/data/kernel3_to_oaidc.xsl +220 -0
- data/example.rb +52 -0
- data/lib/stash/wrapper.rb +6 -0
- data/lib/stash/wrapper/descriptive_node.rb +38 -0
- data/lib/stash/wrapper/embargo.rb +30 -0
- data/lib/stash/wrapper/embargo_type.rb +10 -0
- data/lib/stash/wrapper/identifier.rb +21 -0
- data/lib/stash/wrapper/identifier_type.rb +13 -0
- data/lib/stash/wrapper/inventory.rb +22 -0
- data/lib/stash/wrapper/license.rb +30 -0
- data/lib/stash/wrapper/module_info.rb +13 -0
- data/lib/stash/wrapper/size.rb +23 -0
- data/lib/stash/wrapper/size_unit.rb +11 -0
- data/lib/stash/wrapper/stash_administrative.rb +33 -0
- data/lib/stash/wrapper/stash_file.rb +57 -0
- data/lib/stash/wrapper/stash_wrapper.rb +130 -0
- data/lib/stash/wrapper/version.rb +24 -0
- data/spec/.rubocop.yml +7 -0
- data/spec/data/metadata.xsd +380 -0
- data/spec/data/wrapper/mrtoai-wrapper.xml +73 -0
- data/spec/data/wrapper/stash_wrapper.xsd +322 -0
- data/spec/data/wrapper/wrapper-1.xml +56 -0
- data/spec/data/wrapper/wrapper-2-payload.xml +88 -0
- data/spec/data/wrapper/wrapper-2.xml +164 -0
- data/spec/rspec_custom_matchers.rb +69 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/unit/stash/wrapper/stash_wrapper_spec.rb +239 -0
- data/stash-wrapper.gemspec +39 -0
- metadata +245 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0b9b2b3b3b61546cb479b5641e250d4494daee32
|
4
|
+
data.tar.gz: 88c5ce1cab8a9868b69b0905cb848346b3bebe33
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ca3ccf0129d471e5d3c92625784cdc03d4221c9691ea943e75ff73f354773c7082d92425cc16e6545056036165b9d9062376e20dd2044a5f43ae1de3830ab26c
|
7
|
+
data.tar.gz: 93c73e6f99e009f811618145daa9b90820d094257b17f39cafac5f5c934584ab81d4efdc5a6c124e41a406c0aa5e41568e2f679d34f7b0154cf8349c9074c18d
|
data/.gitignore
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Ruby defaults
|
2
|
+
|
3
|
+
/.bundle/
|
4
|
+
/.yardoc
|
5
|
+
/Gemfile.lock
|
6
|
+
/_yardoc/
|
7
|
+
/coverage/
|
8
|
+
/doc/
|
9
|
+
/pkg/
|
10
|
+
/spec/reports/
|
11
|
+
/tmp/
|
12
|
+
*.bundle
|
13
|
+
*.so
|
14
|
+
*.o
|
15
|
+
*.a
|
16
|
+
mkmf.log
|
17
|
+
|
18
|
+
# Built gem
|
19
|
+
|
20
|
+
*.gem
|
21
|
+
|
22
|
+
# Database
|
23
|
+
|
24
|
+
db/*.sqlite3
|
25
|
+
|
26
|
+
# Logs
|
27
|
+
|
28
|
+
/log/
|
29
|
+
|
30
|
+
# IntellJ
|
31
|
+
|
32
|
+
*.iml
|
33
|
+
*.ipr
|
34
|
+
*.iws
|
35
|
+
*.ids
|
36
|
+
.rakeTasks
|
37
|
+
|
38
|
+
# Emacs
|
39
|
+
|
40
|
+
*~
|
41
|
+
\#*
|
42
|
+
.#*
|
43
|
+
|
44
|
+
# Mac OS
|
45
|
+
|
46
|
+
.DS_Store
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Disable compact style check for example.rb
|
2
|
+
Style/ClassAndModuleChildren:
|
3
|
+
Exclude:
|
4
|
+
- 'example.rb'
|
5
|
+
|
6
|
+
# Disable line-length check; it's too easy for the cure to be worse than the disease
|
7
|
+
Metrics/LineLength:
|
8
|
+
Enabled: False
|
9
|
+
|
10
|
+
# Disable problematic module documentation check (see https://github.com/bbatsov/rubocop/issues/947)
|
11
|
+
Style/Documentation:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
# Allow one line around class body (Style/EmptyLines will still disallow two or more)
|
15
|
+
Style/EmptyLinesAroundClassBody:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
# Allow one line around module body (Style/EmptyLines will still disallow two or more)
|
19
|
+
Style/EmptyLinesAroundModuleBody:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
# Allow one line around block body (Style/EmptyLines will still disallow two or more)
|
23
|
+
Style/EmptyLinesAroundBlockBody:
|
24
|
+
Enabled: false
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.2.3
|
data/.travis.yml
ADDED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--markup markdown
|
data/CHANGES.md
ADDED
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 The Regents of the University of California
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,230 @@
|
|
1
|
+
# stash-wrapper
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/CDLUC3/stash-wrapper.svg?branch=master)](https://travis-ci.org/CDLUC3/stash-wrapper)
|
4
|
+
[![Code Climate](https://codeclimate.com/github/CDLUC3/stash-wrapper.svg)](https://codeclimate.com/github/CDLUC3/stash-wrapper)
|
5
|
+
[![Inline docs](http://inch-ci.org/github/CDLUC3/stash-wrapper.svg)](http://inch-ci.org/github/CDLUC3/stash-wrapper)
|
6
|
+
[![Gem Version](https://img.shields.io/gem/v/stash-wrapper.svg)](https://github.com/CDLUC3/stash-wrapper/releases)
|
7
|
+
|
8
|
+
Gem for working with the [Stash](https://github.com/CDLUC3/stash)
|
9
|
+
[XML wrapper format](https://dash.cdlib.org/stash_wrapper/stash_wrapper.xsd).
|
10
|
+
|
11
|
+
The `StashWrapper` object graph mostly mirrors the `stash_wrapper` schema, though some
|
12
|
+
simpler elements have been collapsed into object attributes. Also, some classes and
|
13
|
+
attributes have slightly different names from the corresponding XML attributes in order
|
14
|
+
to avoid colliding with Ruby keywords (e.g. `end` ⇒ `end_date`) or standard types
|
15
|
+
(e.g. `file` ⇒ `StashFile`).
|
16
|
+
|
17
|
+
| Schema element | Corresponding class or field | Attribute type |
|
18
|
+
| -------------- | ------------------- | ---- |
|
19
|
+
| `<st:stash_wrapper>` | `StashWrapper` | |
|
20
|
+
| `<st:identifier>` | `Identifier` | |
|
21
|
+
| `<st:stash_administrative>` | `StashAdministrative` | |
|
22
|
+
| `<st:version>` | `Version` | |
|
23
|
+
| `<st:version_number>` | `Version.version_number` | `Integer` |
|
24
|
+
| `<st:date>` | `Version.date` | `Date` | |
|
25
|
+
| `<st:license>` | `License` | |
|
26
|
+
| `<st:name>` | `License.name` | `String` |
|
27
|
+
| `<st:uri>` | `License.uri` | `URI` |
|
28
|
+
| `<st:embargo>` | `Embargo` | |
|
29
|
+
| `<st:type>` | `Embargo.type` | `EmbargoType` |
|
30
|
+
| `<st:period>` | `Embargo.period` | `String` |
|
31
|
+
| `<st:start>` | `Embargo.start_date` | `Date` |
|
32
|
+
| `<st:end>` | `Embargo.end_date` | `Date` |
|
33
|
+
| `<st:inventory>` | `Inventory` | |
|
34
|
+
| `<st:file>` | `StashFile` | |
|
35
|
+
| `<st:pathname>` | `StashFile.pathname` | `String` |
|
36
|
+
| `<st:size>` | `Size` | |
|
37
|
+
| `<st:mime_type>` | `StashFile.mime_type` | `MIME::Type` |
|
38
|
+
| `<st:stash_descriptive>` | `StashWrapper.descriptive_elements` | `Array<REXML::Element>` |
|
39
|
+
|
40
|
+
Note that [TypesafeEnum](https://github.com/dmolesUC3/typesafe_enum) classes are provided
|
41
|
+
for embargo type (`EmbargoType`), identifier type (`IdentifierType`), and size unit
|
42
|
+
(`SizeUnit`).
|
43
|
+
|
44
|
+
## Usage
|
45
|
+
|
46
|
+
The `Stash::Wrapper::StashWrapper` class represents a single Stash wrapper document.
|
47
|
+
It accepts a payload of one or more XML metadata documents in the form of the
|
48
|
+
`descriptive_elements` attribute, an array of `REXML::Element` objects. On calling
|
49
|
+
`save_to_xml` on the `StashWrapper` instance, these elements will be embedded in the
|
50
|
+
wrapper's `<st:stash_descriptive>` element.
|
51
|
+
|
52
|
+
### Full example
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
require 'stash/wrapper'
|
56
|
+
|
57
|
+
ST = Stash::Wrapper
|
58
|
+
|
59
|
+
identifier = ST::Identifier.new(
|
60
|
+
type: ST::IdentifierType::DOI,
|
61
|
+
value: '10.14749/1407399498'
|
62
|
+
)
|
63
|
+
|
64
|
+
version = ST::Version.new(
|
65
|
+
number: 1,
|
66
|
+
date: Date.new(2013, 8, 18),
|
67
|
+
note: 'Sample wrapped Datacite document'
|
68
|
+
)
|
69
|
+
|
70
|
+
license = ST::License::CC_BY
|
71
|
+
|
72
|
+
embargo = ST::Embargo.new(
|
73
|
+
type: ST::EmbargoType::DOWNLOAD,
|
74
|
+
period: '1 year',
|
75
|
+
start_date: Date.new(2013, 8, 18),
|
76
|
+
end_date: Date.new(2014, 8, 18)
|
77
|
+
)
|
78
|
+
|
79
|
+
inventory = ST::Inventory.new(
|
80
|
+
files: [
|
81
|
+
ST::StashFile.new(
|
82
|
+
pathname: 'HSRC_MasterSampleII.dat', size_bytes: 12_345, mime_type: 'text/plain'
|
83
|
+
),
|
84
|
+
ST::StashFile.new(
|
85
|
+
pathname: 'HSRC_MasterSampleII.csv', size_bytes: 67_890, mime_type: 'text/csv'
|
86
|
+
),
|
87
|
+
ST::StashFile.new(
|
88
|
+
pathname: 'HSRC_MasterSampleII.sas7bdat', size_bytes: 123_456, mime_type: 'application/x-sas-data'
|
89
|
+
),
|
90
|
+
])
|
91
|
+
|
92
|
+
datacite_file = 'spec/data/wrapper/wrapper-2-payload.xml'
|
93
|
+
datacite_root = REXML::Document.new(File.read(datacite_file)).root
|
94
|
+
|
95
|
+
wrapper = ST::StashWrapper.new(
|
96
|
+
identifier: identifier,
|
97
|
+
version: version,
|
98
|
+
license: license,
|
99
|
+
embargo: embargo,
|
100
|
+
inventory: inventory,
|
101
|
+
descriptive_elements: [datacite_root]
|
102
|
+
)
|
103
|
+
|
104
|
+
wrapper_xml = wrapper.save_to_xml
|
105
|
+
|
106
|
+
formatter = REXML::Formatters::Pretty.new
|
107
|
+
formatter.compact = true
|
108
|
+
puts formatter.write(wrapper_xml, '')
|
109
|
+
```
|
110
|
+
|
111
|
+
## Generating sample data
|
112
|
+
|
113
|
+
The script `bin/gen_stash_wrapper_sample` will generate sample wrapper files with embedded
|
114
|
+
datacite metadata and [lorem ipsum](https://en.wikipedia.org/wiki/Lorem_ipsum)-style
|
115
|
+
placeholder content. With no arguments, it will generate one file and write it to standard
|
116
|
+
output; with a numeric argument, it will generate that number of files and write them to the
|
117
|
+
current working directory.
|
118
|
+
|
119
|
+
When generating multiple files, the script pulls from a relatively small pool of randomly
|
120
|
+
generated authors (1000), publishers (100), and resource types (20), so that files generated
|
121
|
+
in the same session will share some metadata field values. The MIME types of the `<file/>`
|
122
|
+
entries in a single session will also be pulled from a small subset (20) of real MIME types,
|
123
|
+
and the file extensions should match, but the MIME types, being randomly selected, are likely
|
124
|
+
to be nonsensical.
|
125
|
+
|
126
|
+
### Single file to standard output
|
127
|
+
```
|
128
|
+
% gen_stash_wrapper_sample
|
129
|
+
<st:stash_wrapper xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://dash.cdlib.org/stash_wrapper/ http://dash.cdlib.org/stash_wrapper/stash_wrapper.xsd' xmlns:st='http://dash.cdlib.org/stash_wrapper/'>
|
130
|
+
<st:identifier type='DOI'>10.21585/def1000001</st:identifier>
|
131
|
+
<st:stash_administrative>
|
132
|
+
<st:version>
|
133
|
+
<st:version_number>1</st:version_number>
|
134
|
+
<st:date>2014-03-16Z</st:date>
|
135
|
+
<st:note>Mecum noctem illam superiorem; iam intellege</st:note>
|
136
|
+
</st:version>
|
137
|
+
<st:license>
|
138
|
+
<st:name>Creative Commons Attribution 4.0 International (CC-BY)</st:name>
|
139
|
+
<st:uri>https://creativecommons.org/licenses/by/4.0/legalcode</st:uri>
|
140
|
+
</st:license>
|
141
|
+
<st:embargo>
|
142
|
+
<st:type>none</st:type>
|
143
|
+
<st:period>none</st:period>
|
144
|
+
<st:start>2014-03-16Z</st:start>
|
145
|
+
<st:end>2014-03-16Z</st:end>
|
146
|
+
</st:embargo>
|
147
|
+
<st:inventory num_files='4'>
|
148
|
+
<st:file>
|
149
|
+
<st:pathname>nocte.mng</st:pathname>
|
150
|
+
<st:size unit='B'>2244</st:size>
|
151
|
+
<st:mime_type>video/x-mng</st:mime_type>
|
152
|
+
</st:file>
|
153
|
+
<st:file>
|
154
|
+
<st:pathname>constrictam.htc</st:pathname>
|
155
|
+
<st:size unit='B'>2228</st:size>
|
156
|
+
<st:mime_type>text/x-component</st:mime_type>
|
157
|
+
</st:file>
|
158
|
+
<st:file>
|
159
|
+
<st:pathname>teneri.plt</st:pathname>
|
160
|
+
<st:size unit='B'>55719</st:size>
|
161
|
+
<st:mime_type>application/vnd.hp-HPGL</st:mime_type>
|
162
|
+
</st:file>
|
163
|
+
<st:file>
|
164
|
+
<st:pathname>oculis.uvg</st:pathname>
|
165
|
+
<st:size unit='B'>8080</st:size>
|
166
|
+
<st:mime_type>image/vnd.dece.graphic</st:mime_type>
|
167
|
+
</st:file>
|
168
|
+
</st:inventory>
|
169
|
+
</st:stash_administrative>
|
170
|
+
<st:stash_descriptive>
|
171
|
+
<dcs:resource xmlns:dcs='http://datacite.org/schema/kernel-3' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://datacite.org/schema/kernel-3
|
172
|
+
http://schema.datacite.org/meta/kernel-3/metadata.xsd'>
|
173
|
+
<dcs:identifier identifierType='DOI'>10.21585/def1000001</dcs:identifier>
|
174
|
+
<dcs:creators>
|
175
|
+
<dcs:creator>
|
176
|
+
<dcs:creatorName>Interficiere Statum</dcs:creatorName>
|
177
|
+
<dcs:creatorName>Armis Speculabuntur</dcs:creatorName>
|
178
|
+
<dcs:creatorName>Iste Relinqueres Opimius</dcs:creatorName>
|
179
|
+
<dcs:creatorName>Ordinis Vivis</dcs:creatorName>
|
180
|
+
</dcs:creator>
|
181
|
+
</dcs:creators>
|
182
|
+
<dcs:titles>
|
183
|
+
<dcs:title>Admirandum, dies</dcs:title>
|
184
|
+
</dcs:titles>
|
185
|
+
<dcs:publisher>Furorem Nostro Multis Mores Nocturnum Ahala Tam</dcs:publisher>
|
186
|
+
<dcs:publicationYear>2014</dcs:publicationYear>
|
187
|
+
<dcs:subjects>
|
188
|
+
<dcs:subject>convenit</dcs:subject>
|
189
|
+
<dcs:subject>domus</dcs:subject>
|
190
|
+
<dcs:subject>neque</dcs:subject>
|
191
|
+
<dcs:subject>ora</dcs:subject>
|
192
|
+
<dcs:subject>paulo</dcs:subject>
|
193
|
+
<dcs:subject>perniciosum</dcs:subject>
|
194
|
+
<dcs:subject>poena</dcs:subject>
|
195
|
+
<dcs:subject>res</dcs:subject>
|
196
|
+
<dcs:subject>scientia</dcs:subject>
|
197
|
+
<dcs:subject>tuorum</dcs:subject>
|
198
|
+
</dcs:subjects>
|
199
|
+
<dcs:resourceType resourceTypeGeneral='Dataset'>te</dcs:resourceType>
|
200
|
+
<dcs:descriptions>
|
201
|
+
<dcs:description descriptionType='Abstract'>
|
202
|
+
Pridem oportebat, in te conferri pestem, quam tu in nos omnes iam diu
|
203
|
+
machinaris. an vero vir amplissumus, scipio, pontifex maximus,
|
204
|
+
gracchum mediocriter labefactantem statum rei publicae privatus
|
205
|
+
interfecit; catilinam orbem terrae caede atque incendiis vastare
|
206
|
+
cupientem nos consules perferemus? nam illa nimis antiqua praetereo,
|
207
|
+
quod servilius ahala maelium novis rebus studentem manu sua occidit.
|
208
|
+
fuit, fuit ista quondam in hac re publica virtus, ut viri.
|
209
|
+
</dcs:description>
|
210
|
+
</dcs:descriptions>
|
211
|
+
</dcs:resource>
|
212
|
+
</st:stash_descriptive>
|
213
|
+
</st:stash_wrapper>
|
214
|
+
```
|
215
|
+
|
216
|
+
### Multiple files
|
217
|
+
```
|
218
|
+
% cd /tmp
|
219
|
+
% gen_stash_wrapper_sample 10
|
220
|
+
/tmp/stash_wrapper-01.xml
|
221
|
+
/tmp/stash_wrapper-02.xml
|
222
|
+
/tmp/stash_wrapper-03.xml
|
223
|
+
/tmp/stash_wrapper-04.xml
|
224
|
+
/tmp/stash_wrapper-05.xml
|
225
|
+
/tmp/stash_wrapper-06.xml
|
226
|
+
/tmp/stash_wrapper-07.xml
|
227
|
+
/tmp/stash_wrapper-08.xml
|
228
|
+
/tmp/stash_wrapper-09.xml
|
229
|
+
/tmp/stash_wrapper-10.xml
|
230
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# ------------------------------------------------------------
|
2
|
+
# RSpec
|
3
|
+
|
4
|
+
require 'rspec/core'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
|
7
|
+
namespace :spec do
|
8
|
+
|
9
|
+
desc 'Run all unit tests'
|
10
|
+
RSpec::Core::RakeTask.new(:unit) do |task|
|
11
|
+
task.rspec_opts = %w(--color --format documentation --order default)
|
12
|
+
task.pattern = 'unit/**/*_spec.rb'
|
13
|
+
end
|
14
|
+
|
15
|
+
task all: [:unit]
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Run all tests'
|
19
|
+
task spec: 'spec:all'
|
20
|
+
|
21
|
+
# ------------------------------------------------------------
|
22
|
+
# Coverage
|
23
|
+
|
24
|
+
desc 'Run all unit tests with coverage'
|
25
|
+
task :coverage do
|
26
|
+
ENV['COVERAGE'] = 'true'
|
27
|
+
Rake::Task['spec:unit'].execute
|
28
|
+
end
|
29
|
+
|
30
|
+
# ------------------------------------------------------------
|
31
|
+
# RuboCop
|
32
|
+
|
33
|
+
require 'rubocop/rake_task'
|
34
|
+
RuboCop::RakeTask.new
|
35
|
+
|
36
|
+
# ------------------------------------------------------------
|
37
|
+
# Miscellaneous
|
38
|
+
|
39
|
+
task :debug_load_path do
|
40
|
+
puts $LOAD_PATH
|
41
|
+
end
|
42
|
+
|
43
|
+
# ------------------------------------------------------------
|
44
|
+
# Defaults
|
45
|
+
|
46
|
+
desc 'Run unit tests, check test coverage, check code style'
|
47
|
+
task default: [:coverage, :rubocop]
|
@@ -0,0 +1,220 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<xsl:stylesheet
|
3
|
+
version="2.0"
|
4
|
+
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
5
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
6
|
+
xmlns:datacite="http://datacite.org/schema/kernel-3"
|
7
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
8
|
+
xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
|
9
|
+
exclude-result-prefixes="datacite">
|
10
|
+
|
11
|
+
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="UTF-8" />
|
12
|
+
|
13
|
+
<xsl:strip-space elements="*"/>
|
14
|
+
|
15
|
+
<xsl:template match="datacite:identifier">
|
16
|
+
<dc:identifier>
|
17
|
+
<xsl:choose>
|
18
|
+
<xsl:when test="string-length(@identifierType) > 0">
|
19
|
+
<xsl:value-of select="lower-case(@identifierType)"/>
|
20
|
+
<xsl:text>:</xsl:text>
|
21
|
+
</xsl:when>
|
22
|
+
</xsl:choose>
|
23
|
+
<xsl:value-of select="."/>
|
24
|
+
</dc:identifier>
|
25
|
+
</xsl:template>
|
26
|
+
|
27
|
+
<xsl:template match="datacite:creators">
|
28
|
+
<xsl:for-each select="datacite:creator">
|
29
|
+
<xsl:element name="dc:creator">
|
30
|
+
<xsl:value-of select="./datacite:creatorName"/>
|
31
|
+
</xsl:element>
|
32
|
+
</xsl:for-each>
|
33
|
+
</xsl:template>
|
34
|
+
|
35
|
+
<xsl:template match="datacite:titles">
|
36
|
+
<xsl:for-each select="datacite:title">
|
37
|
+
<xsl:element name="dc:title">
|
38
|
+
<xsl:if test="@xml:lang">
|
39
|
+
<xsl:attribute name="xml:lang"><xsl:value-of select="@xml:lang"/></xsl:attribute>
|
40
|
+
</xsl:if>
|
41
|
+
<xsl:value-of select="."/>
|
42
|
+
</xsl:element>
|
43
|
+
</xsl:for-each>
|
44
|
+
</xsl:template>
|
45
|
+
|
46
|
+
<xsl:template match="datacite:publisher">
|
47
|
+
<xsl:for-each select=".">
|
48
|
+
<xsl:element name="dc:publisher">
|
49
|
+
<xsl:value-of select="."/>
|
50
|
+
</xsl:element>
|
51
|
+
</xsl:for-each>
|
52
|
+
</xsl:template>
|
53
|
+
|
54
|
+
<xsl:template match="datacite:publicationYear">
|
55
|
+
<xsl:element name="dc:date">
|
56
|
+
<xsl:value-of select="."/>
|
57
|
+
</xsl:element>
|
58
|
+
</xsl:template>
|
59
|
+
|
60
|
+
<xsl:template match="datacite:subjects">
|
61
|
+
<xsl:for-each select="datacite:subject">
|
62
|
+
<xsl:element name="dc:subject">
|
63
|
+
<xsl:if test="@xml:lang">
|
64
|
+
<xsl:attribute name="xml:lang"><xsl:value-of select="@xml:lang"/></xsl:attribute>
|
65
|
+
</xsl:if>
|
66
|
+
<xsl:value-of select="."/>
|
67
|
+
</xsl:element>
|
68
|
+
</xsl:for-each>
|
69
|
+
</xsl:template>
|
70
|
+
|
71
|
+
<xsl:template match="datacite:contributors">
|
72
|
+
<xsl:for-each select="datacite:contributor">
|
73
|
+
<xsl:element name="dc:contributor">
|
74
|
+
<xsl:value-of select="./datacite:contributorName"/>
|
75
|
+
</xsl:element>
|
76
|
+
</xsl:for-each>
|
77
|
+
</xsl:template>
|
78
|
+
|
79
|
+
<xsl:template match="datacite:dates">
|
80
|
+
|
81
|
+
<xsl:for-each select="datacite:date">
|
82
|
+
<xsl:element name="dc:date">
|
83
|
+
<xsl:if test="@dateType">
|
84
|
+
<xsl:value-of select="@dateType"/><xsl:text>: </xsl:text>
|
85
|
+
</xsl:if>
|
86
|
+
<xsl:value-of select="."/>
|
87
|
+
</xsl:element>
|
88
|
+
</xsl:for-each>
|
89
|
+
</xsl:template>
|
90
|
+
|
91
|
+
<xsl:template match="datacite:language">
|
92
|
+
<xsl:element name="dc:language">
|
93
|
+
<xsl:value-of select="."/>
|
94
|
+
</xsl:element>
|
95
|
+
</xsl:template>
|
96
|
+
|
97
|
+
<xsl:template match="datacite:resourceType">
|
98
|
+
<xsl:for-each select=".">
|
99
|
+
<xsl:if test="normalize-space(@resourceTypeGeneral)">
|
100
|
+
<xsl:element name="dc:type">
|
101
|
+
<xsl:value-of select="@resourceTypeGeneral"/>
|
102
|
+
</xsl:element>
|
103
|
+
</xsl:if>
|
104
|
+
<xsl:if test="normalize-space(.)">
|
105
|
+
<xsl:element name="dc:type">
|
106
|
+
<xsl:value-of select="."/>
|
107
|
+
</xsl:element>
|
108
|
+
</xsl:if>
|
109
|
+
</xsl:for-each>
|
110
|
+
</xsl:template>
|
111
|
+
|
112
|
+
<xsl:template match="datacite:alternateIdentifiers">
|
113
|
+
<xsl:for-each select="datacite:alternateIdentifier">
|
114
|
+
<xsl:element name="dc:identifier">
|
115
|
+
<xsl:choose>
|
116
|
+
<xsl:when test="string-length(@alternateIdentifierType) > 0">
|
117
|
+
<xsl:value-of select="lower-case(@alternateIdentifierType)"/>
|
118
|
+
<xsl:text>:</xsl:text>
|
119
|
+
</xsl:when>
|
120
|
+
</xsl:choose>
|
121
|
+
<xsl:value-of select="."/>
|
122
|
+
</xsl:element>
|
123
|
+
</xsl:for-each>
|
124
|
+
</xsl:template>
|
125
|
+
|
126
|
+
<xsl:template match="datacite:relatedIdentifiers">
|
127
|
+
<xsl:for-each select="datacite:relatedIdentifier">
|
128
|
+
<xsl:element name="dc:relation">
|
129
|
+
<xsl:choose>
|
130
|
+
<xsl:when test="string-length(@relatedIdentifierType) > 0">
|
131
|
+
<xsl:value-of select="lower-case(@relatedIdentifierType)"/>
|
132
|
+
<xsl:text>:</xsl:text>
|
133
|
+
</xsl:when>
|
134
|
+
</xsl:choose>
|
135
|
+
<xsl:value-of select="."/>
|
136
|
+
</xsl:element>
|
137
|
+
</xsl:for-each>
|
138
|
+
</xsl:template>
|
139
|
+
|
140
|
+
<xsl:template match="datacite:sizes">
|
141
|
+
<xsl:for-each select="datacite:size">
|
142
|
+
<xsl:element name="dc:format">
|
143
|
+
<xsl:value-of select="."/>
|
144
|
+
</xsl:element>
|
145
|
+
</xsl:for-each>
|
146
|
+
</xsl:template>
|
147
|
+
|
148
|
+
<xsl:template match="datacite:formats">
|
149
|
+
<xsl:for-each select="datacite:format">
|
150
|
+
<xsl:element name="dc:format">
|
151
|
+
<xsl:value-of select="."/>
|
152
|
+
</xsl:element>
|
153
|
+
</xsl:for-each>
|
154
|
+
</xsl:template>
|
155
|
+
|
156
|
+
<xsl:template match="datacite:rightsList">
|
157
|
+
<xsl:for-each select="datacite:rights">
|
158
|
+
<xsl:element name="dc:rights">
|
159
|
+
<xsl:value-of select="."/>
|
160
|
+
</xsl:element>
|
161
|
+
<xsl:if test="@rightsURI">
|
162
|
+
<xsl:element name="dc:rights">
|
163
|
+
<xsl:value-of select="@rightsURI"/>
|
164
|
+
</xsl:element>
|
165
|
+
</xsl:if>
|
166
|
+
</xsl:for-each>
|
167
|
+
</xsl:template>
|
168
|
+
|
169
|
+
<xsl:template match="datacite:geoLocations">
|
170
|
+
<xsl:for-each select="datacite:geoLocation">
|
171
|
+
<xsl:for-each select="child::node()">
|
172
|
+
<xsl:element name="dc:coverage">
|
173
|
+
<xsl:value-of select="string(.)"/>
|
174
|
+
</xsl:element>
|
175
|
+
</xsl:for-each>
|
176
|
+
</xsl:for-each>
|
177
|
+
</xsl:template>
|
178
|
+
|
179
|
+
<xsl:template match="datacite:descriptions">
|
180
|
+
<xsl:for-each select="datacite:description">
|
181
|
+
<xsl:if test="normalize-space(@descriptionType)">
|
182
|
+
<xsl:element name="dc:description">
|
183
|
+
<xsl:value-of select="@descriptionType"/>
|
184
|
+
</xsl:element>
|
185
|
+
</xsl:if>
|
186
|
+
<xsl:if test="normalize-space(.)">
|
187
|
+
<xsl:element name="dc:description">
|
188
|
+
<xsl:if test="@xml:lang">
|
189
|
+
<xsl:attribute name="xml:lang"><xsl:value-of select="@xml:lang" /></xsl:attribute>
|
190
|
+
</xsl:if>
|
191
|
+
<xsl:value-of select="."/>
|
192
|
+
</xsl:element>
|
193
|
+
</xsl:if>
|
194
|
+
</xsl:for-each>
|
195
|
+
</xsl:template>
|
196
|
+
|
197
|
+
<xsl:template match="datacite:resource">
|
198
|
+
<xsl:element name="oai_dc:dc">
|
199
|
+
<xsl:attribute name="xsi:schemaLocation">http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd</xsl:attribute>
|
200
|
+
<xsl:namespace name="dc">http://purl.org/dc/elements/1.1/</xsl:namespace>
|
201
|
+
<xsl:apply-templates select="datacite:titles"/>
|
202
|
+
<xsl:apply-templates select="datacite:creators"/>
|
203
|
+
<xsl:apply-templates select="datacite:publisher"/>
|
204
|
+
<xsl:apply-templates select="datacite:publicationYear"/>
|
205
|
+
<xsl:apply-templates select="datacite:dates"/>
|
206
|
+
<xsl:apply-templates select="datacite:identifier"/>
|
207
|
+
<xsl:apply-templates select="datacite:alternateIdentifiers"/>
|
208
|
+
<xsl:apply-templates select="datacite:relatedIdentifiers"/>
|
209
|
+
<xsl:apply-templates select="datacite:subjects"/>
|
210
|
+
<xsl:apply-templates select="datacite:descriptions"/>
|
211
|
+
<xsl:apply-templates select="datacite:contributors"/>
|
212
|
+
<xsl:apply-templates select="datacite:language"/>
|
213
|
+
<xsl:apply-templates select="datacite:resourceType"/>
|
214
|
+
<xsl:apply-templates select="datacite:sizes"/>
|
215
|
+
<xsl:apply-templates select="datacite:formats"/>
|
216
|
+
<xsl:apply-templates select="datacite:rightsList"/>
|
217
|
+
<xsl:apply-templates select="datacite:geoLocations"/>
|
218
|
+
</xsl:element>
|
219
|
+
</xsl:template>
|
220
|
+
</xsl:stylesheet>
|