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')">data</xsl:when>
88 <xsl:when test="$typeofrec='a' and $biblevel='b'">article</xsl:when>
89 <xsl:when test="$typeofrec='m'">software</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">
143 <xsl:value-of select="tmarc:sa" />
147 <xsl:for-each select="tmarc:d100">
148 <pz:metadata type="author">
149 <xsl:value-of select="tmarc:sa" />
151 <pz:metadata type="author-title">
152 <xsl:value-of select="tmarc:sc" />
154 <pz:metadata type="author-date">
155 <xsl:value-of select="tmarc:sd" />
159 <xsl:for-each select="tmarc:d110">
160 <pz:metadata type="corporate-name">
161 <xsl:value-of select="tmarc:sa" />
163 <pz:metadata type="corporate-location">
164 <xsl:value-of select="tmarc:sc" />
166 <pz:metadata type="corporate-date">
167 <xsl:value-of select="tmarc:sd" />
171 <xsl:for-each select="tmarc:d111">
172 <pz:metadata type="meeting-name">
173 <xsl:value-of select="tmarc:sa" />
175 <pz:metadata type="meeting-location">
176 <xsl:value-of select="tmarc:sc" />
178 <pz:metadata type="meeting-date">
179 <xsl:value-of select="tmarc:sd" />
183 <xsl:for-each select="tmarc:d260">
184 <pz:metadata type="date">
185 <xsl:value-of select="tmarc:sc" />
189 <xsl:for-each select="tmarc:d130">
190 <pz:metadata type="title-uniform">
191 <xsl:value-of select="tmarc:sa" />
193 <pz:metadata type="title-uniform-media">
194 <xsl:value-of select="tmarc:sm" />
196 <pz:metadata type="title-uniform-parts">
197 <xsl:value-of select="tmarc:sn" />
199 <pz:metadata type="title-uniform-partname">
200 <xsl:value-of select="tmarc:sp" />
202 <pz:metadata type="title-uniform-key">
203 <xsl:value-of select="tmarc:sr" />
207 <xsl:for-each select="tmarc:d245">
208 <pz:metadata type="title">
209 <xsl:value-of select="tmarc:sa" />
211 <pz:metadata type="title-remainder">
212 <xsl:value-of select="tmarc:sb" />
214 <pz:metadata type="title-responsibility">
215 <xsl:value-of select="tmarc:sc" />
217 <pz:metadata type="title-dates">
218 <xsl:value-of select="tmarc:sf" />
220 <pz:metadata type="title-medium">
221 <xsl:value-of select="tmarc:sh" />
223 <pz:metadata type="title-number-section">
224 <xsl:value-of select="tmarc:sn" />
228 <xsl:for-each select="tmarc:d250">
229 <pz:metadata type="edition">
230 <xsl:value-of select="tmarc:sa" />
234 <xsl:for-each select="tmarc:d260">
235 <pz:metadata type="publication-place">
236 <xsl:value-of select="tmarc:sa" />
238 <pz:metadata type="publication-name">
239 <xsl:value-of select="tmarc:sb" />
241 <pz:metadata type="publication-date">
242 <xsl:value-of select="tmarc:sc" />
246 <xsl:for-each select="tmarc:d300">
247 <pz:metadata type="physical-extent">
248 <xsl:value-of select="tmarc:sa" />
250 <pz:metadata type="physical-format">
251 <xsl:value-of select="tmarc:sb" />
253 <pz:metadata type="physical-dimensions">
254 <xsl:value-of select="tmarc:sc" />
256 <pz:metadata type="physical-accomp">
257 <xsl:value-of select="tmarc:se" />
259 <pz:metadata type="physical-unittype">
260 <xsl:value-of select="tmarc:sf" />
262 <pz:metadata type="physical-unitsize">
263 <xsl:value-of select="tmarc:sg" />
265 <pz:metadata type="physical-specified">
266 <xsl:value-of select="tmarc:s3" />
270 <xsl:for-each select="tmarc:d440">
271 <pz:metadata type="series-title">
272 <xsl:value-of select="tmarc:sa" />
276 <xsl:for-each select="tmarc:d500">
277 <pz:metadata type="description">
278 <xsl:for-each select="node()">
279 <xsl:value-of select="text()" />
284 <xsl:for-each select="tmarc:d505">
285 <pz:metadata type="description">
286 <xsl:for-each select="node()">
287 <xsl:value-of select="text()" />
292 <xsl:for-each select="tmarc:d518">
293 <pz:metadata type="description">
294 <xsl:for-each select="node()">
295 <xsl:value-of select="text()" />
300 <xsl:for-each select="tmarc:d520">
301 <pz:metadata type="description">
302 <xsl:for-each select="node()">
303 <xsl:value-of select="text()" />
308 <xsl:for-each select="tmarc:d522">
309 <pz:metadata type="description">
310 <xsl:for-each select="node()">
311 <xsl:value-of select="text()" />
316 <xsl:for-each select="tmarc:d600">
317 <pz:metadata type="subject">
318 <xsl:value-of select="tmarc:sa" />
320 <pz:metadata type="subject-long">
321 <xsl:for-each select="node()/text()">
322 <xsl:if test="position() > 1">
323 <xsl:text>, </xsl:text>
325 <xsl:value-of select="." />
330 <xsl:for-each select="tmarc:d610">
331 <pz:metadata type="subject">
332 <xsl:value-of select="tmarc:sa" />
334 <pz:metadata type="subject-long">
335 <xsl:for-each select="node()/text()">
336 <xsl:if test="position() > 1">
337 <xsl:text>, </xsl:text>
339 <xsl:value-of select="." />
344 <xsl:for-each select="tmarc:d611">
345 <pz:metadata type="subject">
346 <xsl:value-of select="tmarc:sa" />
348 <pz:metadata type="subject-long">
349 <xsl:for-each select="node()/text()">
350 <xsl:if test="position() > 1">
351 <xsl:text>, </xsl:text>
353 <xsl:value-of select="." />
358 <xsl:for-each select="tmarc:d630">
359 <pz:metadata type="subject">
360 <xsl:value-of select="tmarc:sa" />
362 <pz:metadata type="subject-long">
363 <xsl:for-each select="node()/text()">
364 <xsl:if test="position() > 1">
365 <xsl:text>, </xsl:text>
367 <xsl:value-of select="." />
372 <xsl:for-each select="tmarc:d648">
373 <pz:metadata type="subject">
374 <xsl:value-of select="tmarc:sa" />
376 <pz:metadata type="subject-long">
377 <xsl:for-each select="node()/text()">
378 <xsl:if test="position() > 1">
379 <xsl:text>, </xsl:text>
381 <xsl:value-of select="." />
386 <xsl:for-each select="tmarc:d650">
387 <pz:metadata type="subject">
388 <xsl:value-of select="tmarc:sa" />
390 <pz:metadata type="subject-long">
391 <xsl:for-each select="node()/text()">
392 <xsl:if test="position() > 1">
393 <xsl:text>, </xsl:text>
395 <xsl:value-of select="." />
400 <xsl:for-each select="tmarc:d651">
401 <pz:metadata type="subject">
402 <xsl:value-of select="tmarc:sa" />
404 <pz:metadata type="subject-long">
405 <xsl:for-each select="node()/text()">
406 <xsl:if test="position() > 1">
407 <xsl:text>, </xsl:text>
409 <xsl:value-of select="." />
414 <xsl:for-each select="tmarc:d653">
415 <pz:metadata type="subject">
416 <xsl:value-of select="tmarc:sa" />
418 <pz:metadata type="subject-long">
419 <xsl:for-each select="node()/text()">
420 <xsl:if test="position() > 1">
421 <xsl:text>, </xsl:text>
423 <xsl:value-of select="." />
428 <xsl:for-each select="tmarc:d654">
429 <pz:metadata type="subject">
430 <xsl:value-of select="tmarc:sa" />
432 <pz:metadata type="subject-long">
433 <xsl:for-each select="node()/text()">
434 <xsl:if test="position() > 1">
435 <xsl:text>, </xsl:text>
437 <xsl:value-of select="." />
442 <xsl:for-each select="tmarc:d655">
443 <pz:metadata type="subject">
444 <xsl:value-of select="tmarc:sa" />
446 <pz:metadata type="subject-long">
447 <xsl:for-each select="node()/text()">
448 <xsl:if test="position() > 1">
449 <xsl:text>, </xsl:text>
451 <xsl:value-of select="." />
456 <xsl:for-each select="tmarc:d656">
457 <pz:metadata type="subject">
458 <xsl:value-of select="tmarc:sa" />
460 <pz:metadata type="subject-long">
461 <xsl:for-each select="node()/text()">
462 <xsl:if test="position() > 1">
463 <xsl:text>, </xsl:text>
465 <xsl:value-of select="." />
470 <xsl:for-each select="tmarc:d657">
471 <pz:metadata type="subject">
472 <xsl:value-of select="tmarc:sa" />
474 <pz:metadata type="subject-long">
475 <xsl:for-each select="node()/text()">
476 <xsl:if test="position() > 1">
477 <xsl:text>, </xsl:text>
479 <xsl:value-of select="." />
484 <xsl:for-each select="tmarc:d658">
485 <pz:metadata type="subject">
486 <xsl:value-of select="tmarc:sa" />
488 <pz:metadata type="subject-long">
489 <xsl:for-each select="node()/text()">
490 <xsl:if test="position() > 1">
491 <xsl:text>, </xsl:text>
493 <xsl:value-of select="." />
498 <xsl:for-each select="tmarc:d662">
499 <pz:metadata type="subject">
500 <xsl:value-of select="tmarc:sa" />
502 <pz:metadata type="subject-long">
503 <xsl:for-each select="node()/text()">
504 <xsl:if test="position() > 1">
505 <xsl:text>, </xsl:text>
507 <xsl:value-of select="." />
512 <xsl:for-each select="tmarc:d69X">
513 <pz:metadata type="subject">
514 <xsl:value-of select="tmarc:sa" />
516 <pz:metadata type="subject-long">
517 <xsl:for-each select="node()/text()">
518 <xsl:if test="position() > 1">
519 <xsl:text>, </xsl:text>
521 <xsl:value-of select="." />
526 <!-- or tmarc:d651 or tmarc:d653 or tmarc:d654 or tmarc:d655 or tmarc:d656
527 or tmarc:d657 or tmarc:d658 or tmarc:d662 or tmarc:d69X"> -->
529 <!-- <xsl:for-each select="tmarc:d600" > <pz:metadata type="subject">
530 <xsl:value-of select="tmarc:sa"/> </pz:metadata> <pz:metadata type="subject-long">
531 <xsl:for-each select="tmarc:sa tmarc:sb tmarc:sc tmarc:sd "> <xsl:if test="position()
532 > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:value-of select="."/> </xsl:for-each>
533 </pz:metadata> </xsl:for-each> -->
535 <xsl:for-each select="tmarc:d856">
536 <pz:metadata type="electronic-url">
537 <xsl:value-of select="tmarc:su" />
539 <pz:metadata type="electronic-text">
540 <xsl:if test="tmarc:sy">
541 <xsl:value-of select="tmarc:sy/text()" />
543 <xsl:if test="tmarc:s3">
544 <xsl:value-of select="tmarc:s3/text()" />
547 <pz:metadata type="electronic-note">
548 <xsl:value-of select="tmarc:sz" />
550 <pz:metadata type="electronic-format-instruction">
551 <xsl:value-of select="tmarc:si" />
553 <pz:metadata type="electronic-format-type">
554 <xsl:value-of select="tmarc:sq" />
558 <xsl:for-each select="tmarc:d773">
559 <pz:metadata type="citation">
560 <xsl:for-each select="*">
561 <xsl:value-of select="normalize-space(.)" />
562 <xsl:text> </xsl:text>
567 <xsl:for-each select="tmarc:d852">
568 <xsl:if test="tmarc:sy">
569 <pz:metadata type="publicnote">
570 <xsl:value-of select="tmarc:sy" />
573 <xsl:if test="tmarc:sh">
574 <pz:metadata type="callnumber">
575 <xsl:value-of select="tmarc:sh" />
580 <pz:metadata type="medium">
581 <xsl:value-of select="$medium" />
584 <pz:metadata type="electronic">
585 <xsl:value-of select="$electronic"/>
588 <xsl:for-each select="tmarc:d900/tmarc:sa">
589 <pz:metadata type="fulltext">
590 <xsl:value-of select="." />
594 <!-- <xsl:if test="$fulltext_a"> <pz:metadata type="fulltext"> <xsl:value-of
595 select="$fulltext_a"/> </pz:metadata> </xsl:if> -->
597 <xsl:for-each select="tmarc:d900/tmarc:sb">
598 <pz:metadata type="fulltext">
599 <xsl:value-of select="." />
603 <!-- <xsl:if test="$fulltext_b"> <pz:metadata type="fulltext"> <xsl:value-of
604 select="$fulltext_b"/> </pz:metadata> </xsl:if> -->
606 <xsl:for-each select="tmarc:d907">
607 <!-- or tmarc:d901"> -->
608 <pz:metadata type="iii-id">
609 <xsl:value-of select="tmarc:sa" />
613 <xsl:for-each select="tmarc:d926">
614 <pz:metadata type="holding">
615 <xsl:for-each select="tmarc:s">
616 <xsl:if test="position() > 1">
617 <xsl:text> </xsl:text>
619 <xsl:value-of select="." />
624 <xsl:for-each select="tmarc:d948">
625 <pz:metadata type="holding">
626 <xsl:for-each select="tmarc:s">
627 <xsl:if test="position() > 1">
628 <xsl:text> </xsl:text>
630 <xsl:value-of select="." />
635 <xsl:for-each select="tmarc:d991">
636 <pz:metadata type="holding">
637 <xsl:for-each select="tmarc:s">
638 <xsl:if test="position() > 1">
639 <xsl:text> </xsl:text>
641 <xsl:value-of select="." />
646 <!-- passthrough id data -->
647 <xsl:for-each select="pz:metadata">
648 <xsl:copy-of select="." />
651 <!-- other stylesheets importing this might want to define this -->
652 <xsl:call-template name="record-hook" />
657 <xsl:template match="text()" />
659 <!-- TODO Does not work anymore -->
660 <xsl:template name="shortTitle">
661 <xsl:param name="tag" />
662 <xsl:for-each select="tmarc:d">
663 <xsl:value-of select="tmarc:sa" />
664 <xsl:value-of select="tmarc:sm" />
665 <xsl:value-of select="tmarc:sn" />
666 <xsl:value-of select="tmarc:sp" />
667 <xsl:value-of select="tmarc:sr" />
671 <!-- No working as expected -->
672 <xsl:template name="description">
673 <xsl:param name="element" />
674 <xsl:for-each select="$element">
675 <pz:metadata type="description">
676 <xsl:for-each select="node()">
677 <xsl:value-of select="text()" />
681 <xsl:apply-templates />
684 <!-- <xsl:for-each select="tmarc:d500"> <pz:metadata type="description">
685 <xsl:for-each select="node()"> <xsl:value-of select="text()"/> </xsl:for-each>
686 </pz:metadata> </xsl:for-each> -->
690 <xsl:template name="subject">
691 <xsl:param name="element" />
692 <xsl:for-each select="$element">
693 <pz:metadata type="subject">
694 <xsl:value-of select="tmarc:sa" />
696 <pz:metadata type="subject-long">
697 <xsl:for-each select="node()/text()">
698 <xsl:if test="position() > 1">
699 <xsl:text>, </xsl:text>
701 <xsl:value-of select="." />