1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="1.0"
3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pz="http://www.indexdata.com/pazpar2/1.0"
4 xmlns:tmarc="http://www.indexdata.com/turbomarc">
6 <xsl:output indent="yes" method="xml" version="1.0"
9 <!-- Extract metadata from MARC21/USMARC from streamlined marcxml format
10 http://www.loc.gov/marc/bibliographic/ecbdhome.html -->
11 <xsl:template name="record-hook" />
14 <xsl:template match="/">
15 <xsl:apply-templates />
18 <xsl:template match="tmarc:r">
19 <xsl:variable name="title_medium" select="tmarc:d245/tmarc:sh" />
20 <xsl:variable name="journal_title" select="tmarc:d773/tmarc:st" />
21 <xsl:variable name="electronic_location_url" select="tmarc:d856/tmarc:su" />
22 <xsl:variable name="fulltext_a" select="tmarc:d900/tmarc:sa" />
23 <xsl:variable name="fulltext_b" select="tmarc:d900/tmarc:sb" />
24 <!-- Does not always hit the right substring. The field is not always fixed-width? -->
25 <xsl:variable name="control_lang" select="substring(tmarc:c008, 36, 3)" />
26 <xsl:variable name="contains110" select="tmarc:d110" />
27 <xsl:variable name="hasAuthorFields" select="tmarc:d100 or tmarc:d111" />
28 <xsl:variable name="typeofrec" select="substring(tmarc:l, 7, 1)"/>
29 <xsl:variable name="typeofvm" select="substring(tmarc:c008, 34, 1)"/>
30 <xsl:variable name="biblevel" select="substring(tmarc:l, 8, 1)"/>
31 <xsl:variable name="physdes" select="substring(tmarc:c007, 1, 1)"/>
32 <xsl:variable name="form1" select="substring(tmarc:c008, 24, 1)"/>
33 <xsl:variable name="form2" select="substring(tmarc:c008, 30, 1)"/>
34 <xsl:variable name="oclca" select="substring(tmarc:c007, 1, 1)"/>
35 <xsl:variable name="oclcb" select="substring(tmarc:c007, 2, 1)"/>
36 <xsl:variable name="oclcd" select="substring(tmarc:c007, 4, 1)"/>
37 <xsl:variable name="oclce" select="substring(tmarc:c007, 5, 1)"/>
38 <xsl:variable name="typeofserial" select="substring(tmarc:c008, 22, 1)"/>
40 <xsl:variable name="electronic">
42 <xsl:when test="$form1='s' or $form1='q' or $form1='o' or
43 $form2='s' or $form2='q' or $form2='o'">
44 <xsl:text>yes</xsl:text>
50 <xsl:variable name="medium">
52 <xsl:when test="($typeofrec='a' or $typeofrec='t') and $biblevel='m'">book</xsl:when>
53 <xsl:when test="$typeofrec='j' or $typeofrec='i'">
54 <xsl:text>recording</xsl:text>
56 <xsl:when test="$oclcb='d' and $oclcd='f'">-cd</xsl:when>
57 <xsl:when test="$oclcb='s'">-cassette</xsl:when>
58 <xsl:when test="$oclcb='d' and $oclcd='a' or $oclcd='b' or
59 $oclcd='c' or $oclcd='d' or $oclcd='e'">-vinyl</xsl:when>
62 <xsl:when test="$typeofrec='g'">
64 <xsl:when test="$typeofvm='m' or $typeofvm='v'">
65 <xsl:text>video</xsl:text>
67 <xsl:when test="$oclca='v' and $oclcb='d' and $oclce='v'">-dvd</xsl:when>
68 <xsl:when test="$oclca='v' and $oclcb='d' and $oclce='s'">-blu-ray</xsl:when>
69 <xsl:when test="$oclca='v' and $oclcb='f' and $oclce='b'">-vhs</xsl:when>
72 <xsl:otherwise>audio-visual</xsl:otherwise>
75 <xsl:when test="$typeofrec='a' and $biblevel='s'">
77 <xsl:when test="$typeofserial='n'">newspaper</xsl:when>
78 <xsl:otherwise>journal</xsl:otherwise>
81 <xsl:when test="$typeofrec='e' or $typeofrec='f'">map</xsl:when>
82 <xsl:when test="$typeofrec='c' or $typeofrec='d'">music-score</xsl:when>
83 <xsl:when test="$form1='a' or $form1='b' or $form1='c'">microform</xsl:when>
84 <xsl:when test="$typeofrec='t'">thesis</xsl:when>
85 <!-- <xsl:when test="$journal_title">article</xsl:when> -->
86 <xsl:when test="$typeofrec='a' or $typeofrec='i' and
87 ($typeofserial='d' or $typeofserial='w')">web</xsl:when>
88 <xsl:when test="$typeofrec='a' and $biblevel='b'">article</xsl:when>
89 <xsl:when test="$typeofrec='m'">electronic</xsl:when>
90 <xsl:when test="$title_medium">
91 <xsl:value-of select="translate($title_medium, ' []/:', '')" />
94 <xsl:text>other</xsl:text>
101 <xsl:attribute name="mergekey">
102 <xsl:text>title </xsl:text>
103 <xsl:value-of select="tmarc:d245/tmarc:sa" />
104 <xsl:text> author </xsl:text>
105 <xsl:value-of select="tmarc:d100/tmarc:sa" />
106 <xsl:text> medium </xsl:text>
107 <xsl:value-of select="$medium" />
111 <xsl:for-each select="tmarc:c001">
112 <pz:metadata type="id">
113 <xsl:value-of select="." />
117 <xsl:for-each select="tmarc:d010">
118 <pz:metadata type="lccn">
119 <xsl:value-of select="tmarc:sa" />
123 <xsl:for-each select="tmarc:d020">
124 <pz:metadata type="isbn">
125 <xsl:value-of select="tmarc:sa" />
129 <xsl:for-each select="tmarc:d022">
130 <pz:metadata type="issn">
131 <xsl:value-of select="tmarc:sa" />
135 <xsl:for-each select="tmarc:d027">
136 <pz:metadata type="tech-rep-nr">
137 <xsl:value-of select="tmarc:sa" />
141 <xsl:for-each select="tmarc:d035">
142 <pz:metadata type="system-control-nr">
144 <xsl:when test="tmarc:sa">
145 <xsl:value-of select="tmarc:sa"/>
148 <xsl:value-of select="tmarc:sb"/>
154 <xsl:for-each select="tmarc:d100">
155 <pz:metadata type="author">
156 <xsl:value-of select="tmarc:sa" />
158 <pz:metadata type="author-title">
159 <xsl:value-of select="tmarc:sc" />
161 <pz:metadata type="author-date">
162 <xsl:value-of select="tmarc:sd" />
166 <xsl:for-each select="tmarc:d110">
167 <pz:metadata type="corporate-name">
168 <xsl:value-of select="tmarc:sa" />
170 <pz:metadata type="corporate-location">
171 <xsl:value-of select="tmarc:sc" />
173 <pz:metadata type="corporate-date">
174 <xsl:value-of select="tmarc:sd" />
178 <xsl:for-each select="tmarc:d111">
179 <pz:metadata type="meeting-name">
180 <xsl:value-of select="tmarc:sa" />
182 <pz:metadata type="meeting-location">
183 <xsl:value-of select="tmarc:sc" />
185 <pz:metadata type="meeting-date">
186 <xsl:value-of select="tmarc:sd" />
190 <xsl:for-each select="tmarc:d260">
191 <pz:metadata type="date">
192 <xsl:value-of select="tmarc:sc" />
196 <xsl:for-each select="tmarc:d130">
197 <pz:metadata type="title-uniform">
198 <xsl:value-of select="tmarc:sa" />
200 <pz:metadata type="title-uniform-media">
201 <xsl:value-of select="tmarc:sm" />
203 <pz:metadata type="title-uniform-parts">
204 <xsl:value-of select="tmarc:sn" />
206 <pz:metadata type="title-uniform-partname">
207 <xsl:value-of select="tmarc:sp" />
209 <pz:metadata type="title-uniform-key">
210 <xsl:value-of select="tmarc:sr" />
214 <xsl:for-each select="tmarc:d245">
215 <pz:metadata type="title">
216 <xsl:value-of select="tmarc:sa" />
218 <pz:metadata type="title-remainder">
219 <xsl:value-of select="tmarc:sb" />
221 <pz:metadata type="title-responsibility">
222 <xsl:value-of select="tmarc:sc" />
224 <pz:metadata type="title-dates">
225 <xsl:value-of select="tmarc:sf" />
227 <pz:metadata type="title-medium">
228 <xsl:value-of select="tmarc:sh" />
230 <pz:metadata type="title-number-section">
231 <xsl:value-of select="tmarc:sn" />
235 <xsl:for-each select="tmarc:d250">
236 <pz:metadata type="edition">
237 <xsl:value-of select="tmarc:sa" />
241 <xsl:for-each select="tmarc:d260">
242 <pz:metadata type="publication-place">
243 <xsl:value-of select="tmarc:sa" />
245 <pz:metadata type="publication-name">
246 <xsl:value-of select="tmarc:sb" />
248 <pz:metadata type="publication-date">
249 <xsl:value-of select="tmarc:sc" />
253 <xsl:for-each select="tmarc:d300">
254 <pz:metadata type="physical-extent">
255 <xsl:value-of select="tmarc:sa" />
257 <pz:metadata type="physical-format">
258 <xsl:value-of select="tmarc:sb" />
260 <pz:metadata type="physical-dimensions">
261 <xsl:value-of select="tmarc:sc" />
263 <pz:metadata type="physical-accomp">
264 <xsl:value-of select="tmarc:se" />
266 <pz:metadata type="physical-unittype">
267 <xsl:value-of select="tmarc:sf" />
269 <pz:metadata type="physical-unitsize">
270 <xsl:value-of select="tmarc:sg" />
272 <pz:metadata type="physical-specified">
273 <xsl:value-of select="tmarc:s3" />
277 <xsl:for-each select="tmarc:d440">
278 <pz:metadata type="series-title">
279 <xsl:value-of select="tmarc:sa" />
283 <xsl:for-each select="tmarc:d500">
284 <pz:metadata type="description">
285 <xsl:for-each select="node()">
286 <xsl:value-of select="text()" />
291 <xsl:for-each select="tmarc:d505">
292 <pz:metadata type="description">
293 <xsl:for-each select="node()">
294 <xsl:value-of select="text()" />
299 <xsl:for-each select="tmarc:d518">
300 <pz:metadata type="description">
301 <xsl:for-each select="node()">
302 <xsl:value-of select="text()" />
307 <xsl:for-each select="tmarc:d520">
308 <pz:metadata type="description">
309 <xsl:for-each select="node()">
310 <xsl:value-of select="text()" />
315 <xsl:for-each select="tmarc:d522">
316 <pz:metadata type="description">
317 <xsl:for-each select="node()">
318 <xsl:value-of select="text()" />
323 <xsl:for-each select="tmarc:d600">
324 <pz:metadata type="subject">
325 <xsl:value-of select="tmarc:sa" />
327 <pz:metadata type="subject-long">
328 <xsl:for-each select="node()/text()">
329 <xsl:if test="position() > 1">
330 <xsl:text>, </xsl:text>
332 <xsl:value-of select="." />
337 <xsl:for-each select="tmarc:d610">
338 <pz:metadata type="subject">
339 <xsl:value-of select="tmarc:sa" />
341 <pz:metadata type="subject-long">
342 <xsl:for-each select="node()/text()">
343 <xsl:if test="position() > 1">
344 <xsl:text>, </xsl:text>
346 <xsl:value-of select="." />
351 <xsl:for-each select="tmarc:d611">
352 <pz:metadata type="subject">
353 <xsl:value-of select="tmarc:sa" />
355 <pz:metadata type="subject-long">
356 <xsl:for-each select="node()/text()">
357 <xsl:if test="position() > 1">
358 <xsl:text>, </xsl:text>
360 <xsl:value-of select="." />
365 <xsl:for-each select="tmarc:d630">
366 <pz:metadata type="subject">
367 <xsl:value-of select="tmarc:sa" />
369 <pz:metadata type="subject-long">
370 <xsl:for-each select="node()/text()">
371 <xsl:if test="position() > 1">
372 <xsl:text>, </xsl:text>
374 <xsl:value-of select="." />
379 <xsl:for-each select="tmarc:d648">
380 <pz:metadata type="subject">
381 <xsl:value-of select="tmarc:sa" />
383 <pz:metadata type="subject-long">
384 <xsl:for-each select="node()/text()">
385 <xsl:if test="position() > 1">
386 <xsl:text>, </xsl:text>
388 <xsl:value-of select="." />
393 <xsl:for-each select="tmarc:d650">
394 <pz:metadata type="subject">
395 <xsl:value-of select="tmarc:sa" />
397 <pz:metadata type="subject-long">
398 <xsl:for-each select="node()/text()">
399 <xsl:if test="position() > 1">
400 <xsl:text>, </xsl:text>
402 <xsl:value-of select="." />
407 <xsl:for-each select="tmarc:d651">
408 <pz:metadata type="subject">
409 <xsl:value-of select="tmarc:sa" />
411 <pz:metadata type="subject-long">
412 <xsl:for-each select="node()/text()">
413 <xsl:if test="position() > 1">
414 <xsl:text>, </xsl:text>
416 <xsl:value-of select="." />
421 <xsl:for-each select="tmarc:d653">
422 <pz:metadata type="subject">
423 <xsl:value-of select="tmarc:sa" />
425 <pz:metadata type="subject-long">
426 <xsl:for-each select="node()/text()">
427 <xsl:if test="position() > 1">
428 <xsl:text>, </xsl:text>
430 <xsl:value-of select="." />
435 <xsl:for-each select="tmarc:d654">
436 <pz:metadata type="subject">
437 <xsl:value-of select="tmarc:sa" />
439 <pz:metadata type="subject-long">
440 <xsl:for-each select="node()/text()">
441 <xsl:if test="position() > 1">
442 <xsl:text>, </xsl:text>
444 <xsl:value-of select="." />
449 <xsl:for-each select="tmarc:d655">
450 <pz:metadata type="subject">
451 <xsl:value-of select="tmarc:sa" />
453 <pz:metadata type="subject-long">
454 <xsl:for-each select="node()/text()">
455 <xsl:if test="position() > 1">
456 <xsl:text>, </xsl:text>
458 <xsl:value-of select="." />
463 <xsl:for-each select="tmarc:d656">
464 <pz:metadata type="subject">
465 <xsl:value-of select="tmarc:sa" />
467 <pz:metadata type="subject-long">
468 <xsl:for-each select="node()/text()">
469 <xsl:if test="position() > 1">
470 <xsl:text>, </xsl:text>
472 <xsl:value-of select="." />
477 <xsl:for-each select="tmarc:d657">
478 <pz:metadata type="subject">
479 <xsl:value-of select="tmarc:sa" />
481 <pz:metadata type="subject-long">
482 <xsl:for-each select="node()/text()">
483 <xsl:if test="position() > 1">
484 <xsl:text>, </xsl:text>
486 <xsl:value-of select="." />
491 <xsl:for-each select="tmarc:d658">
492 <pz:metadata type="subject">
493 <xsl:value-of select="tmarc:sa" />
495 <pz:metadata type="subject-long">
496 <xsl:for-each select="node()/text()">
497 <xsl:if test="position() > 1">
498 <xsl:text>, </xsl:text>
500 <xsl:value-of select="." />
505 <xsl:for-each select="tmarc:d662">
506 <pz:metadata type="subject">
507 <xsl:value-of select="tmarc:sa" />
509 <pz:metadata type="subject-long">
510 <xsl:for-each select="node()/text()">
511 <xsl:if test="position() > 1">
512 <xsl:text>, </xsl:text>
514 <xsl:value-of select="." />
519 <xsl:for-each select="tmarc:d69X">
520 <pz:metadata type="subject">
521 <xsl:value-of select="tmarc:sa" />
523 <pz:metadata type="subject-long">
524 <xsl:for-each select="node()/text()">
525 <xsl:if test="position() > 1">
526 <xsl:text>, </xsl:text>
528 <xsl:value-of select="." />
533 <!-- or tmarc:d651 or tmarc:d653 or tmarc:d654 or tmarc:d655 or tmarc:d656
534 or tmarc:d657 or tmarc:d658 or tmarc:d662 or tmarc:d69X"> -->
536 <!-- <xsl:for-each select="tmarc:d600" > <pz:metadata type="subject">
537 <xsl:value-of select="tmarc:sa"/> </pz:metadata> <pz:metadata type="subject-long">
538 <xsl:for-each select="tmarc:sa tmarc:sb tmarc:sc tmarc:sd "> <xsl:if test="position()
539 > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:value-of select="."/> </xsl:for-each>
540 </pz:metadata> </xsl:for-each> -->
542 <xsl:for-each select="tmarc:d856">
543 <pz:metadata type="electronic-url">
544 <xsl:value-of select="tmarc:su" />
546 <pz:metadata type="electronic-text">
547 <xsl:if test="tmarc:sy">
548 <xsl:value-of select="tmarc:sy/text()" />
550 <xsl:if test="tmarc:s3">
551 <xsl:value-of select="tmarc:s3/text()" />
554 <pz:metadata type="electronic-note">
555 <xsl:value-of select="tmarc:sz" />
557 <pz:metadata type="electronic-format-instruction">
558 <xsl:value-of select="tmarc:si" />
560 <pz:metadata type="electronic-format-type">
561 <xsl:value-of select="tmarc:sq" />
565 <xsl:for-each select="tmarc:d773">
566 <pz:metadata type="citation">
567 <xsl:for-each select="*">
568 <xsl:value-of select="normalize-space(.)" />
569 <xsl:text> </xsl:text>
574 <xsl:for-each select="tmarc:d852">
575 <xsl:if test="tmarc:sy">
576 <pz:metadata type="publicnote">
577 <xsl:value-of select="tmarc:sy" />
580 <xsl:if test="tmarc:sh">
581 <pz:metadata type="callnumber">
582 <xsl:value-of select="tmarc:sh" />
587 <pz:metadata type="medium">
588 <xsl:value-of select="$medium" />
589 <xsl:if test="string-length($electronic) and $medium != 'electronic'">
590 <xsl:text> (electronic)</xsl:text>
594 <xsl:for-each select="tmarc:d900/tmarc:sa">
595 <pz:metadata type="fulltext">
596 <xsl:value-of select="." />
600 <!-- <xsl:if test="$fulltext_a"> <pz:metadata type="fulltext"> <xsl:value-of
601 select="$fulltext_a"/> </pz:metadata> </xsl:if> -->
603 <xsl:for-each select="tmarc:d900/tmarc:sb">
604 <pz:metadata type="fulltext">
605 <xsl:value-of select="." />
609 <!-- <xsl:if test="$fulltext_b"> <pz:metadata type="fulltext"> <xsl:value-of
610 select="$fulltext_b"/> </pz:metadata> </xsl:if> -->
612 <xsl:for-each select="tmarc:d907">
613 <!-- or tmarc:d901"> -->
614 <pz:metadata type="iii-id">
615 <xsl:value-of select="tmarc:sa" />
619 <xsl:for-each select="tmarc:d926">
620 <pz:metadata type="holding">
621 <xsl:for-each select="tmarc:s">
622 <xsl:if test="position() > 1">
623 <xsl:text> </xsl:text>
625 <xsl:value-of select="." />
630 <xsl:for-each select="tmarc:d948">
631 <pz:metadata type="holding">
632 <xsl:for-each select="tmarc:s">
633 <xsl:if test="position() > 1">
634 <xsl:text> </xsl:text>
636 <xsl:value-of select="." />
641 <xsl:for-each select="tmarc:d991">
642 <pz:metadata type="holding">
643 <xsl:for-each select="tmarc:s">
644 <xsl:if test="position() > 1">
645 <xsl:text> </xsl:text>
647 <xsl:value-of select="." />
652 <!-- passthrough id data -->
653 <xsl:for-each select="pz:metadata">
654 <xsl:copy-of select="." />
657 <!-- other stylesheets importing this might want to define this -->
658 <xsl:call-template name="record-hook" />
663 <xsl:template match="text()" />
665 <!-- TODO Does not work anymore -->
666 <xsl:template name="shortTitle">
667 <xsl:param name="tag" />
668 <xsl:for-each select="tmarc:d">
669 <xsl:value-of select="tmarc:sa" />
670 <xsl:value-of select="tmarc:sm" />
671 <xsl:value-of select="tmarc:sn" />
672 <xsl:value-of select="tmarc:sp" />
673 <xsl:value-of select="tmarc:sr" />
677 <!-- No working as expected -->
678 <xsl:template name="description">
679 <xsl:param name="element" />
680 <xsl:for-each select="$element">
681 <pz:metadata type="description">
682 <xsl:for-each select="node()">
683 <xsl:value-of select="text()" />
687 <xsl:apply-templates />
690 <!-- <xsl:for-each select="tmarc:d500"> <pz:metadata type="description">
691 <xsl:for-each select="node()"> <xsl:value-of select="text()"/> </xsl:for-each>
692 </pz:metadata> </xsl:for-each> -->
696 <xsl:template name="subject">
697 <xsl:param name="element" />
698 <xsl:for-each select="$element">
699 <pz:metadata type="subject">
700 <xsl:value-of select="tmarc:sa" />
702 <pz:metadata type="subject-long">
703 <xsl:for-each select="node()/text()">
704 <xsl:if test="position() > 1">
705 <xsl:text>, </xsl:text>
707 <xsl:value-of select="." />