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')">web</xsl:when>
88 <xsl:when test="$typeofrec='a' and $biblevel='b'">article</xsl:when>
89 <xsl:when test="$typeofrec='m'">electronic</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">
144 <xsl:when test="tmarc:sa">
145 <xsl:value-of select="tmarc:sa"/>
148 <xsl:value-of select="tmarc:sb"/>
154 <xsl:for-each select="tmarc:d100">
155 <pz:metadata type="author">
156 <xsl:value-of select="tmarc:sa" />
158 <pz:metadata type="author-title">
159 <xsl:value-of select="tmarc:sc" />
161 <pz:metadata type="author-date">
162 <xsl:value-of select="tmarc:sd" />
166 <xsl:for-each select="tmarc:d110">
167 <pz:metadata type="corporate-name">
168 <xsl:value-of select="tmarc:sa" />
170 <pz:metadata type="corporate-location">
171 <xsl:value-of select="tmarc:sc" />
173 <pz:metadata type="corporate-date">
174 <xsl:value-of select="tmarc:sd" />
178 <xsl:for-each select="tmarc:d111">
179 <pz:metadata type="meeting-name">
180 <xsl:value-of select="tmarc:sa" />
182 <pz:metadata type="meeting-location">
183 <xsl:value-of select="tmarc:sc" />
185 <pz:metadata type="meeting-date">
186 <xsl:value-of select="tmarc:sd" />
190 <xsl:for-each select="tmarc:d260">
191 <pz:metadata type="date">
192 <xsl:value-of select="translate(tmarc:sc, 'cp[].', '')" />
196 <xsl:for-each select="tmarc:d130">
197 <pz:metadata type="title-uniform">
198 <xsl:value-of select="tmarc:sa" />
200 <pz:metadata type="title-uniform-media">
201 <xsl:value-of select="tmarc:sm" />
203 <pz:metadata type="title-uniform-parts">
204 <xsl:value-of select="tmarc:sn" />
206 <pz:metadata type="title-uniform-partname">
207 <xsl:value-of select="tmarc:sp" />
209 <pz:metadata type="title-uniform-key">
210 <xsl:value-of select="tmarc:sr" />
214 <xsl:for-each select="tmarc:d245">
215 <pz:metadata type="title">
216 <xsl:value-of select="tmarc:sa" />
218 <pz:metadata type="title-remainder">
219 <xsl:value-of select="tmarc:sb" />
221 <pz:metadata type="title-responsibility">
222 <xsl:value-of select="tmarc:sc" />
224 <pz:metadata type="title-dates">
225 <xsl:value-of select="tmarc:sf" />
227 <pz:metadata type="title-medium">
228 <xsl:value-of select="tmarc:sh" />
230 <pz:metadata type="title-number-section">
231 <xsl:value-of select="tmarc:sn" />
233 <pz:metadata type="title-complete">
234 <xsl:value-of select="tmarc:sa" />
235 <xsl:if test="tmarc:sb" ><xsl:value-of select="concat(' ', tmarc:sb)" /></xsl:if>
239 <xsl:for-each select="tmarc:d250">
240 <pz:metadata type="edition">
241 <xsl:value-of select="tmarc:sa" />
245 <xsl:for-each select="tmarc:d260">
246 <pz:metadata type="publication-place">
247 <xsl:value-of select="tmarc:sa" />
249 <pz:metadata type="publication-name">
250 <xsl:value-of select="tmarc:sb" />
252 <pz:metadata type="publication-date">
253 <xsl:value-of select="tmarc:sc" />
257 <xsl:for-each select="tmarc:d300">
258 <pz:metadata type="physical-extent">
259 <xsl:value-of select="tmarc:sa" />
261 <pz:metadata type="physical-format">
262 <xsl:value-of select="tmarc:sb" />
264 <pz:metadata type="physical-dimensions">
265 <xsl:value-of select="tmarc:sc" />
267 <pz:metadata type="physical-accomp">
268 <xsl:value-of select="tmarc:se" />
270 <pz:metadata type="physical-unittype">
271 <xsl:value-of select="tmarc:sf" />
273 <pz:metadata type="physical-unitsize">
274 <xsl:value-of select="tmarc:sg" />
276 <pz:metadata type="physical-specified">
277 <xsl:value-of select="tmarc:s3" />
281 <xsl:for-each select="tmarc:d440">
282 <pz:metadata type="series-title">
283 <xsl:value-of select="tmarc:sa" />
287 <xsl:for-each select="tmarc:d500">
288 <pz:metadata type="description">
289 <xsl:for-each select="node()">
290 <xsl:value-of select="text()" />
295 <xsl:for-each select="tmarc:d505">
296 <pz:metadata type="description">
297 <xsl:for-each select="node()">
298 <xsl:value-of select="text()" />
303 <xsl:for-each select="tmarc:d518">
304 <pz:metadata type="description">
305 <xsl:for-each select="node()">
306 <xsl:value-of select="text()" />
311 <xsl:for-each select="tmarc:d520">
312 <pz:metadata type="description">
313 <xsl:for-each select="node()">
314 <xsl:value-of select="text()" />
319 <xsl:for-each select="tmarc:d522">
320 <pz:metadata type="description">
321 <xsl:for-each select="node()">
322 <xsl:value-of select="text()" />
327 <xsl:for-each select="tmarc:d600">
328 <pz:metadata type="subject">
329 <xsl:value-of select="tmarc:sa" />
331 <pz:metadata type="subject-long">
332 <xsl:for-each select="node()/text()">
333 <xsl:if test="position() > 1">
334 <xsl:text>, </xsl:text>
336 <xsl:value-of select="." />
341 <xsl:for-each select="tmarc:d610">
342 <pz:metadata type="subject">
343 <xsl:value-of select="tmarc:sa" />
345 <pz:metadata type="subject-long">
346 <xsl:for-each select="node()/text()">
347 <xsl:if test="position() > 1">
348 <xsl:text>, </xsl:text>
350 <xsl:value-of select="." />
355 <xsl:for-each select="tmarc:d611">
356 <pz:metadata type="subject">
357 <xsl:value-of select="tmarc:sa" />
359 <pz:metadata type="subject-long">
360 <xsl:for-each select="node()/text()">
361 <xsl:if test="position() > 1">
362 <xsl:text>, </xsl:text>
364 <xsl:value-of select="." />
369 <xsl:for-each select="tmarc:d630">
370 <pz:metadata type="subject">
371 <xsl:value-of select="tmarc:sa" />
373 <pz:metadata type="subject-long">
374 <xsl:for-each select="node()/text()">
375 <xsl:if test="position() > 1">
376 <xsl:text>, </xsl:text>
378 <xsl:value-of select="." />
383 <xsl:for-each select="tmarc:d648">
384 <pz:metadata type="subject">
385 <xsl:value-of select="tmarc:sa" />
387 <pz:metadata type="subject-long">
388 <xsl:for-each select="node()/text()">
389 <xsl:if test="position() > 1">
390 <xsl:text>, </xsl:text>
392 <xsl:value-of select="." />
397 <xsl:for-each select="tmarc:d650">
398 <pz:metadata type="subject">
399 <xsl:value-of select="tmarc:sa" />
401 <pz:metadata type="subject-long">
402 <xsl:for-each select="node()/text()">
403 <xsl:if test="position() > 1">
404 <xsl:text>, </xsl:text>
406 <xsl:value-of select="." />
411 <xsl:for-each select="tmarc:d651">
412 <pz:metadata type="subject">
413 <xsl:value-of select="tmarc:sa" />
415 <pz:metadata type="subject-long">
416 <xsl:for-each select="node()/text()">
417 <xsl:if test="position() > 1">
418 <xsl:text>, </xsl:text>
420 <xsl:value-of select="." />
425 <xsl:for-each select="tmarc:d653">
426 <pz:metadata type="subject">
427 <xsl:value-of select="tmarc:sa" />
429 <pz:metadata type="subject-long">
430 <xsl:for-each select="node()/text()">
431 <xsl:if test="position() > 1">
432 <xsl:text>, </xsl:text>
434 <xsl:value-of select="." />
439 <xsl:for-each select="tmarc:d654">
440 <pz:metadata type="subject">
441 <xsl:value-of select="tmarc:sa" />
443 <pz:metadata type="subject-long">
444 <xsl:for-each select="node()/text()">
445 <xsl:if test="position() > 1">
446 <xsl:text>, </xsl:text>
448 <xsl:value-of select="." />
453 <xsl:for-each select="tmarc:d655">
454 <pz:metadata type="subject">
455 <xsl:value-of select="tmarc:sa" />
457 <pz:metadata type="subject-long">
458 <xsl:for-each select="node()/text()">
459 <xsl:if test="position() > 1">
460 <xsl:text>, </xsl:text>
462 <xsl:value-of select="." />
467 <xsl:for-each select="tmarc:d656">
468 <pz:metadata type="subject">
469 <xsl:value-of select="tmarc:sa" />
471 <pz:metadata type="subject-long">
472 <xsl:for-each select="node()/text()">
473 <xsl:if test="position() > 1">
474 <xsl:text>, </xsl:text>
476 <xsl:value-of select="." />
481 <xsl:for-each select="tmarc:d657">
482 <pz:metadata type="subject">
483 <xsl:value-of select="tmarc:sa" />
485 <pz:metadata type="subject-long">
486 <xsl:for-each select="node()/text()">
487 <xsl:if test="position() > 1">
488 <xsl:text>, </xsl:text>
490 <xsl:value-of select="." />
495 <xsl:for-each select="tmarc:d658">
496 <pz:metadata type="subject">
497 <xsl:value-of select="tmarc:sa" />
499 <pz:metadata type="subject-long">
500 <xsl:for-each select="node()/text()">
501 <xsl:if test="position() > 1">
502 <xsl:text>, </xsl:text>
504 <xsl:value-of select="." />
509 <xsl:for-each select="tmarc:d662">
510 <pz:metadata type="subject">
511 <xsl:value-of select="tmarc:sa" />
513 <pz:metadata type="subject-long">
514 <xsl:for-each select="node()/text()">
515 <xsl:if test="position() > 1">
516 <xsl:text>, </xsl:text>
518 <xsl:value-of select="." />
523 <xsl:for-each select="tmarc:d69X">
524 <pz:metadata type="subject">
525 <xsl:value-of select="tmarc:sa" />
527 <pz:metadata type="subject-long">
528 <xsl:for-each select="node()/text()">
529 <xsl:if test="position() > 1">
530 <xsl:text>, </xsl:text>
532 <xsl:value-of select="." />
537 <!-- or tmarc:d651 or tmarc:d653 or tmarc:d654 or tmarc:d655 or tmarc:d656
538 or tmarc:d657 or tmarc:d658 or tmarc:d662 or tmarc:d69X"> -->
540 <!-- <xsl:for-each select="tmarc:d600" > <pz:metadata type="subject">
541 <xsl:value-of select="tmarc:sa"/> </pz:metadata> <pz:metadata type="subject-long">
542 <xsl:for-each select="tmarc:sa tmarc:sb tmarc:sc tmarc:sd "> <xsl:if test="position()
543 > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:value-of select="."/> </xsl:for-each>
544 </pz:metadata> </xsl:for-each> -->
546 <xsl:for-each select="tmarc:d856">
547 <pz:metadata type="electronic-url">
548 <xsl:value-of select="tmarc:su" />
550 <pz:metadata type="electronic-text">
551 <xsl:if test="tmarc:sy">
552 <xsl:value-of select="tmarc:sy/text()" />
554 <xsl:if test="tmarc:s3">
555 <xsl:value-of select="tmarc:s3/text()" />
558 <pz:metadata type="electronic-note">
559 <xsl:value-of select="tmarc:sz" />
561 <pz:metadata type="electronic-format-instruction">
562 <xsl:value-of select="tmarc:si" />
564 <pz:metadata type="electronic-format-type">
565 <xsl:value-of select="tmarc:sq" />
569 <xsl:for-each select="tmarc:d773">
570 <pz:metadata type="citation">
571 <xsl:for-each select="*">
572 <xsl:value-of select="normalize-space(.)" />
573 <xsl:text> </xsl:text>
578 <xsl:for-each select="tmarc:d852">
579 <xsl:if test="tmarc:sy">
580 <pz:metadata type="publicnote">
581 <xsl:value-of select="tmarc:sy" />
584 <xsl:if test="tmarc:sh">
585 <pz:metadata type="callnumber">
586 <xsl:value-of select="tmarc:sh" />
591 <pz:metadata type="medium">
592 <xsl:value-of select="$medium" />
593 <xsl:if test="string-length($electronic) and $medium != 'electronic'">
594 <xsl:text> (electronic)</xsl:text>
598 <xsl:for-each select="tmarc:d900/tmarc:sa">
599 <pz:metadata type="fulltext">
600 <xsl:value-of select="." />
604 <!-- <xsl:if test="$fulltext_a"> <pz:metadata type="fulltext"> <xsl:value-of
605 select="$fulltext_a"/> </pz:metadata> </xsl:if> -->
607 <xsl:for-each select="tmarc:d900/tmarc:sb">
608 <pz:metadata type="fulltext">
609 <xsl:value-of select="." />
613 <!-- <xsl:if test="$fulltext_b"> <pz:metadata type="fulltext"> <xsl:value-of
614 select="$fulltext_b"/> </pz:metadata> </xsl:if> -->
616 <xsl:for-each select="tmarc:d907">
617 <!-- or tmarc:d901"> -->
618 <pz:metadata type="iii-id">
619 <xsl:value-of select="tmarc:sa" />
623 <xsl:for-each select="tmarc:d926">
624 <pz:metadata type="locallocation">
625 <xsl:choose><xsl:when test="tmarc:sa">
626 <xsl:value-of select="tmarc:sa"/>
627 </xsl:when><xsl:otherwise>
628 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
629 </xsl:otherwise></xsl:choose>
631 <pz:metadata type="callnumber">
632 <xsl:choose><xsl:when test="tmarc:sc">
633 <xsl:value-of select="tmarc:sc"/>
634 </xsl:when><xsl:otherwise>
635 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
636 </xsl:otherwise></xsl:choose>
638 <pz:metadata type="available">
639 <xsl:choose><xsl:when test="tmarc:se">
640 <xsl:value-of select="tmarc:se"/>
641 </xsl:when><xsl:otherwise>
642 <xsl:text>PAZPAR2_NULL_VALUE</xsl:text>
643 </xsl:otherwise></xsl:choose>
647 <xsl:for-each select="tmarc:d948">
648 <pz:metadata type="holding">
649 <xsl:for-each select="tmarc:s">
650 <xsl:if test="position() > 1">
651 <xsl:text> </xsl:text>
653 <xsl:value-of select="." />
658 <xsl:for-each select="tmarc:d991">
659 <pz:metadata type="holding">
660 <xsl:for-each select="tmarc:s">
661 <xsl:if test="position() > 1">
662 <xsl:text> </xsl:text>
664 <xsl:value-of select="." />
669 <!-- passthrough id data -->
670 <xsl:for-each select="pz:metadata">
671 <xsl:copy-of select="." />
674 <!-- other stylesheets importing this might want to define this -->
675 <xsl:call-template name="record-hook" />
680 <xsl:template match="text()" />
682 <!-- TODO Does not work anymore -->
683 <xsl:template name="shortTitle">
684 <xsl:param name="tag" />
685 <xsl:for-each select="tmarc:d">
686 <xsl:value-of select="tmarc:sa" />
687 <xsl:value-of select="tmarc:sm" />
688 <xsl:value-of select="tmarc:sn" />
689 <xsl:value-of select="tmarc:sp" />
690 <xsl:value-of select="tmarc:sr" />
694 <!-- No working as expected -->
695 <xsl:template name="description">
696 <xsl:param name="element" />
697 <xsl:for-each select="$element">
698 <pz:metadata type="description">
699 <xsl:for-each select="node()">
700 <xsl:value-of select="text()" />
704 <xsl:apply-templates />
707 <!-- <xsl:for-each select="tmarc:d500"> <pz:metadata type="description">
708 <xsl:for-each select="node()"> <xsl:value-of select="text()"/> </xsl:for-each>
709 </pz:metadata> </xsl:for-each> -->
713 <xsl:template name="subject">
714 <xsl:param name="element" />
715 <xsl:for-each select="$element">
716 <pz:metadata type="subject">
717 <xsl:value-of select="tmarc:sa" />
719 <pz:metadata type="subject-long">
720 <xsl:for-each select="node()/text()">
721 <xsl:if test="position() > 1">
722 <xsl:text>, </xsl:text>
724 <xsl:value-of select="." />