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/MARC21/turboxml">
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" />
29 <xsl:variable name="medium">
31 <xsl:when test="$title_medium">
32 <xsl:value-of select="translate($title_medium, ' []/', '')" />
34 <xsl:when test="$fulltext_a">
35 <xsl:text>electronic resource</xsl:text>
37 <xsl:when test="$fulltext_b">
38 <xsl:text>electronic resource</xsl:text>
40 <xsl:when test="$journal_title">
41 <xsl:text>article</xsl:text>
44 <xsl:text>book</xsl:text>
51 <xsl:attribute name="mergekey">
52 <xsl:text>title </xsl:text>
53 <xsl:value-of select="tmarc:d245/tmarc:sa" />
54 <xsl:text> author </xsl:text>
55 <xsl:value-of select="tmarc:d100/tmarc:sa" />
56 <xsl:text> medium </xsl:text>
57 <xsl:value-of select="$medium" />
61 <xsl:for-each select="tmarc:c001">
62 <pz:metadata type="id">
63 <xsl:value-of select="." />
67 <xsl:for-each select="tmarc:d010">
68 <pz:metadata type="lccn">
69 <xsl:value-of select="tmarc:sa" />
73 <xsl:for-each select="tmarc:d020">
74 <pz:metadata type="isbn">
75 <xsl:value-of select="tmarc:sa" />
79 <xsl:for-each select="tmarc:d022">
80 <pz:metadata type="issn">
81 <xsl:value-of select="tmarc:sa" />
85 <xsl:for-each select="tmarc:d027">
86 <pz:metadata type="tech-rep-nr">
87 <xsl:value-of select="tmarc:sa" />
91 <xsl:for-each select="tmarc:d035">
92 <pz:metadata type="system-control-nr">
93 <xsl:value-of select="tmarc:sa" />
97 <xsl:for-each select="tmarc:d100">
98 <pz:metadata type="author">
99 <xsl:value-of select="tmarc:sa" />
101 <pz:metadata type="author-title">
102 <xsl:value-of select="tmarc:sc" />
104 <pz:metadata type="author-date">
105 <xsl:value-of select="tmarc:sd" />
109 <xsl:for-each select="tmarc:d110">
110 <pz:metadata type="corporate-name">
111 <xsl:value-of select="tmarc:sa" />
113 <pz:metadata type="corporate-location">
114 <xsl:value-of select="tmarc:sc" />
116 <pz:metadata type="corporate-date">
117 <xsl:value-of select="tmarc:sd" />
121 <xsl:for-each select="tmarc:d111">
122 <pz:metadata type="meeting-name">
123 <xsl:value-of select="tmarc:sa" />
125 <pz:metadata type="meeting-location">
126 <xsl:value-of select="tmarc:sc" />
128 <pz:metadata type="meeting-date">
129 <xsl:value-of select="tmarc:sd" />
133 <xsl:for-each select="tmarc:d260">
134 <pz:metadata type="date">
135 <xsl:value-of select="tmarc:sc" />
139 <xsl:for-each select="tmarc:d130">
140 <pz:metadata type="title-uniform">
141 <xsl:value-of select="tmarc:sa" />
143 <pz:metadata type="title-uniform-media">
144 <xsl:value-of select="tmarc:sm" />
146 <pz:metadata type="title-uniform-parts">
147 <xsl:value-of select="tmarc:sn" />
149 <pz:metadata type="title-uniform-partname">
150 <xsl:value-of select="tmarc:sp" />
152 <pz:metadata type="title-uniform-key">
153 <xsl:value-of select="tmarc:sr" />
157 <xsl:for-each select="tmarc:d245">
158 <pz:metadata type="title">
159 <xsl:value-of select="tmarc:sa" />
161 <pz:metadata type="title-remainder">
162 <xsl:value-of select="tmarc:sb" />
164 <pz:metadata type="title-responsibility">
165 <xsl:value-of select="tmarc:sc" />
167 <pz:metadata type="title-dates">
168 <xsl:value-of select="tmarc:sf" />
170 <pz:metadata type="title-medium">
171 <xsl:value-of select="tmarc:sh" />
173 <pz:metadata type="title-number-section">
174 <xsl:value-of select="tmarc:sn" />
178 <xsl:for-each select="tmarc:d250">
179 <pz:metadata type="edition">
180 <xsl:value-of select="tmarc:sa" />
184 <xsl:for-each select="tmarc:d260">
185 <pz:metadata type="publication-place">
186 <xsl:value-of select="tmarc:sa" />
188 <pz:metadata type="publication-name">
189 <xsl:value-of select="tmarc:sb" />
191 <pz:metadata type="publication-date">
192 <xsl:value-of select="tmarc:sc" />
196 <xsl:for-each select="tmarc:d300">
197 <pz:metadata type="physical-extent">
198 <xsl:value-of select="tmarc:sa" />
200 <pz:metadata type="physical-format">
201 <xsl:value-of select="tmarc:sb" />
203 <pz:metadata type="physical-dimensions">
204 <xsl:value-of select="tmarc:sc" />
206 <pz:metadata type="physical-accomp">
207 <xsl:value-of select="tmarc:se" />
209 <pz:metadata type="physical-unittype">
210 <xsl:value-of select="tmarc:sf" />
212 <pz:metadata type="physical-unitsize">
213 <xsl:value-of select="tmarc:sg" />
215 <pz:metadata type="physical-specified">
216 <xsl:value-of select="tmarc:s3" />
220 <xsl:for-each select="tmarc:d440">
221 <pz:metadata type="series-title">
222 <xsl:value-of select="tmarc:sa" />
226 <xsl:for-each select="tmarc:d500">
227 <pz:metadata type="description">
228 <xsl:for-each select="node()">
229 <xsl:value-of select="text()" />
234 <xsl:for-each select="tmarc:d505">
235 <pz:metadata type="description">
236 <xsl:for-each select="node()">
237 <xsl:value-of select="text()" />
242 <xsl:for-each select="tmarc:d518">
243 <pz:metadata type="description">
244 <xsl:for-each select="node()">
245 <xsl:value-of select="text()" />
250 <xsl:for-each select="tmarc:d520">
251 <pz:metadata type="description">
252 <xsl:for-each select="node()">
253 <xsl:value-of select="text()" />
258 <xsl:for-each select="tmarc:d522">
259 <pz:metadata type="description">
260 <xsl:for-each select="node()">
261 <xsl:value-of select="text()" />
266 <xsl:for-each select="tmarc:d600">
267 <pz:metadata type="subject">
268 <xsl:value-of select="tmarc:sa" />
270 <pz:metadata type="subject-long">
271 <xsl:for-each select="node()/text()">
272 <xsl:if test="position() > 1">
273 <xsl:text>, </xsl:text>
275 <xsl:value-of select="." />
280 <xsl:for-each select="tmarc:d610">
281 <pz:metadata type="subject">
282 <xsl:value-of select="tmarc:sa" />
284 <pz:metadata type="subject-long">
285 <xsl:for-each select="node()/text()">
286 <xsl:if test="position() > 1">
287 <xsl:text>, </xsl:text>
289 <xsl:value-of select="." />
294 <xsl:for-each select="tmarc:d611">
295 <pz:metadata type="subject">
296 <xsl:value-of select="tmarc:sa" />
298 <pz:metadata type="subject-long">
299 <xsl:for-each select="node()/text()">
300 <xsl:if test="position() > 1">
301 <xsl:text>, </xsl:text>
303 <xsl:value-of select="." />
308 <xsl:for-each select="tmarc:d630">
309 <pz:metadata type="subject">
310 <xsl:value-of select="tmarc:sa" />
312 <pz:metadata type="subject-long">
313 <xsl:for-each select="node()/text()">
314 <xsl:if test="position() > 1">
315 <xsl:text>, </xsl:text>
317 <xsl:value-of select="." />
322 <xsl:for-each select="tmarc:d648">
323 <pz:metadata type="subject">
324 <xsl:value-of select="tmarc:sa" />
326 <pz:metadata type="subject-long">
327 <xsl:for-each select="node()/text()">
328 <xsl:if test="position() > 1">
329 <xsl:text>, </xsl:text>
331 <xsl:value-of select="." />
336 <xsl:for-each select="tmarc:d650">
337 <pz:metadata type="subject">
338 <xsl:value-of select="tmarc:sa" />
340 <pz:metadata type="subject-long">
341 <xsl:for-each select="node()/text()">
342 <xsl:if test="position() > 1">
343 <xsl:text>, </xsl:text>
345 <xsl:value-of select="." />
350 <xsl:for-each select="tmarc:d651">
351 <pz:metadata type="subject">
352 <xsl:value-of select="tmarc:sa" />
354 <pz:metadata type="subject-long">
355 <xsl:for-each select="node()/text()">
356 <xsl:if test="position() > 1">
357 <xsl:text>, </xsl:text>
359 <xsl:value-of select="." />
364 <xsl:for-each select="tmarc:d653">
365 <pz:metadata type="subject">
366 <xsl:value-of select="tmarc:sa" />
368 <pz:metadata type="subject-long">
369 <xsl:for-each select="node()/text()">
370 <xsl:if test="position() > 1">
371 <xsl:text>, </xsl:text>
373 <xsl:value-of select="." />
378 <xsl:for-each select="tmarc:d654">
379 <pz:metadata type="subject">
380 <xsl:value-of select="tmarc:sa" />
382 <pz:metadata type="subject-long">
383 <xsl:for-each select="node()/text()">
384 <xsl:if test="position() > 1">
385 <xsl:text>, </xsl:text>
387 <xsl:value-of select="." />
392 <xsl:for-each select="tmarc:d655">
393 <pz:metadata type="subject">
394 <xsl:value-of select="tmarc:sa" />
396 <pz:metadata type="subject-long">
397 <xsl:for-each select="node()/text()">
398 <xsl:if test="position() > 1">
399 <xsl:text>, </xsl:text>
401 <xsl:value-of select="." />
406 <xsl:for-each select="tmarc:d656">
407 <pz:metadata type="subject">
408 <xsl:value-of select="tmarc:sa" />
410 <pz:metadata type="subject-long">
411 <xsl:for-each select="node()/text()">
412 <xsl:if test="position() > 1">
413 <xsl:text>, </xsl:text>
415 <xsl:value-of select="." />
420 <xsl:for-each select="tmarc:d657">
421 <pz:metadata type="subject">
422 <xsl:value-of select="tmarc:sa" />
424 <pz:metadata type="subject-long">
425 <xsl:for-each select="node()/text()">
426 <xsl:if test="position() > 1">
427 <xsl:text>, </xsl:text>
429 <xsl:value-of select="." />
434 <xsl:for-each select="tmarc:d658">
435 <pz:metadata type="subject">
436 <xsl:value-of select="tmarc:sa" />
438 <pz:metadata type="subject-long">
439 <xsl:for-each select="node()/text()">
440 <xsl:if test="position() > 1">
441 <xsl:text>, </xsl:text>
443 <xsl:value-of select="." />
448 <xsl:for-each select="tmarc:d662">
449 <pz:metadata type="subject">
450 <xsl:value-of select="tmarc:sa" />
452 <pz:metadata type="subject-long">
453 <xsl:for-each select="node()/text()">
454 <xsl:if test="position() > 1">
455 <xsl:text>, </xsl:text>
457 <xsl:value-of select="." />
462 <xsl:for-each select="tmarc:d69X">
463 <pz:metadata type="subject">
464 <xsl:value-of select="tmarc:sa" />
466 <pz:metadata type="subject-long">
467 <xsl:for-each select="node()/text()">
468 <xsl:if test="position() > 1">
469 <xsl:text>, </xsl:text>
471 <xsl:value-of select="." />
476 <!-- or tmarc:d651 or tmarc:d653 or tmarc:d654 or tmarc:d655 or tmarc:d656
477 or tmarc:d657 or tmarc:d658 or tmarc:d662 or tmarc:d69X"> -->
479 <!-- <xsl:for-each select="tmarc:d600" > <pz:metadata type="subject">
480 <xsl:value-of select="tmarc:sa"/> </pz:metadata> <pz:metadata type="subject-long">
481 <xsl:for-each select="tmarc:sa tmarc:sb tmarc:sc tmarc:sd "> <xsl:if test="position()
482 > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:value-of select="."/> </xsl:for-each>
483 </pz:metadata> </xsl:for-each> -->
485 <xsl:for-each select="tmarc:d856">
486 <pz:metadata type="electronic-url">
487 <xsl:value-of select="tmarc:su" />
489 <pz:metadata type="electronic-text">
490 <xsl:if test="tmarc:sy">
491 <xsl:value-of select="tmarc:sy/text()" />
493 <xsl:if test="tmarc:s3">
494 <xsl:value-of select="tmarc:s3/text()" />
497 <pz:metadata type="electronic-note">
498 <xsl:value-of select="tmarc:sz" />
500 <pz:metadata type="electronic-format-instruction">
501 <xsl:value-of select="tmarc:si" />
503 <pz:metadata type="electronic-format-type">
504 <xsl:value-of select="tmarc:sq" />
508 <xsl:for-each select="tmarc:d773">
509 <pz:metadata type="citation">
510 <xsl:for-each select="*">
511 <xsl:value-of select="normalize-space(.)" />
512 <xsl:text> </xsl:text>
517 <xsl:for-each select="tmarc:d852">
518 <xsl:if test="tmarc:sy">
519 <pz:metadata type="publicnote">
520 <xsl:value-of select="tmarc:sy" />
523 <xsl:if test="tmarc:sh">
524 <pz:metadata type="callnumber">
525 <xsl:value-of select="tmarc:sh" />
530 <pz:metadata type="medium">
531 <xsl:value-of select="$medium" />
534 <xsl:for-each select="tmarc:d900/tmarc:sa">
535 <pz:metadata type="fulltext">
536 <xsl:value-of select="." />
540 <!-- <xsl:if test="$fulltext_a"> <pz:metadata type="fulltext"> <xsl:value-of
541 select="$fulltext_a"/> </pz:metadata> </xsl:if> -->
543 <xsl:for-each select="tmarc:d900/tmarc:sb">
544 <pz:metadata type="fulltext">
545 <xsl:value-of select="." />
549 <!-- <xsl:if test="$fulltext_b"> <pz:metadata type="fulltext"> <xsl:value-of
550 select="$fulltext_b"/> </pz:metadata> </xsl:if> -->
552 <xsl:for-each select="tmarc:d907">
553 <!-- or tmarc:d901"> -->
554 <pz:metadata type="iii-id">
555 <xsl:value-of select="tmarc:sa" />
559 <xsl:for-each select="tmarc:d926">
560 <pz:metadata type="holding">
561 <xsl:for-each select="tmarc:s">
562 <xsl:if test="position() > 1">
563 <xsl:text> </xsl:text>
565 <xsl:value-of select="." />
570 <xsl:for-each select="tmarc:d948">
571 <pz:metadata type="holding">
572 <xsl:for-each select="tmarc:s">
573 <xsl:if test="position() > 1">
574 <xsl:text> </xsl:text>
576 <xsl:value-of select="." />
581 <xsl:for-each select="tmarc:d991">
582 <pz:metadata type="holding">
583 <xsl:for-each select="tmarc:s">
584 <xsl:if test="position() > 1">
585 <xsl:text> </xsl:text>
587 <xsl:value-of select="." />
592 <pz:metadata tag="tag100">
593 <xsl:call-template name="shortTitle">
594 <xsl:with-param name="tag" select="100" />
598 <!-- Stuff for FRBR workset key -->
599 <xsl:variable name="title130">
600 <xsl:for-each select="tmarc:d130">
601 <xsl:value-of select="tmarc:sa" />
602 <xsl:value-of select="tmarc:sm" />
603 <xsl:value-of select="tmarc:sn" />
604 <xsl:value-of select="tmarc:sp" />
605 <xsl:value-of select="tmarc:sr" />
609 <xsl:variable name="title240">
610 <xsl:for-each select="tmarc:d240">
611 <xsl:value-of select="tmarc:sa" />
612 <xsl:value-of select="tmarc:sm" />
613 <xsl:value-of select="tmarc:sn" />
614 <xsl:value-of select="tmarc:sp" />
615 <xsl:value-of select="tmarc:sr" />
618 <xsl:variable name="title242">
619 <xsl:for-each select="tmarc:d242">
620 <xsl:value-of select="tmarc:sa" />
621 <xsl:if test="$contains110 and not($hasAuthorFields)">
622 <xsl:value-of select="tmarc:sb" />
623 <xsl:value-of select="tmarc:sf" />
624 <xsl:value-of select="tmarc:sg" />
625 <xsl:value-of select="tmarc:sn" />
626 <xsl:value-of select="tmarc:sp" />
630 <xsl:variable name="title242-full">
631 <xsl:for-each select="tmarc:d242">
632 <xsl:value-of select="tmarc:sa" />
633 <xsl:value-of select="tmarc:sb" />
634 <xsl:value-of select="tmarc:sf" />
635 <xsl:value-of select="tmarc:sg" />
636 <xsl:value-of select="tmarc:sn" />
637 <xsl:value-of select="tmarc:sp" />
641 <xsl:variable name="title245">
642 <xsl:for-each select="tmarc:d245">
643 <xsl:value-of select="tmarc:sa" />
644 <xsl:if test="$contains110 and not($hasAuthorFields)">
645 <xsl:value-of select="tmarc:sb" />
646 <xsl:value-of select="tmarc:sf" />
647 <xsl:value-of select="tmarc:sg" />
648 <xsl:value-of select="tmarc:sn" />
649 <xsl:value-of select="tmarc:sp" />
653 <xsl:variable name="title245-full">
654 <xsl:for-each select="tmarc:d245">
655 <xsl:value-of select="tmarc:sa" />
656 <xsl:value-of select="tmarc:sb" />
657 <xsl:value-of select="tmarc:sf" />
658 <xsl:value-of select="tmarc:sg" />
659 <xsl:value-of select="tmarc:sn" />
660 <xsl:value-of select="tmarc:sp" />
664 <xsl:variable name="title246">
665 <xsl:for-each select="tmarc:d246">
666 <xsl:value-of select="tmarc:sa" />
667 <xsl:if test="$contains110 and not($hasAuthorFields)">
668 <xsl:value-of select="tmarc:sb" />
669 <xsl:value-of select="tmarc:sf" />
670 <xsl:value-of select="tmarc:sg" />
671 <xsl:value-of select="tmarc:sn" />
672 <xsl:value-of select="tmarc:sp" />
676 <xsl:variable name="title246-full">
677 <xsl:for-each select="tmarc:d246">
678 <xsl:value-of select="tmarc:sa" />
679 <xsl:value-of select="tmarc:sb" />
680 <xsl:value-of select="tmarc:sf" />
681 <xsl:value-of select="tmarc:sg" />
682 <xsl:value-of select="tmarc:sn" />
683 <xsl:value-of select="tmarc:sp" />
687 <xsl:variable name="title247">
688 <xsl:for-each select="tmarc:d247">
689 <xsl:value-of select="tmarc:sa" />
690 <xsl:if test="$contains110 and not($hasAuthorFields)">
691 <xsl:value-of select="tmarc:sb" />
692 <xsl:value-of select="tmarc:sf" />
693 <xsl:value-of select="tmarc:sg" />
694 <xsl:value-of select="tmarc:sn" />
695 <xsl:value-of select="tmarc:sp" />
699 <xsl:variable name="title247-full">
700 <xsl:for-each select="tmarc:d247">
701 <xsl:value-of select="tmarc:sa" />
702 <xsl:value-of select="tmarc:sb" />
703 <xsl:value-of select="tmarc:sf" />
704 <xsl:value-of select="tmarc:sg" />
705 <xsl:value-of select="tmarc:sn" />
706 <xsl:value-of select="tmarc:sp" />
710 <xsl:for-each select="tmarc:c008">
711 <pz:metadata type="meta-marc-cf008">
712 <xsl:value-of select="." />
716 <pz:metadata type="meta-frbr-short-title">
718 <xsl:when test="$title130!=''">
719 <xsl:value-of select="$title130" />
721 <xsl:when test="$title130='' and $title240!=''">
722 <xsl:value-of select="$title240" />
724 <!-- Missing the prioritization of 246 on non-english records -->
725 <xsl:when test="$title130='' and $title240='' and $title242!=''">
726 <xsl:value-of select="$title242" />
729 test="$title130='' and $title240='' and $title242='' and $title245!=''">
730 <xsl:value-of select="$title245" />
733 test="$title130='' and $title240='' and $title242='' and $title246!=''">
734 <xsl:value-of select="$title246" />
737 test="$title130='' and $title240='' and $title242='' and $title246='' and $title247!=''">
738 <xsl:value-of select="$title247" />
743 <pz:metadata type="meta-frbr-full-title">
745 <xsl:when test="$title130!=''">
746 <xsl:value-of select="$title130" />
748 <xsl:when test="$title130='' and $title240!=''">
749 <xsl:value-of select="$title240" />
751 <!-- Missing the prioritization of 246 on non-english records -->
752 <xsl:when test="$title130='' and $title240='' and $title242!=''">
753 <xsl:value-of select="$title242-full" />
756 test="$title130='' and $title240='' and $title242='' and $title245!=''">
757 <xsl:value-of select="$title245-full" />
760 test="$title130='' and $title240='' and $title242='' and $title246!=''">
761 <xsl:value-of select="$title246-full" />
764 test="$title130='' and $title240='' and $title242='' and $title246='' and $title247!=''">
765 <xsl:value-of select="$title247-full" />
771 <pz:metadata type="meta-frbr-lang">
772 <xsl:value-of select="$control_lang" />
776 <!-- passthrough id data -->
777 <xsl:for-each select="pz:metadata">
778 <xsl:copy-of select="." />
781 <!-- other stylesheets importing this might want to define this -->
782 <xsl:call-template name="record-hook" />
787 <xsl:template match="text()" />
789 <!-- TODO Does not work anymore -->
790 <xsl:template name="shortTitle">
791 <xsl:param name="tag" />
792 <xsl:for-each select="tmarc:d">
793 <xsl:value-of select="tmarc:sa" />
794 <xsl:value-of select="tmarc:sm" />
795 <xsl:value-of select="tmarc:sn" />
796 <xsl:value-of select="tmarc:sp" />
797 <xsl:value-of select="tmarc:sr" />
801 <!-- No working as expected -->
802 <xsl:template name="description">
803 <xsl:param name="element" />
804 <xsl:for-each select="$element">
805 <pz:metadata type="description">
806 <xsl:for-each select="node()">
807 <xsl:value-of select="text()" />
811 <xsl:apply-templates />
814 <!-- <xsl:for-each select="tmarc:d500"> <pz:metadata type="description">
815 <xsl:for-each select="node()"> <xsl:value-of select="text()"/> </xsl:for-each>
816 </pz:metadata> </xsl:for-each> -->
820 <xsl:template name="subject">
821 <xsl:param name="element" />
822 <xsl:for-each select="$element">
823 <pz:metadata type="subject">
824 <xsl:value-of select="tmarc:sa" />
826 <pz:metadata type="subject-long">
827 <xsl:for-each select="node()/text()">
828 <xsl:if test="position() > 1">
829 <xsl:text>, </xsl:text>
831 <xsl:value-of select="." />