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:d911">
350 <pz:metadata type="description">
351 <xsl:for-each select="node()">
352 <xsl:value-of select="text()" />
357 <xsl:for-each select="tmarc:d600">
358 <pz:metadata type="subject">
359 <xsl:value-of select="tmarc:sa" />
361 <pz:metadata type="subject-long">
362 <xsl:for-each select="node()/text()">
363 <xsl:if test="position() > 1">
364 <xsl:text>, </xsl:text>
366 <xsl:value-of select="." />
371 <xsl:for-each select="tmarc:d610">
372 <pz:metadata type="subject">
373 <xsl:value-of select="tmarc:sa" />
375 <pz:metadata type="subject-long">
376 <xsl:for-each select="node()/text()">
377 <xsl:if test="position() > 1">
378 <xsl:text>, </xsl:text>
380 <xsl:value-of select="." />
385 <xsl:for-each select="tmarc:d611">
386 <pz:metadata type="subject">
387 <xsl:value-of select="tmarc:sa" />
389 <pz:metadata type="subject-long">
390 <xsl:for-each select="node()/text()">
391 <xsl:if test="position() > 1">
392 <xsl:text>, </xsl:text>
394 <xsl:value-of select="." />
399 <xsl:for-each select="tmarc:d630">
400 <pz:metadata type="subject">
401 <xsl:value-of select="tmarc:sa" />
403 <pz:metadata type="subject-long">
404 <xsl:for-each select="node()/text()">
405 <xsl:if test="position() > 1">
406 <xsl:text>, </xsl:text>
408 <xsl:value-of select="." />
413 <xsl:for-each select="tmarc:d648">
414 <pz:metadata type="subject">
415 <xsl:value-of select="tmarc:sa" />
417 <pz:metadata type="subject-long">
418 <xsl:for-each select="node()/text()">
419 <xsl:if test="position() > 1">
420 <xsl:text>, </xsl:text>
422 <xsl:value-of select="." />
427 <xsl:for-each select="tmarc:d650">
428 <pz:metadata type="subject">
429 <xsl:value-of select="tmarc:sa" />
431 <pz:metadata type="subject-long">
432 <xsl:for-each select="node()/text()">
433 <xsl:if test="position() > 1">
434 <xsl:text>, </xsl:text>
436 <xsl:value-of select="." />
441 <xsl:for-each select="tmarc:d651">
442 <pz:metadata type="subject">
443 <xsl:value-of select="tmarc:sa" />
445 <pz:metadata type="subject-long">
446 <xsl:for-each select="node()/text()">
447 <xsl:if test="position() > 1">
448 <xsl:text>, </xsl:text>
450 <xsl:value-of select="." />
455 <xsl:for-each select="tmarc:d653">
456 <pz:metadata type="subject">
457 <xsl:value-of select="tmarc:sa" />
459 <pz:metadata type="subject-long">
460 <xsl:for-each select="node()/text()">
461 <xsl:if test="position() > 1">
462 <xsl:text>, </xsl:text>
464 <xsl:value-of select="." />
469 <xsl:for-each select="tmarc:d654">
470 <pz:metadata type="subject">
471 <xsl:value-of select="tmarc:sa" />
473 <pz:metadata type="subject-long">
474 <xsl:for-each select="node()/text()">
475 <xsl:if test="position() > 1">
476 <xsl:text>, </xsl:text>
478 <xsl:value-of select="." />
483 <xsl:for-each select="tmarc:d655">
484 <pz:metadata type="subject">
485 <xsl:value-of select="tmarc:sa" />
487 <pz:metadata type="subject-long">
488 <xsl:for-each select="node()/text()">
489 <xsl:if test="position() > 1">
490 <xsl:text>, </xsl:text>
492 <xsl:value-of select="." />
497 <xsl:for-each select="tmarc:d656">
498 <pz:metadata type="subject">
499 <xsl:value-of select="tmarc:sa" />
501 <pz:metadata type="subject-long">
502 <xsl:for-each select="node()/text()">
503 <xsl:if test="position() > 1">
504 <xsl:text>, </xsl:text>
506 <xsl:value-of select="." />
511 <xsl:for-each select="tmarc:d657">
512 <pz:metadata type="subject">
513 <xsl:value-of select="tmarc:sa" />
515 <pz:metadata type="subject-long">
516 <xsl:for-each select="node()/text()">
517 <xsl:if test="position() > 1">
518 <xsl:text>, </xsl:text>
520 <xsl:value-of select="." />
525 <xsl:for-each select="tmarc:d658">
526 <pz:metadata type="subject">
527 <xsl:value-of select="tmarc:sa" />
529 <pz:metadata type="subject-long">
530 <xsl:for-each select="node()/text()">
531 <xsl:if test="position() > 1">
532 <xsl:text>, </xsl:text>
534 <xsl:value-of select="." />
539 <xsl:for-each select="tmarc:d662">
540 <pz:metadata type="subject">
541 <xsl:value-of select="tmarc:sa" />
543 <pz:metadata type="subject-long">
544 <xsl:for-each select="node()/text()">
545 <xsl:if test="position() > 1">
546 <xsl:text>, </xsl:text>
548 <xsl:value-of select="." />
553 <xsl:for-each select="tmarc:d69X">
554 <pz:metadata type="subject">
555 <xsl:value-of select="tmarc:sa" />
557 <pz:metadata type="subject-long">
558 <xsl:for-each select="node()/text()">
559 <xsl:if test="position() > 1">
560 <xsl:text>, </xsl:text>
562 <xsl:value-of select="." />
567 <!-- or tmarc:d651 or tmarc:d653 or tmarc:d654 or tmarc:d655 or tmarc:d656
568 or tmarc:d657 or tmarc:d658 or tmarc:d662 or tmarc:d69X"> -->
570 <!-- <xsl:for-each select="tmarc:d600" > <pz:metadata type="subject">
571 <xsl:value-of select="tmarc:sa"/> </pz:metadata> <pz:metadata type="subject-long">
572 <xsl:for-each select="tmarc:sa tmarc:sb tmarc:sc tmarc:sd "> <xsl:if test="position()
573 > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:value-of select="."/> </xsl:for-each>
574 </pz:metadata> </xsl:for-each> -->
576 <xsl:for-each select="tmarc:d856">
577 <pz:metadata type="electronic-url">
578 <xsl:value-of select="tmarc:su" />
580 <pz:metadata type="electronic-text">
581 <xsl:if test="tmarc:sy">
582 <xsl:value-of select="tmarc:sy/text()" />
584 <xsl:if test="tmarc:s3">
585 <xsl:value-of select="tmarc:s3/text()" />
588 <pz:metadata type="electronic-note">
589 <xsl:value-of select="tmarc:sz" />
591 <pz:metadata type="electronic-format-instruction">
592 <xsl:value-of select="tmarc:si" />
594 <pz:metadata type="electronic-format-type">
595 <xsl:value-of select="tmarc:sq" />
599 <xsl:for-each select="tmarc:d773">
600 <pz:metadata type="citation">
601 <xsl:for-each select="*">
602 <xsl:value-of select="normalize-space(.)" />
603 <xsl:text> </xsl:text>
606 <xsl:if test="tmarc:st">
607 <pz:metadata type="journal-title">
608 <xsl:value-of select="tmarc:st"/>
611 <xsl:if test="tmarc:sg">
612 <pz:metadata type="journal-subpart">
613 <xsl:value-of select="tmarc:sg"/>
618 <xsl:for-each select="tmarc:d852">
619 <xsl:if test="tmarc:sy">
620 <pz:metadata type="publicnote">
621 <xsl:value-of select="tmarc:sy" />
624 <xsl:if test="tmarc:sh">
625 <pz:metadata type="callnumber">
626 <xsl:value-of select="tmarc:sh" />
631 <pz:metadata type="medium">
632 <xsl:value-of select="$vmedium" />
633 <xsl:if test="string-length($electronic) and $vmedium != 'electronic'">
634 <xsl:text> (electronic)</xsl:text>
638 <xsl:for-each select="tmarc:d900/tmarc:sa">
639 <pz:metadata type="fulltext">
640 <xsl:value-of select="." />
644 <!-- <xsl:if test="$fulltext_a"> <pz:metadata type="fulltext"> <xsl:value-of
645 select="$fulltext_a"/> </pz:metadata> </xsl:if> -->
647 <xsl:for-each select="tmarc:d900/tmarc:sb">
648 <pz:metadata type="fulltext">
649 <xsl:value-of select="." />
653 <!-- <xsl:if test="$fulltext_b"> <pz:metadata type="fulltext"> <xsl:value-of
654 select="$fulltext_b"/> </pz:metadata> </xsl:if> -->
656 <pz:metadata type="has-fulltext">
657 <xsl:value-of select="$has_fulltext"/>
660 <xsl:for-each select="tmarc:d907">
661 <!-- or tmarc:d901"> -->
662 <pz:metadata type="iii-id">
663 <xsl:value-of select="tmarc:sa" />
667 <xsl:for-each select="tmarc:d926">
668 <pz:metadata type="locallocation">
669 <xsl:choose><xsl:when test="tmarc:sa">
670 <xsl:value-of select="tmarc:sa"/>
671 </xsl:when><xsl:otherwise>
672 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
673 </xsl:otherwise></xsl:choose>
675 <pz:metadata type="callnumber">
676 <xsl:choose><xsl:when test="tmarc:sc">
677 <xsl:value-of select="tmarc:sc"/>
678 </xsl:when><xsl:otherwise>
679 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
680 </xsl:otherwise></xsl:choose>
682 <pz:metadata type="available">
683 <xsl:choose><xsl:when test="tmarc:se">
684 <xsl:value-of select="tmarc:se"/>
685 </xsl:when><xsl:otherwise>
686 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
687 </xsl:otherwise></xsl:choose>
691 <xsl:for-each select="tmarc:d948">
692 <pz:metadata type="holding">
693 <xsl:for-each select="tmarc:s">
694 <xsl:if test="position() > 1">
695 <xsl:text> </xsl:text>
697 <xsl:value-of select="." />
702 <xsl:for-each select="tmarc:d991">
703 <pz:metadata type="holding">
704 <xsl:for-each select="tmarc:s">
705 <xsl:if test="position() > 1">
706 <xsl:text> </xsl:text>
708 <xsl:value-of select="." />
713 <xsl:for-each select="tmarc:d999">
714 <pz:metadata type="localid">
716 <xsl:when test="tmarc:sa">
717 <xsl:value-of select="tmarc:sa"/>
719 <xsl:when test="tmarc:sc">
720 <xsl:value-of select="tmarc:sc"/>
723 <xsl:value-of select="tmarc:sd"/>
730 <!-- passthrough id data -->
731 <xsl:for-each select="pz:metadata">
732 <xsl:copy-of select="." />
735 <!-- other stylesheets importing this might want to define this -->
736 <xsl:call-template name="record-hook" />
741 <xsl:template match="text()" />
743 <!-- TODO Does not work anymore -->
744 <xsl:template name="shortTitle">
745 <xsl:param name="tag" />
746 <xsl:for-each select="tmarc:d">
747 <xsl:value-of select="tmarc:sa" />
748 <xsl:value-of select="tmarc:sm" />
749 <xsl:value-of select="tmarc:sn" />
750 <xsl:value-of select="tmarc:sp" />
751 <xsl:value-of select="tmarc:sr" />
755 <!-- No working as expected -->
756 <xsl:template name="description">
757 <xsl:param name="element" />
758 <xsl:for-each select="$element">
759 <pz:metadata type="description">
760 <xsl:for-each select="node()">
761 <xsl:value-of select="text()" />
765 <xsl:apply-templates />
768 <!-- <xsl:for-each select="tmarc:d500"> <pz:metadata type="description">
769 <xsl:for-each select="node()"> <xsl:value-of select="text()"/> </xsl:for-each>
770 </pz:metadata> </xsl:for-each> -->
774 <xsl:template name="subject">
775 <xsl:param name="element" />
776 <xsl:for-each select="$element">
777 <pz:metadata type="subject">
778 <xsl:value-of select="tmarc:sa" />
780 <pz:metadata type="subject-long">
781 <xsl:for-each select="node()/text()">
782 <xsl:if test="position() > 1">
783 <xsl:text>, </xsl:text>
785 <xsl:value-of select="." />