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>
107 <xsl:variable name="has_fulltext">
109 <xsl:when test="tmarc:d856/tmarc:sq">
110 <xsl:text>yes</xsl:text>
112 <xsl:when test="tmarc:d856/tmarc:si='TEXT*'">
113 <xsl:text>yes</xsl:text>
116 <xsl:text>no</xsl:text>
123 <xsl:attribute name="mergekey">
124 <xsl:text>title </xsl:text>
125 <xsl:value-of select="tmarc:d245/tmarc:sa" />
126 <xsl:text> author </xsl:text>
127 <xsl:value-of select="tmarc:d100/tmarc:sa" />
128 <xsl:text> medium </xsl:text>
129 <xsl:value-of select="$medium" />
133 <xsl:for-each select="tmarc:c001">
134 <pz:metadata type="id">
135 <xsl:value-of select="." />
139 <xsl:for-each select="tmarc:d010">
140 <pz:metadata type="lccn">
141 <xsl:value-of select="tmarc:sa" />
145 <xsl:for-each select="tmarc:d020">
146 <pz:metadata type="isbn">
147 <xsl:value-of select="tmarc:sa" />
151 <xsl:for-each select="tmarc:d022">
152 <pz:metadata type="issn">
153 <xsl:value-of select="tmarc:sa" />
157 <xsl:for-each select="tmarc:d027">
158 <pz:metadata type="tech-rep-nr">
159 <xsl:value-of select="tmarc:sa" />
163 <xsl:for-each select="tmarc:d035">
164 <pz:metadata type="system-control-nr">
166 <xsl:when test="tmarc:sa">
167 <xsl:value-of select="tmarc:sa"/>
170 <xsl:value-of select="tmarc:sb"/>
176 <xsl:for-each select="tmarc:d100">
177 <pz:metadata type="author">
178 <xsl:value-of select="tmarc:sa" />
180 <pz:metadata type="author-title">
181 <xsl:value-of select="tmarc:sc" />
183 <pz:metadata type="author-date">
184 <xsl:value-of select="tmarc:sd" />
188 <xsl:for-each select="tmarc:d110">
189 <pz:metadata type="corporate-name">
190 <xsl:value-of select="tmarc:sa" />
192 <pz:metadata type="corporate-location">
193 <xsl:value-of select="tmarc:sc" />
195 <pz:metadata type="corporate-date">
196 <xsl:value-of select="tmarc:sd" />
200 <xsl:for-each select="tmarc:d111">
201 <pz:metadata type="meeting-name">
202 <xsl:value-of select="tmarc:sa" />
204 <pz:metadata type="meeting-location">
205 <xsl:value-of select="tmarc:sc" />
207 <pz:metadata type="meeting-date">
208 <xsl:value-of select="tmarc:sd" />
212 <xsl:for-each select="tmarc:d260">
213 <pz:metadata type="date">
214 <xsl:value-of select="translate(tmarc:sc, 'cp[].', '')" />
218 <xsl:for-each select="tmarc:d130">
219 <pz:metadata type="title-uniform">
220 <xsl:value-of select="tmarc:sa" />
222 <pz:metadata type="title-uniform-media">
223 <xsl:value-of select="tmarc:sm" />
225 <pz:metadata type="title-uniform-parts">
226 <xsl:value-of select="tmarc:sn" />
228 <pz:metadata type="title-uniform-partname">
229 <xsl:value-of select="tmarc:sp" />
231 <pz:metadata type="title-uniform-key">
232 <xsl:value-of select="tmarc:sr" />
236 <xsl:for-each select="tmarc:d245">
237 <pz:metadata type="title">
238 <xsl:value-of select="tmarc:sa" />
240 <pz:metadata type="title-remainder">
241 <xsl:value-of select="tmarc:sb" />
243 <pz:metadata type="title-responsibility">
244 <xsl:value-of select="tmarc:sc" />
246 <pz:metadata type="title-dates">
247 <xsl:value-of select="tmarc:sf" />
249 <pz:metadata type="title-medium">
250 <xsl:value-of select="tmarc:sh" />
252 <pz:metadata type="title-number-section">
253 <xsl:value-of select="tmarc:sn" />
255 <pz:metadata type="title-complete">
256 <xsl:value-of select="tmarc:sa" />
257 <xsl:if test="tmarc:sb" ><xsl:value-of select="concat(' ', tmarc:sb)" /></xsl:if>
261 <xsl:for-each select="tmarc:d250">
262 <pz:metadata type="edition">
263 <xsl:value-of select="tmarc:sa" />
267 <xsl:for-each select="tmarc:d260">
268 <pz:metadata type="publication-place">
269 <xsl:value-of select="tmarc:sa" />
271 <pz:metadata type="publication-name">
272 <xsl:value-of select="tmarc:sb" />
274 <pz:metadata type="publication-date">
275 <xsl:value-of select="tmarc:sc" />
279 <xsl:for-each select="tmarc:d300">
280 <pz:metadata type="physical-extent">
281 <xsl:value-of select="tmarc:sa" />
283 <pz:metadata type="physical-format">
284 <xsl:value-of select="tmarc:sb" />
286 <pz:metadata type="physical-dimensions">
287 <xsl:value-of select="tmarc:sc" />
289 <pz:metadata type="physical-accomp">
290 <xsl:value-of select="tmarc:se" />
292 <pz:metadata type="physical-unittype">
293 <xsl:value-of select="tmarc:sf" />
295 <pz:metadata type="physical-unitsize">
296 <xsl:value-of select="tmarc:sg" />
298 <pz:metadata type="physical-specified">
299 <xsl:value-of select="tmarc:s3" />
303 <xsl:for-each select="tmarc:d440">
304 <pz:metadata type="series-title">
305 <xsl:value-of select="tmarc:sa" />
309 <xsl:for-each select="tmarc:d500">
310 <pz:metadata type="description">
311 <xsl:for-each select="node()">
312 <xsl:value-of select="text()" />
317 <xsl:for-each select="tmarc:d505">
318 <pz:metadata type="description">
319 <xsl:for-each select="node()">
320 <xsl:value-of select="text()" />
325 <xsl:for-each select="tmarc:d518">
326 <pz:metadata type="description">
327 <xsl:for-each select="node()">
328 <xsl:value-of select="text()" />
333 <xsl:for-each select="tmarc:d520">
334 <pz:metadata type="description">
335 <xsl:for-each select="node()">
336 <xsl:value-of select="text()" />
341 <xsl:for-each select="tmarc:d522">
342 <pz:metadata type="description">
343 <xsl:for-each select="node()">
344 <xsl:value-of select="text()" />
349 <xsl:for-each select="tmarc:d600">
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:d610">
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:d611">
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:d630">
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:d648">
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:d650">
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:d651">
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:d653">
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:d654">
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:d655">
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:d656">
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:d657">
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:d658">
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:d662">
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 <xsl:for-each select="tmarc:d69X">
546 <pz:metadata type="subject">
547 <xsl:value-of select="tmarc:sa" />
549 <pz:metadata type="subject-long">
550 <xsl:for-each select="node()/text()">
551 <xsl:if test="position() > 1">
552 <xsl:text>, </xsl:text>
554 <xsl:value-of select="." />
559 <!-- or tmarc:d651 or tmarc:d653 or tmarc:d654 or tmarc:d655 or tmarc:d656
560 or tmarc:d657 or tmarc:d658 or tmarc:d662 or tmarc:d69X"> -->
562 <!-- <xsl:for-each select="tmarc:d600" > <pz:metadata type="subject">
563 <xsl:value-of select="tmarc:sa"/> </pz:metadata> <pz:metadata type="subject-long">
564 <xsl:for-each select="tmarc:sa tmarc:sb tmarc:sc tmarc:sd "> <xsl:if test="position()
565 > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:value-of select="."/> </xsl:for-each>
566 </pz:metadata> </xsl:for-each> -->
568 <xsl:for-each select="tmarc:d856">
569 <pz:metadata type="electronic-url">
570 <xsl:value-of select="tmarc:su" />
572 <pz:metadata type="electronic-text">
573 <xsl:if test="tmarc:sy">
574 <xsl:value-of select="tmarc:sy/text()" />
576 <xsl:if test="tmarc:s3">
577 <xsl:value-of select="tmarc:s3/text()" />
580 <pz:metadata type="electronic-note">
581 <xsl:value-of select="tmarc:sz" />
583 <pz:metadata type="electronic-format-instruction">
584 <xsl:value-of select="tmarc:si" />
586 <pz:metadata type="electronic-format-type">
587 <xsl:value-of select="tmarc:sq" />
591 <xsl:for-each select="tmarc:d773">
592 <pz:metadata type="citation">
593 <xsl:for-each select="*">
594 <xsl:value-of select="normalize-space(.)" />
595 <xsl:text> </xsl:text>
598 <xsl:if test="tmarc:st">
599 <pz:metadata type="journal-title">
600 <xsl:value-of select="tmarc:st"/>
603 <xsl:if test="tmarc:sg">
604 <pz:metadata type="journal-subpart">
605 <xsl:value-of select="tmarc:sg"/> <xsl:value-of select="tmarc:sp"/>
610 <xsl:for-each select="tmarc:d852">
611 <xsl:if test="tmarc:sy">
612 <pz:metadata type="publicnote">
613 <xsl:value-of select="tmarc:sy" />
616 <xsl:if test="tmarc:sh">
617 <pz:metadata type="callnumber">
618 <xsl:value-of select="tmarc:sh" />
623 <pz:metadata type="medium">
624 <xsl:value-of select="$vmedium" />
625 <xsl:if test="string-length($electronic) and $vmedium != 'electronic'">
626 <xsl:text> (electronic)</xsl:text>
630 <xsl:for-each select="tmarc:d900/tmarc:sa">
631 <pz:metadata type="fulltext">
632 <xsl:value-of select="." />
636 <!-- <xsl:if test="$fulltext_a"> <pz:metadata type="fulltext"> <xsl:value-of
637 select="$fulltext_a"/> </pz:metadata> </xsl:if> -->
639 <xsl:for-each select="tmarc:d900/tmarc:sb">
640 <pz:metadata type="fulltext">
641 <xsl:value-of select="." />
645 <!-- <xsl:if test="$fulltext_b"> <pz:metadata type="fulltext"> <xsl:value-of
646 select="$fulltext_b"/> </pz:metadata> </xsl:if> -->
648 <pz:metadata type="has-fulltext">
649 <xsl:value-of select="$has_fulltext"/>
652 <xsl:for-each select="tmarc:d907">
653 <!-- or tmarc:d901"> -->
654 <pz:metadata type="iii-id">
655 <xsl:value-of select="tmarc:sa" />
659 <xsl:for-each select="tmarc:d926">
660 <pz:metadata type="locallocation">
661 <xsl:choose><xsl:when test="tmarc:sa">
662 <xsl:value-of select="tmarc:sa"/>
663 </xsl:when><xsl:otherwise>
664 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
665 </xsl:otherwise></xsl:choose>
667 <pz:metadata type="callnumber">
668 <xsl:choose><xsl:when test="tmarc:sc">
669 <xsl:value-of select="tmarc:sc"/>
670 </xsl:when><xsl:otherwise>
671 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
672 </xsl:otherwise></xsl:choose>
674 <pz:metadata type="available">
675 <xsl:choose><xsl:when test="tmarc:se">
676 <xsl:value-of select="tmarc:se"/>
677 </xsl:when><xsl:otherwise>
678 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
679 </xsl:otherwise></xsl:choose>
683 <xsl:for-each select="tmarc:d948">
684 <pz:metadata type="holding">
685 <xsl:for-each select="tmarc:s">
686 <xsl:if test="position() > 1">
687 <xsl:text> </xsl:text>
689 <xsl:value-of select="." />
694 <xsl:for-each select="tmarc:d991">
695 <pz:metadata type="holding">
696 <xsl:for-each select="tmarc:s">
697 <xsl:if test="position() > 1">
698 <xsl:text> </xsl:text>
700 <xsl:value-of select="." />
705 <xsl:for-each select="tmarc:d999">
706 <pz:metadata type="localid">
708 <xsl:when test="tmarc:sa">
709 <xsl:value-of select="tmarc:sa"/>
711 <xsl:when test="tmarc:sc">
712 <xsl:value-of select="tmarc:sc"/>
715 <xsl:value-of select="tmarc:sd"/>
722 <!-- passthrough id data -->
723 <xsl:for-each select="pz:metadata">
724 <xsl:copy-of select="." />
727 <!-- other stylesheets importing this might want to define this -->
728 <xsl:call-template name="record-hook" />
733 <xsl:template match="text()" />
735 <!-- TODO Does not work anymore -->
736 <xsl:template name="shortTitle">
737 <xsl:param name="tag" />
738 <xsl:for-each select="tmarc:d">
739 <xsl:value-of select="tmarc:sa" />
740 <xsl:value-of select="tmarc:sm" />
741 <xsl:value-of select="tmarc:sn" />
742 <xsl:value-of select="tmarc:sp" />
743 <xsl:value-of select="tmarc:sr" />
747 <!-- No working as expected -->
748 <xsl:template name="description">
749 <xsl:param name="element" />
750 <xsl:for-each select="$element">
751 <pz:metadata type="description">
752 <xsl:for-each select="node()">
753 <xsl:value-of select="text()" />
757 <xsl:apply-templates />
760 <!-- <xsl:for-each select="tmarc:d500"> <pz:metadata type="description">
761 <xsl:for-each select="node()"> <xsl:value-of select="text()"/> </xsl:for-each>
762 </pz:metadata> </xsl:for-each> -->
766 <xsl:template name="subject">
767 <xsl:param name="element" />
768 <xsl:for-each select="$element">
769 <pz:metadata type="subject">
770 <xsl:value-of select="tmarc:sa" />
772 <pz:metadata type="subject-long">
773 <xsl:for-each select="node()/text()">
774 <xsl:if test="position() > 1">
775 <xsl:text>, </xsl:text>
777 <xsl:value-of select="." />