1
|
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:i18n="http://apache.org/cocoon/i18n/2.1"
|
2
|
xmlns:dri="http://di.tamu.edu/DRI/1.0/" xmlns:mets="http://www.loc.gov/METS/"
|
3
|
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dim="http://www.dspace.org/xmlns/dspace/dim"
|
4
|
xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/TR/xlink/"
|
5
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan"
|
6
|
xmlns:datetime="http://exslt.org/dates-and-times" xmlns:encoder="xalan://java.net.URLEncoder"
|
7
|
xmlns:strings="http://exslt.org/strings"
|
8
|
exclude-result-prefixes="xalan strings encoder datetime" version="1.0">
|
9
|
|
10
|
<xsl:variable name="ascii"> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:variable>
|
11
|
<xsl:variable name="latin1"> ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</xsl:variable>
|
12
|
|
13
|
<!-- Characters that usually don't need to be escaped -->
|
14
|
<xsl:variable name="safe">!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~</xsl:variable>
|
15
|
|
16
|
<xsl:variable name="hex" >0123456789ABCDEF</xsl:variable>
|
17
|
|
18
|
<xsl:template name="name-parse">
|
19
|
<xsl:param name="name"/>
|
20
|
<xsl:variable name="names"
|
21
|
select="strings:split(normalize-space(translate($name, '.', ' ')))"/>
|
22
|
<xsl:variable name="count" select="count($names)"/>
|
23
|
<xsl:if test="$count > 0">
|
24
|
<!-- handle the last name, first -->
|
25
|
<xsl:value-of select="$names[$count]"/>
|
26
|
<xsl:if test="$count > 1">
|
27
|
<!--<xsl:text>, </xsl:text>-->
|
28
|
<xsl:text> </xsl:text>
|
29
|
<!-- now the first and middle names -->
|
30
|
<xsl:for-each select="$names">
|
31
|
<xsl:choose>
|
32
|
<xsl:when test="position() = $count"/>
|
33
|
<xsl:otherwise>
|
34
|
<xsl:value-of select="substring(., 1, 1)"/>
|
35
|
<!--<xsl:text>.</xsl:text>-->
|
36
|
</xsl:otherwise>
|
37
|
</xsl:choose>
|
38
|
</xsl:for-each>
|
39
|
</xsl:if>
|
40
|
</xsl:if>
|
41
|
</xsl:template>
|
42
|
<xsl:template name="name-parse-reverse">
|
43
|
<xsl:param name="name"/>
|
44
|
<xsl:variable name="names" select="strings:split(translate($name, '.', ' '), ',')"/>
|
45
|
<xsl:value-of select="normalize-space($names[1])"/>
|
46
|
<xsl:text> </xsl:text>
|
47
|
<xsl:for-each select="strings:split(normalize-space($names[2]), ' ')">
|
48
|
<xsl:value-of select="substring(., 1, 1)"/>
|
49
|
</xsl:for-each>
|
50
|
</xsl:template>
|
51
|
<datetime:month-lengths xmlns:date="http://exslt.org/dates-and-times">
|
52
|
<datetime:month>31</datetime:month>
|
53
|
<datetime:month>28</datetime:month>
|
54
|
<datetime:month>31</datetime:month>
|
55
|
<datetime:month>30</datetime:month>
|
56
|
<datetime:month>31</datetime:month>
|
57
|
<datetime:month>30</datetime:month>
|
58
|
<datetime:month>31</datetime:month>
|
59
|
<datetime:month>31</datetime:month>
|
60
|
<datetime:month>30</datetime:month>
|
61
|
<datetime:month>31</datetime:month>
|
62
|
<datetime:month>30</datetime:month>
|
63
|
<datetime:month>31</datetime:month>
|
64
|
</datetime:month-lengths>
|
65
|
<xsl:template name="datetime:difference">
|
66
|
<xsl:param name="start"/>
|
67
|
<xsl:param name="end"/>
|
68
|
<xsl:variable name="start-neg" select="starts-with($start, '-')"/>
|
69
|
<xsl:variable name="start-no-neg">
|
70
|
<xsl:choose>
|
71
|
<xsl:when test="$start-neg or starts-with($start, '+')">
|
72
|
<xsl:value-of select="substring($start, 2)"/>
|
73
|
</xsl:when>
|
74
|
<xsl:otherwise>
|
75
|
<xsl:value-of select="$start"/>
|
76
|
</xsl:otherwise>
|
77
|
</xsl:choose>
|
78
|
</xsl:variable>
|
79
|
<xsl:variable name="start-no-neg-length" select="string-length($start-no-neg)"/>
|
80
|
<xsl:variable name="start-timezone">
|
81
|
<xsl:choose>
|
82
|
<xsl:when test="substring($start-no-neg, $start-no-neg-length) = 'Z'">Z</xsl:when>
|
83
|
<xsl:otherwise>
|
84
|
<xsl:variable name="tz"
|
85
|
select="substring($start-no-neg, $start-no-neg-length - 5)"/>
|
86
|
<xsl:if
|
87
|
test="(substring($tz, 1, 1) = '-' or substring($tz, 1, 1) = '+') and substring($tz, 4, 1) = ':'">
|
88
|
<xsl:value-of select="$tz"/>
|
89
|
</xsl:if>
|
90
|
</xsl:otherwise>
|
91
|
</xsl:choose>
|
92
|
</xsl:variable>
|
93
|
<xsl:variable name="end-neg" select="starts-with($end, '-')"/>
|
94
|
<xsl:variable name="end-no-neg">
|
95
|
<xsl:choose>
|
96
|
<xsl:when test="$end-neg or starts-with($end, '+')">
|
97
|
<xsl:value-of select="substring($end, 2)"/>
|
98
|
</xsl:when>
|
99
|
<xsl:otherwise>
|
100
|
<xsl:value-of select="$end"/>
|
101
|
</xsl:otherwise>
|
102
|
</xsl:choose>
|
103
|
</xsl:variable>
|
104
|
<xsl:variable name="end-no-neg-length" select="string-length($end-no-neg)"/>
|
105
|
<xsl:variable name="end-timezone">
|
106
|
<xsl:choose>
|
107
|
<xsl:when test="substring($end-no-neg, $end-no-neg-length) = 'Z'">Z</xsl:when>
|
108
|
<xsl:otherwise>
|
109
|
<xsl:variable name="tz" select="substring($end-no-neg, $end-no-neg-length - 5)"/>
|
110
|
<xsl:if
|
111
|
test="(substring($tz, 1, 1) = '-' or substring($tz, 1, 1) = '+') and substring($tz, 4, 1) = ':'">
|
112
|
<xsl:value-of select="$tz"/>
|
113
|
</xsl:if>
|
114
|
</xsl:otherwise>
|
115
|
</xsl:choose>
|
116
|
</xsl:variable>
|
117
|
<xsl:variable name="difference">
|
118
|
<xsl:if
|
119
|
test="(not(string($start-timezone)) or $start-timezone = 'Z' or (substring($start-timezone, 2, 2) <= 23 and substring($start-timezone, 5, 2) <= 59)) and (not(string($end-timezone)) or $end-timezone = 'Z' or (substring($end-timezone, 2, 2) <= 23 and substring($end-timezone, 5, 2) <= 59))">
|
120
|
<xsl:variable name="start-dt"
|
121
|
select="substring($start-no-neg, 1, $start-no-neg-length - string-length($start-timezone))"/>
|
122
|
<xsl:variable name="start-dt-length" select="string-length($start-dt)"/>
|
123
|
<xsl:variable name="end-dt"
|
124
|
select="substring($end-no-neg, 1, $end-no-neg-length - string-length($end-timezone))"/>
|
125
|
<xsl:variable name="end-dt-length" select="string-length($end-dt)"/>
|
126
|
<xsl:variable name="start-year"
|
127
|
select="substring($start-dt, 1, 4) * (($start-neg * -2) + 1)"/>
|
128
|
<xsl:variable name="end-year"
|
129
|
select="substring($end-dt, 1, 4) * (($end-neg * -2) + 1)"/>
|
130
|
<xsl:variable name="diff-year" select="$end-year - $start-year"/>
|
131
|
<xsl:choose>
|
132
|
<xsl:when test="not(number($start-year) and number($end-year))"/>
|
133
|
<xsl:when test="$start-dt-length = 4 or $end-dt-length = 4">
|
134
|
<xsl:choose>
|
135
|
<xsl:when test="$diff-year < 0">-P <xsl:value-of
|
136
|
select="$diff-year * -1"/> Y</xsl:when>
|
137
|
<xsl:otherwise>P <xsl:value-of select="$diff-year"/> Y</xsl:otherwise>
|
138
|
</xsl:choose>
|
139
|
</xsl:when>
|
140
|
<xsl:when
|
141
|
test="substring($start-dt, 5, 1) = '-' and substring($end-dt, 5, 1) = '-'">
|
142
|
<xsl:variable name="start-month" select="substring($start-dt, 6, 2)"/>
|
143
|
<xsl:variable name="end-month" select="substring($end-dt, 6, 2)"/>
|
144
|
<xsl:variable name="diff-month" select="$end-month - $start-month"/>
|
145
|
<xsl:choose>
|
146
|
<xsl:when test="not($start-month <= 12 and $end-month <= 12)"/>
|
147
|
<xsl:when test="$start-dt-length = 7 or $end-dt-length = 7">
|
148
|
<xsl:variable name="months" select="$diff-month + ($diff-year * 12)"/>
|
149
|
<xsl:variable name="abs-months"
|
150
|
select="$months * ((($months >= 0) * 2) - 1)"/>
|
151
|
<xsl:variable name="y" select="floor($abs-months div 12)"/>
|
152
|
<xsl:variable name="m" select="$abs-months mod 12"/>
|
153
|
<xsl:if test="$months < 0">-</xsl:if>
|
154
|
<xsl:text>P</xsl:text>
|
155
|
<xsl:if test="$y">
|
156
|
<xsl:value-of select="$y"/> Y</xsl:if>
|
157
|
<xsl:if test="$m">
|
158
|
<xsl:value-of select="$m"/> M</xsl:if>
|
159
|
</xsl:when>
|
160
|
<xsl:when
|
161
|
test="substring($start-dt, 8, 1) = '-' and substring($end-dt, 8, 1) = '-'">
|
162
|
<xsl:variable name="start-day" select="substring($start-dt, 9, 2)"/>
|
163
|
<xsl:variable name="end-day" select="substring($end-dt, 9, 2)"/>
|
164
|
<xsl:if test="$start-day <= 31 and $end-day <= 31">
|
165
|
<xsl:variable name="month-lengths"
|
166
|
select="document('')/*/datetime:month-lengths/datetime:month"/>
|
167
|
<xsl:variable name="start-y-1" select="$start-year - 1"/>
|
168
|
<xsl:variable name="start-leaps"
|
169
|
select="floor($start-y-1 div 4) - floor($start-y-1 div 100) + floor($start-y-1 div 400)"/>
|
170
|
<xsl:variable name="start-leap"
|
171
|
select="(not($start-year mod 4) and $start-year mod 100) or not($start-year mod 400)"/>
|
172
|
<xsl:variable name="start-month-days"
|
173
|
select="sum($month-lengths[position() < $start-month])"/>
|
174
|
<xsl:variable name="start-days">
|
175
|
<xsl:variable name="days"
|
176
|
select="($start-year * 365) + $start-leaps + $start-month-days + $start-day"/>
|
177
|
<xsl:choose>
|
178
|
<xsl:when test="$start-leap and $start-month > 2">
|
179
|
<xsl:value-of select="$days + 1"/>
|
180
|
</xsl:when>
|
181
|
<xsl:otherwise>
|
182
|
<xsl:value-of select="$days"/>
|
183
|
</xsl:otherwise>
|
184
|
</xsl:choose>
|
185
|
</xsl:variable>
|
186
|
<xsl:variable name="end-y-1" select="$end-year - 1"/>
|
187
|
<xsl:variable name="end-leaps"
|
188
|
select="floor($end-y-1 div 4) - floor($end-y-1 div 100) + floor($end-y-1 div 400)"/>
|
189
|
<xsl:variable name="end-leap"
|
190
|
select="(not($end-year mod 4) and $end-year mod 100) or not($end-year mod 400)"/>
|
191
|
<xsl:variable name="end-month-days"
|
192
|
select="sum($month-lengths[position() < $end-month])"/>
|
193
|
<xsl:variable name="end-days">
|
194
|
<xsl:variable name="days"
|
195
|
select="($end-year * 365) + $end-leaps + $end-month-days + $end-day"/>
|
196
|
<xsl:choose>
|
197
|
<xsl:when test="$end-leap and $end-month > 2">
|
198
|
<xsl:value-of select="$days + 1"/>
|
199
|
</xsl:when>
|
200
|
<xsl:otherwise>
|
201
|
<xsl:value-of select="$days"/>
|
202
|
</xsl:otherwise>
|
203
|
</xsl:choose>
|
204
|
</xsl:variable>
|
205
|
<xsl:variable name="diff-days" select="$end-days - $start-days"/>
|
206
|
<xsl:choose>
|
207
|
<xsl:when
|
208
|
test="$start-dt-length = 10 or $end-dt-length = 10">
|
209
|
<xsl:choose>
|
210
|
<xsl:when test="$diff-days < 0">-P <xsl:value-of
|
211
|
select="$diff-days * -1"/> D</xsl:when>
|
212
|
<xsl:otherwise>P <xsl:value-of select="$diff-days"/>
|
213
|
D</xsl:otherwise>
|
214
|
</xsl:choose>
|
215
|
</xsl:when>
|
216
|
<xsl:when
|
217
|
test="substring($start-dt, 11, 1) = 'T' and substring($end-dt, 11, 1) = 'T' and substring($start-dt, 14, 1) = ':' and substring($start-dt, 17, 1) = ':' and substring($end-dt, 14, 1) = ':' and substring($end-dt, 17, 1) = ':'">
|
218
|
<xsl:variable name="start-hour"
|
219
|
select="substring($start-dt, 12, 2)"/>
|
220
|
<xsl:variable name="start-min"
|
221
|
select="substring($start-dt, 15, 2)"/>
|
222
|
<xsl:variable name="start-sec"
|
223
|
select="substring($start-dt, 18)"/>
|
224
|
<xsl:variable name="end-hour"
|
225
|
select="substring($end-dt, 12, 2)"/>
|
226
|
<xsl:variable name="end-min"
|
227
|
select="substring($end-dt, 15, 2)"/>
|
228
|
<xsl:variable name="end-sec"
|
229
|
select="substring($end-dt, 18)"/>
|
230
|
<xsl:if
|
231
|
test="$start-hour <= 23 and $end-hour <= 23 and $start-min <= 59 and $end-min <= 59 and $start-sec <= 60 and $end-sec <= 60">
|
232
|
<xsl:variable name="min-s" select="60"/>
|
233
|
<xsl:variable name="hour-s" select="60 * 60"/>
|
234
|
<xsl:variable name="day-s" select="60 * 60 * 24"/>
|
235
|
<xsl:variable name="start-tz-adj">
|
236
|
<xsl:variable name="tz"
|
237
|
select="(substring($start-timezone, 2, 2) * $hour-s) + (substring($start-timezone, 5, 2) * $min-s)"/>
|
238
|
<xsl:choose>
|
239
|
<xsl:when test="starts-with($start-timezone, '-')">
|
240
|
<xsl:value-of select="$tz"/>
|
241
|
</xsl:when>
|
242
|
<xsl:when test="starts-with($start-timezone, '+')">
|
243
|
<xsl:value-of select="$tz * -1"/>
|
244
|
</xsl:when>
|
245
|
<xsl:otherwise>0</xsl:otherwise>
|
246
|
</xsl:choose>
|
247
|
</xsl:variable>
|
248
|
<xsl:variable name="end-tz-adj">
|
249
|
<xsl:variable name="tz"
|
250
|
select="(substring($end-timezone, 2, 2) * $hour-s) + (substring($end-timezone, 5, 2) * $min-s)"/>
|
251
|
<xsl:choose>
|
252
|
<xsl:when test="starts-with($end-timezone, '-')">
|
253
|
<xsl:value-of select="$tz"/>
|
254
|
</xsl:when>
|
255
|
<xsl:when test="starts-with($end-timezone, '+')">
|
256
|
<xsl:value-of select="$tz * -1"/>
|
257
|
</xsl:when>
|
258
|
<xsl:otherwise>0</xsl:otherwise>
|
259
|
</xsl:choose>
|
260
|
</xsl:variable>
|
261
|
<xsl:variable name="start-secs"
|
262
|
select="$start-sec + ($start-min * $min-s) + ($start-hour * $hour-s) + ($start-days * $day-s) + $start-tz-adj"/>
|
263
|
<xsl:variable name="end-secs"
|
264
|
select="$end-sec + ($end-min * $min-s) + ($end-hour * $hour-s) + ($end-days * $day-s) + $end-tz-adj"/>
|
265
|
<xsl:variable name="diff-secs"
|
266
|
select="$end-secs - $start-secs"/>
|
267
|
<xsl:variable name="s"
|
268
|
select="$diff-secs * ((($diff-secs < 0) * -2) + 1)"/>
|
269
|
<xsl:variable name="days"
|
270
|
select="floor($s div $day-s)"/>
|
271
|
<xsl:variable name="hours"
|
272
|
select="floor(($s - ($days * $day-s)) div $hour-s)"/>
|
273
|
<xsl:variable name="mins"
|
274
|
select="floor(($s - ($days * $day-s) - ($hours * $hour-s)) div $min-s)"/>
|
275
|
<xsl:variable name="secs"
|
276
|
select="$s - ($days * $day-s) - ($hours * $hour-s) - ($mins * $min-s)"/>
|
277
|
<xsl:if test="$diff-secs < 0">-</xsl:if>
|
278
|
<xsl:text>P</xsl:text>
|
279
|
<xsl:if test="$days">
|
280
|
<xsl:value-of select="$days"/>
|
281
|
<xsl:text>D</xsl:text>
|
282
|
</xsl:if>
|
283
|
<xsl:if test="$hours or $mins or $secs">T</xsl:if>
|
284
|
<xsl:if test="$hours">
|
285
|
<xsl:value-of select="$hours"/>
|
286
|
<xsl:text>H</xsl:text>
|
287
|
</xsl:if>
|
288
|
<xsl:if test="$mins">
|
289
|
<xsl:value-of select="$mins"/>
|
290
|
<xsl:text>M</xsl:text>
|
291
|
</xsl:if>
|
292
|
<xsl:if test="$secs">
|
293
|
<xsl:value-of select="$secs"/>
|
294
|
<xsl:text>S</xsl:text>
|
295
|
</xsl:if>
|
296
|
</xsl:if>
|
297
|
</xsl:when>
|
298
|
</xsl:choose>
|
299
|
</xsl:if>
|
300
|
</xsl:when>
|
301
|
</xsl:choose>
|
302
|
</xsl:when>
|
303
|
</xsl:choose>
|
304
|
</xsl:if>
|
305
|
</xsl:variable>
|
306
|
<xsl:value-of select="$difference"/>
|
307
|
</xsl:template>
|
308
|
<xsl:template name="checkURL">
|
309
|
<xsl:param name="url"/>
|
310
|
<xsl:param name="localize"/>
|
311
|
<xsl:choose>
|
312
|
<xsl:when test="$localize">
|
313
|
<xsl:choose>
|
314
|
<xsl:when test="starts-with($url, 'http://hdl.handle.net/')">
|
315
|
<xsl:value-of select="concat('/handle/', substring($url, 23))"/>
|
316
|
</xsl:when>
|
317
|
<xsl:when test="starts-with($url, 'http://datadryad.org/handle/')">
|
318
|
<xsl:value-of select="concat('/handle/', substring($url, 29))"/>
|
319
|
</xsl:when>
|
320
|
<!--
|
321
|
FIXME: this only works until our numbers reach five spaces;
|
322
|
One solution: have a local webservice that resolves all DOIs
|
323
|
-->
|
324
|
<xsl:when test="starts-with($url, 'http://dx.doi.org/10.5061/')">
|
325
|
<xsl:value-of select="concat('/doi?redirect=doi:', substring($url, 19))"/>
|
326
|
</xsl:when>
|
327
|
<xsl:otherwise>
|
328
|
<xsl:value-of select="$url"/>
|
329
|
</xsl:otherwise>
|
330
|
</xsl:choose>
|
331
|
</xsl:when>
|
332
|
<xsl:otherwise>
|
333
|
<xsl:value-of select="$url"/>
|
334
|
</xsl:otherwise>
|
335
|
</xsl:choose>
|
336
|
</xsl:template>
|
337
|
<!--
|
338
|
*********************************************
|
339
|
OpenURL COinS Rendering Template
|
340
|
*********************************************
|
341
|
|
342
|
COinS Example:
|
343
|
|
344
|
<span class="Z3988"
|
345
|
title="ctx_ver=Z39.88-2004&
|
346
|
rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&
|
347
|
rfr_id=info%3Asid%2Focoins.info%3Agenerator&
|
348
|
rft.title=Making+WordPress+Content+Available+to+Zotero&
|
349
|
rft.aulast=Kraus&
|
350
|
rft.aufirst=Kari&
|
351
|
rft.subject=News&
|
352
|
rft.source=Zotero%3A+The+Next-Generation+Research+Tool&
|
353
|
rft.date=2007-02-08&
|
354
|
rft.type=blogPost&
|
355
|
rft.format=text&
|
356
|
rft.identifier=http://www.zotero.org/blog/making-wordpress-content-available-to-zotero/&
|
357
|
rft.language=English"></span>
|
358
|
|
359
|
This Code does not parse authors names, instead relying on dc.contributor to populate the
|
360
|
coins
|
361
|
-->
|
362
|
|
363
|
<xsl:template name="renderCOinS">
|
364
|
<xsl:text>ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&</xsl:text>
|
365
|
<xsl:for-each select=".//dim:field[@element = 'identifier']">
|
366
|
<xsl:text>rft_id=</xsl:text>
|
367
|
<xsl:value-of select="encoder:encode(string(.))"/>
|
368
|
<xsl:text>&</xsl:text>
|
369
|
</xsl:for-each>
|
370
|
<xsl:text>rfr_id=info%3Asid%2Fdatadryad.org%3Arepo&</xsl:text>
|
371
|
<xsl:for-each select=".//dim:field">
|
372
|
<xsl:value-of select="concat('rft.', @element,'=',encoder:encode(string(.))) "/>
|
373
|
<xsl:if test="position()!=last()">
|
374
|
<xsl:text>&</xsl:text>
|
375
|
</xsl:if>
|
376
|
</xsl:for-each>
|
377
|
</xsl:template>
|
378
|
|
379
|
</xsl:stylesheet>
|