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"
8 <xsl:param name="medium"/>
10 <!-- Extract metadata from MARC21/USMARC from streamlined marcxml format
11 http://www.loc.gov/marc/bibliographic/ecbdhome.html -->
12 <xsl:template name="record-hook" />
15 <xsl:template match="/">
16 <xsl:apply-templates />
19 <xsl:template match="tmarc:collection">
21 <xsl:apply-templates />
25 <xsl:template match="tmarc:r">
26 <xsl:variable name="title_medium" select="tmarc:d245/tmarc:sh" />
27 <xsl:variable name="journal_title" select="tmarc:d773/tmarc:st" />
28 <xsl:variable name="electronic_location_url" select="tmarc:d856/tmarc:su" />
29 <xsl:variable name="fulltext_a" select="tmarc:d900/tmarc:sa" />
30 <xsl:variable name="fulltext_b" select="tmarc:d900/tmarc:sb" />
31 <!-- Does not always hit the right substring. The field is not always fixed-width? -->
32 <xsl:variable name="control_lang" select="substring(tmarc:c008, 36, 3)" />
33 <xsl:variable name="contains110" select="tmarc:d110" />
34 <xsl:variable name="hasAuthorFields" select="tmarc:d100 or tmarc:d111" />
35 <xsl:variable name="typeofrec" select="substring(tmarc:l, 7, 1)"/>
36 <xsl:variable name="typeofvm" select="substring(tmarc:c008, 34, 1)"/>
37 <xsl:variable name="biblevel" select="substring(tmarc:l, 8, 1)"/>
38 <xsl:variable name="physdes" select="substring(tmarc:c007, 1, 1)"/>
39 <xsl:variable name="form1" select="substring(tmarc:c008, 24, 1)"/>
40 <xsl:variable name="form2" select="substring(tmarc:c008, 30, 1)"/>
41 <xsl:variable name="oclca" select="substring(tmarc:c007, 1, 1)"/>
42 <xsl:variable name="oclcb" select="substring(tmarc:c007, 2, 1)"/>
43 <xsl:variable name="oclcd" select="substring(tmarc:c007, 4, 1)"/>
44 <xsl:variable name="oclce" select="substring(tmarc:c007, 5, 1)"/>
45 <xsl:variable name="typeofserial" select="substring(tmarc:c008, 22, 1)"/>
47 <xsl:variable name="electronic">
49 <xsl:when test="$form1='s' or $form1='q' or $form1='o' or
50 $form2='s' or $form2='q' or $form2='o'">
51 <xsl:text>yes</xsl:text>
57 <xsl:variable name="vmedium">
59 <xsl:when test="string-length($medium)"><xsl:value-of select="$medium" /></xsl:when>
60 <xsl:when test="($typeofrec='a' or $typeofrec='t') and $biblevel='m'">book</xsl:when>
61 <xsl:when test="$typeofrec='j' or $typeofrec='i'">
62 <xsl:text>recording</xsl:text>
64 <xsl:when test="$oclcb='d' and $oclcd='f'">-cd</xsl:when>
65 <xsl:when test="$oclcb='s'">-cassette</xsl:when>
66 <xsl:when test="$oclcb='d' and $oclcd='a' or $oclcd='b' or
67 $oclcd='c' or $oclcd='d' or $oclcd='e'">-vinyl</xsl:when>
70 <xsl:when test="$typeofrec='g'">
72 <xsl:when test="$typeofvm='m' or $typeofvm='v'">
73 <xsl:text>video</xsl:text>
75 <xsl:when test="$oclca='v' and $oclcb='d' and $oclce='v'">-dvd</xsl:when>
76 <xsl:when test="$oclca='v' and $oclcb='d' and $oclce='s'">-blu-ray</xsl:when>
77 <xsl:when test="$oclca='v' and $oclcb='f' and $oclce='b'">-vhs</xsl:when>
80 <xsl:otherwise>audio-visual</xsl:otherwise>
83 <xsl:when test="$typeofrec='a' and $biblevel='s'">
85 <xsl:when test="$typeofserial='n'">newspaper</xsl:when>
86 <xsl:otherwise>journal</xsl:otherwise>
89 <xsl:when test="$typeofrec='e' or $typeofrec='f'">map</xsl:when>
90 <xsl:when test="$typeofrec='c' or $typeofrec='d'">music-score</xsl:when>
91 <xsl:when test="$form1='a' or $form1='b' or $form1='c'">microform</xsl:when>
92 <xsl:when test="$typeofrec='t'">thesis</xsl:when>
93 <!-- <xsl:when test="$journal_title">article</xsl:when> -->
94 <xsl:when test="$typeofrec='a' or $typeofrec='i' and
95 ($typeofserial='d' or $typeofserial='w')">web</xsl:when>
96 <xsl:when test="$typeofrec='a' and $biblevel='b'">article</xsl:when>
97 <xsl:when test="$typeofrec='m'">electronic</xsl:when>
98 <xsl:when test="$title_medium">
99 <xsl:value-of select="translate($title_medium, ' []/:', '')" />
102 <xsl:text>other</xsl:text>
109 <xsl:attribute name="mergekey">
110 <xsl:text>title </xsl:text>
111 <xsl:value-of select="tmarc:d245/tmarc:sa" />
112 <xsl:text> author </xsl:text>
113 <xsl:value-of select="tmarc:d100/tmarc:sa" />
114 <xsl:text> medium </xsl:text>
115 <xsl:value-of select="$medium" />
119 <xsl:for-each select="tmarc:c001">
120 <pz:metadata type="id">
121 <xsl:value-of select="." />
125 <xsl:for-each select="tmarc:d010">
126 <pz:metadata type="lccn">
127 <xsl:value-of select="tmarc:sa" />
131 <xsl:for-each select="tmarc:d020">
132 <pz:metadata type="isbn">
133 <xsl:value-of select="tmarc:sa" />
137 <xsl:for-each select="tmarc:d022">
138 <pz:metadata type="issn">
139 <xsl:value-of select="tmarc:sa" />
143 <xsl:for-each select="tmarc:d027">
144 <pz:metadata type="tech-rep-nr">
145 <xsl:value-of select="tmarc:sa" />
149 <xsl:for-each select="tmarc:d035">
150 <pz:metadata type="system-control-nr">
152 <xsl:when test="tmarc:sa">
153 <xsl:value-of select="tmarc:sa"/>
156 <xsl:value-of select="tmarc:sb"/>
162 <xsl:for-each select="tmarc:d100">
163 <pz:metadata type="author">
164 <xsl:value-of select="tmarc:sa" />
166 <pz:metadata type="author-title">
167 <xsl:value-of select="tmarc:sc" />
169 <pz:metadata type="author-date">
170 <xsl:value-of select="tmarc:sd" />
174 <xsl:for-each select="tmarc:d110">
175 <pz:metadata type="corporate-name">
176 <xsl:value-of select="tmarc:sa" />
178 <pz:metadata type="corporate-location">
179 <xsl:value-of select="tmarc:sc" />
181 <pz:metadata type="corporate-date">
182 <xsl:value-of select="tmarc:sd" />
186 <xsl:for-each select="tmarc:d111">
187 <pz:metadata type="meeting-name">
188 <xsl:value-of select="tmarc:sa" />
190 <pz:metadata type="meeting-location">
191 <xsl:value-of select="tmarc:sc" />
193 <pz:metadata type="meeting-date">
194 <xsl:value-of select="tmarc:sd" />
198 <xsl:for-each select="tmarc:d260">
199 <pz:metadata type="date">
200 <xsl:value-of select="translate(tmarc:sc, 'cp[].', '')" />
204 <xsl:for-each select="tmarc:d130">
205 <pz:metadata type="title-uniform">
206 <xsl:value-of select="tmarc:sa" />
208 <pz:metadata type="title-uniform-media">
209 <xsl:value-of select="tmarc:sm" />
211 <pz:metadata type="title-uniform-parts">
212 <xsl:value-of select="tmarc:sn" />
214 <pz:metadata type="title-uniform-partname">
215 <xsl:value-of select="tmarc:sp" />
217 <pz:metadata type="title-uniform-key">
218 <xsl:value-of select="tmarc:sr" />
222 <xsl:for-each select="tmarc:d245">
223 <pz:metadata type="title">
224 <xsl:value-of select="tmarc:sa" />
226 <pz:metadata type="title-remainder">
227 <xsl:value-of select="tmarc:sb" />
229 <pz:metadata type="title-responsibility">
230 <xsl:value-of select="tmarc:sc" />
232 <pz:metadata type="title-dates">
233 <xsl:value-of select="tmarc:sf" />
235 <pz:metadata type="title-medium">
236 <xsl:value-of select="tmarc:sh" />
238 <pz:metadata type="title-number-section">
239 <xsl:value-of select="tmarc:sn" />
241 <pz:metadata type="title-complete">
242 <xsl:value-of select="tmarc:sa" />
243 <xsl:if test="tmarc:sb" ><xsl:value-of select="concat(' ', tmarc:sb)" /></xsl:if>
247 <xsl:for-each select="tmarc:d250">
248 <pz:metadata type="edition">
249 <xsl:value-of select="tmarc:sa" />
253 <xsl:for-each select="tmarc:d260">
254 <pz:metadata type="publication-place">
255 <xsl:value-of select="tmarc:sa" />
257 <pz:metadata type="publication-name">
258 <xsl:value-of select="tmarc:sb" />
260 <pz:metadata type="publication-date">
261 <xsl:value-of select="tmarc:sc" />
265 <xsl:for-each select="tmarc:d300">
266 <pz:metadata type="physical-extent">
267 <xsl:value-of select="tmarc:sa" />
269 <pz:metadata type="physical-format">
270 <xsl:value-of select="tmarc:sb" />
272 <pz:metadata type="physical-dimensions">
273 <xsl:value-of select="tmarc:sc" />
275 <pz:metadata type="physical-accomp">
276 <xsl:value-of select="tmarc:se" />
278 <pz:metadata type="physical-unittype">
279 <xsl:value-of select="tmarc:sf" />
281 <pz:metadata type="physical-unitsize">
282 <xsl:value-of select="tmarc:sg" />
284 <pz:metadata type="physical-specified">
285 <xsl:value-of select="tmarc:s3" />
289 <xsl:for-each select="tmarc:d440">
290 <pz:metadata type="series-title">
291 <xsl:value-of select="tmarc:sa" />
295 <xsl:for-each select="tmarc:d500">
296 <pz:metadata type="description">
297 <xsl:for-each select="node()">
298 <xsl:value-of select="text()" />
303 <xsl:for-each select="tmarc:d505">
304 <pz:metadata type="description">
305 <xsl:for-each select="node()">
306 <xsl:value-of select="text()" />
311 <xsl:for-each select="tmarc:d518">
312 <pz:metadata type="description">
313 <xsl:for-each select="node()">
314 <xsl:value-of select="text()" />
319 <xsl:for-each select="tmarc:d520">
320 <pz:metadata type="description">
321 <xsl:for-each select="node()">
322 <xsl:value-of select="text()" />
327 <xsl:for-each select="tmarc:d522">
328 <pz:metadata type="description">
329 <xsl:for-each select="node()">
330 <xsl:value-of select="text()" />
335 <xsl:for-each select="tmarc:d600">
336 <pz:metadata type="subject">
337 <xsl:value-of select="tmarc:sa" />
339 <pz:metadata type="subject-long">
340 <xsl:for-each select="node()/text()">
341 <xsl:if test="position() > 1">
342 <xsl:text>, </xsl:text>
344 <xsl:value-of select="." />
349 <xsl:for-each select="tmarc:d610">
350 <pz:metadata type="subject">
351 <xsl:value-of select="tmarc:sa" />
353 <pz:metadata type="subject-long">
354 <xsl:for-each select="node()/text()">
355 <xsl:if test="position() > 1">
356 <xsl:text>, </xsl:text>
358 <xsl:value-of select="." />
363 <xsl:for-each select="tmarc:d611">
364 <pz:metadata type="subject">
365 <xsl:value-of select="tmarc:sa" />
367 <pz:metadata type="subject-long">
368 <xsl:for-each select="node()/text()">
369 <xsl:if test="position() > 1">
370 <xsl:text>, </xsl:text>
372 <xsl:value-of select="." />
377 <xsl:for-each select="tmarc:d630">
378 <pz:metadata type="subject">
379 <xsl:value-of select="tmarc:sa" />
381 <pz:metadata type="subject-long">
382 <xsl:for-each select="node()/text()">
383 <xsl:if test="position() > 1">
384 <xsl:text>, </xsl:text>
386 <xsl:value-of select="." />
391 <xsl:for-each select="tmarc:d648">
392 <pz:metadata type="subject">
393 <xsl:value-of select="tmarc:sa" />
395 <pz:metadata type="subject-long">
396 <xsl:for-each select="node()/text()">
397 <xsl:if test="position() > 1">
398 <xsl:text>, </xsl:text>
400 <xsl:value-of select="." />
405 <xsl:for-each select="tmarc:d650">
406 <pz:metadata type="subject">
407 <xsl:value-of select="tmarc:sa" />
409 <pz:metadata type="subject-long">
410 <xsl:for-each select="node()/text()">
411 <xsl:if test="position() > 1">
412 <xsl:text>, </xsl:text>
414 <xsl:value-of select="." />
419 <xsl:for-each select="tmarc:d651">
420 <pz:metadata type="subject">
421 <xsl:value-of select="tmarc:sa" />
423 <pz:metadata type="subject-long">
424 <xsl:for-each select="node()/text()">
425 <xsl:if test="position() > 1">
426 <xsl:text>, </xsl:text>
428 <xsl:value-of select="." />
433 <xsl:for-each select="tmarc:d653">
434 <pz:metadata type="subject">
435 <xsl:value-of select="tmarc:sa" />
437 <pz:metadata type="subject-long">
438 <xsl:for-each select="node()/text()">
439 <xsl:if test="position() > 1">
440 <xsl:text>, </xsl:text>
442 <xsl:value-of select="." />
447 <xsl:for-each select="tmarc:d654">
448 <pz:metadata type="subject">
449 <xsl:value-of select="tmarc:sa" />
451 <pz:metadata type="subject-long">
452 <xsl:for-each select="node()/text()">
453 <xsl:if test="position() > 1">
454 <xsl:text>, </xsl:text>
456 <xsl:value-of select="." />
461 <xsl:for-each select="tmarc:d655">
462 <pz:metadata type="subject">
463 <xsl:value-of select="tmarc:sa" />
465 <pz:metadata type="subject-long">
466 <xsl:for-each select="node()/text()">
467 <xsl:if test="position() > 1">
468 <xsl:text>, </xsl:text>
470 <xsl:value-of select="." />
475 <xsl:for-each select="tmarc:d656">
476 <pz:metadata type="subject">
477 <xsl:value-of select="tmarc:sa" />
479 <pz:metadata type="subject-long">
480 <xsl:for-each select="node()/text()">
481 <xsl:if test="position() > 1">
482 <xsl:text>, </xsl:text>
484 <xsl:value-of select="." />
489 <xsl:for-each select="tmarc:d657">
490 <pz:metadata type="subject">
491 <xsl:value-of select="tmarc:sa" />
493 <pz:metadata type="subject-long">
494 <xsl:for-each select="node()/text()">
495 <xsl:if test="position() > 1">
496 <xsl:text>, </xsl:text>
498 <xsl:value-of select="." />
503 <xsl:for-each select="tmarc:d658">
504 <pz:metadata type="subject">
505 <xsl:value-of select="tmarc:sa" />
507 <pz:metadata type="subject-long">
508 <xsl:for-each select="node()/text()">
509 <xsl:if test="position() > 1">
510 <xsl:text>, </xsl:text>
512 <xsl:value-of select="." />
517 <xsl:for-each select="tmarc:d662">
518 <pz:metadata type="subject">
519 <xsl:value-of select="tmarc:sa" />
521 <pz:metadata type="subject-long">
522 <xsl:for-each select="node()/text()">
523 <xsl:if test="position() > 1">
524 <xsl:text>, </xsl:text>
526 <xsl:value-of select="." />
531 <xsl:for-each select="tmarc:d69X">
532 <pz:metadata type="subject">
533 <xsl:value-of select="tmarc:sa" />
535 <pz:metadata type="subject-long">
536 <xsl:for-each select="node()/text()">
537 <xsl:if test="position() > 1">
538 <xsl:text>, </xsl:text>
540 <xsl:value-of select="." />
545 <!-- or tmarc:d651 or tmarc:d653 or tmarc:d654 or tmarc:d655 or tmarc:d656
546 or tmarc:d657 or tmarc:d658 or tmarc:d662 or tmarc:d69X"> -->
548 <!-- <xsl:for-each select="tmarc:d600" > <pz:metadata type="subject">
549 <xsl:value-of select="tmarc:sa"/> </pz:metadata> <pz:metadata type="subject-long">
550 <xsl:for-each select="tmarc:sa tmarc:sb tmarc:sc tmarc:sd "> <xsl:if test="position()
551 > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:value-of select="."/> </xsl:for-each>
552 </pz:metadata> </xsl:for-each> -->
554 <xsl:for-each select="tmarc:d856">
555 <pz:metadata type="electronic-url">
556 <xsl:value-of select="tmarc:su" />
558 <pz:metadata type="electronic-text">
559 <xsl:if test="tmarc:sy">
560 <xsl:value-of select="tmarc:sy/text()" />
562 <xsl:if test="tmarc:s3">
563 <xsl:value-of select="tmarc:s3/text()" />
566 <pz:metadata type="electronic-note">
567 <xsl:value-of select="tmarc:sz" />
569 <pz:metadata type="electronic-format-instruction">
570 <xsl:value-of select="tmarc:si" />
572 <pz:metadata type="electronic-format-type">
573 <xsl:value-of select="tmarc:sq" />
577 <xsl:for-each select="tmarc:d773">
578 <pz:metadata type="citation">
579 <xsl:for-each select="*">
580 <xsl:value-of select="normalize-space(.)" />
581 <xsl:text> </xsl:text>
586 <xsl:for-each select="tmarc:d852">
587 <xsl:if test="tmarc:sy">
588 <pz:metadata type="publicnote">
589 <xsl:value-of select="tmarc:sy" />
592 <xsl:if test="tmarc:sh">
593 <pz:metadata type="callnumber">
594 <xsl:value-of select="tmarc:sh" />
599 <pz:metadata type="medium">
600 <xsl:value-of select="$vmedium" />
601 <xsl:if test="string-length($electronic) and $vmedium != 'electronic'">
602 <xsl:text> (electronic)</xsl:text>
606 <xsl:for-each select="tmarc:d900/tmarc:sa">
607 <pz:metadata type="fulltext">
608 <xsl:value-of select="." />
612 <!-- <xsl:if test="$fulltext_a"> <pz:metadata type="fulltext"> <xsl:value-of
613 select="$fulltext_a"/> </pz:metadata> </xsl:if> -->
615 <xsl:for-each select="tmarc:d900/tmarc:sb">
616 <pz:metadata type="fulltext">
617 <xsl:value-of select="." />
621 <!-- <xsl:if test="$fulltext_b"> <pz:metadata type="fulltext"> <xsl:value-of
622 select="$fulltext_b"/> </pz:metadata> </xsl:if> -->
624 <xsl:for-each select="tmarc:d907">
625 <!-- or tmarc:d901"> -->
626 <pz:metadata type="iii-id">
627 <xsl:value-of select="tmarc:sa" />
631 <xsl:for-each select="tmarc:d926">
632 <pz:metadata type="locallocation">
633 <xsl:choose><xsl:when test="tmarc:sa">
634 <xsl:value-of select="tmarc:sa"/>
635 </xsl:when><xsl:otherwise>
636 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
637 </xsl:otherwise></xsl:choose>
639 <pz:metadata type="callnumber">
640 <xsl:choose><xsl:when test="tmarc:sc">
641 <xsl:value-of select="tmarc:sc"/>
642 </xsl:when><xsl:otherwise>
643 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
644 </xsl:otherwise></xsl:choose>
646 <pz:metadata type="available">
647 <xsl:choose><xsl:when test="tmarc:se">
648 <xsl:value-of select="tmarc:se"/>
649 </xsl:when><xsl:otherwise>
650 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
651 </xsl:otherwise></xsl:choose>
655 <xsl:for-each select="tmarc:d948">
656 <pz:metadata type="holding">
657 <xsl:for-each select="tmarc:s">
658 <xsl:if test="position() > 1">
659 <xsl:text> </xsl:text>
661 <xsl:value-of select="." />
666 <xsl:for-each select="tmarc:d991">
667 <pz:metadata type="holding">
668 <xsl:for-each select="tmarc:s">
669 <xsl:if test="position() > 1">
670 <xsl:text> </xsl:text>
672 <xsl:value-of select="." />
677 <xsl:for-each select="tmarc:d999">
678 <pz:metadata type="localid">
680 <xsl:when test="tmarc:sa">
681 <xsl:value-of select="tmarc:sa"/>
683 <xsl:when test="tmarc:sc">
684 <xsl:value-of select="tmarc:sc"/>
687 <xsl:value-of select="tmarc:sd"/>
694 <!-- passthrough id data -->
695 <xsl:for-each select="pz:metadata">
696 <xsl:copy-of select="." />
699 <!-- other stylesheets importing this might want to define this -->
700 <xsl:call-template name="record-hook" />
705 <xsl:template match="text()" />
707 <!-- TODO Does not work anymore -->
708 <xsl:template name="shortTitle">
709 <xsl:param name="tag" />
710 <xsl:for-each select="tmarc:d">
711 <xsl:value-of select="tmarc:sa" />
712 <xsl:value-of select="tmarc:sm" />
713 <xsl:value-of select="tmarc:sn" />
714 <xsl:value-of select="tmarc:sp" />
715 <xsl:value-of select="tmarc:sr" />
719 <!-- No working as expected -->
720 <xsl:template name="description">
721 <xsl:param name="element" />
722 <xsl:for-each select="$element">
723 <pz:metadata type="description">
724 <xsl:for-each select="node()">
725 <xsl:value-of select="text()" />
729 <xsl:apply-templates />
732 <!-- <xsl:for-each select="tmarc:d500"> <pz:metadata type="description">
733 <xsl:for-each select="node()"> <xsl:value-of select="text()"/> </xsl:for-each>
734 </pz:metadata> </xsl:for-each> -->
738 <xsl:template name="subject">
739 <xsl:param name="element" />
740 <xsl:for-each select="$element">
741 <pz:metadata type="subject">
742 <xsl:value-of select="tmarc:sa" />
744 <pz:metadata type="subject-long">
745 <xsl:for-each select="node()/text()">
746 <xsl:if test="position() > 1">
747 <xsl:text>, </xsl:text>
749 <xsl:value-of select="." />