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="$typeofrec='a' or $typeofrec='i' and
86 ($typeofserial='d' or $typeofserial='w')">data</xsl:when>
87 <xsl:when test="$typeofrec='m'">software</xsl:when>
88 <xsl:when test="$journal_title">
89 <xsl:text>article</xsl:text>
91 <xsl:when test="$title_medium">
92 <xsl:value-of select="translate($title_medium, ' []/:', '')" />
95 <xsl:text>other</xsl:text>
102 <xsl:attribute name="mergekey">
103 <xsl:text>title </xsl:text>
104 <xsl:value-of select="tmarc:d245/tmarc:sa" />
105 <xsl:text> author </xsl:text>
106 <xsl:value-of select="tmarc:d100/tmarc:sa" />
107 <xsl:text> medium </xsl:text>
108 <xsl:value-of select="$medium" />
112 <xsl:for-each select="tmarc:c001">
113 <pz:metadata type="id">
114 <xsl:value-of select="." />
118 <xsl:for-each select="tmarc:d010">
119 <pz:metadata type="lccn">
120 <xsl:value-of select="tmarc:sa" />
124 <xsl:for-each select="tmarc:d020">
125 <pz:metadata type="isbn">
126 <xsl:value-of select="tmarc:sa" />
130 <xsl:for-each select="tmarc:d022">
131 <pz:metadata type="issn">
132 <xsl:value-of select="tmarc:sa" />
136 <xsl:for-each select="tmarc:d027">
137 <pz:metadata type="tech-rep-nr">
138 <xsl:value-of select="tmarc:sa" />
142 <xsl:for-each select="tmarc:d035">
143 <pz:metadata type="system-control-nr">
144 <xsl:value-of select="tmarc:sa" />
148 <xsl:for-each select="tmarc:d100">
149 <pz:metadata type="author">
150 <xsl:value-of select="tmarc:sa" />
152 <pz:metadata type="author-title">
153 <xsl:value-of select="tmarc:sc" />
155 <pz:metadata type="author-date">
156 <xsl:value-of select="tmarc:sd" />
160 <xsl:for-each select="tmarc:d110">
161 <pz:metadata type="corporate-name">
162 <xsl:value-of select="tmarc:sa" />
164 <pz:metadata type="corporate-location">
165 <xsl:value-of select="tmarc:sc" />
167 <pz:metadata type="corporate-date">
168 <xsl:value-of select="tmarc:sd" />
172 <xsl:for-each select="tmarc:d111">
173 <pz:metadata type="meeting-name">
174 <xsl:value-of select="tmarc:sa" />
176 <pz:metadata type="meeting-location">
177 <xsl:value-of select="tmarc:sc" />
179 <pz:metadata type="meeting-date">
180 <xsl:value-of select="tmarc:sd" />
184 <xsl:for-each select="tmarc:d260">
185 <pz:metadata type="date">
186 <xsl:value-of select="tmarc:sc" />
190 <xsl:for-each select="tmarc:d130">
191 <pz:metadata type="title-uniform">
192 <xsl:value-of select="tmarc:sa" />
194 <pz:metadata type="title-uniform-media">
195 <xsl:value-of select="tmarc:sm" />
197 <pz:metadata type="title-uniform-parts">
198 <xsl:value-of select="tmarc:sn" />
200 <pz:metadata type="title-uniform-partname">
201 <xsl:value-of select="tmarc:sp" />
203 <pz:metadata type="title-uniform-key">
204 <xsl:value-of select="tmarc:sr" />
208 <xsl:for-each select="tmarc:d245">
209 <pz:metadata type="title">
210 <xsl:value-of select="tmarc:sa" />
212 <pz:metadata type="title-remainder">
213 <xsl:value-of select="tmarc:sb" />
215 <pz:metadata type="title-responsibility">
216 <xsl:value-of select="tmarc:sc" />
218 <pz:metadata type="title-dates">
219 <xsl:value-of select="tmarc:sf" />
221 <pz:metadata type="title-medium">
222 <xsl:value-of select="tmarc:sh" />
224 <pz:metadata type="title-number-section">
225 <xsl:value-of select="tmarc:sn" />
229 <xsl:for-each select="tmarc:d250">
230 <pz:metadata type="edition">
231 <xsl:value-of select="tmarc:sa" />
235 <xsl:for-each select="tmarc:d260">
236 <pz:metadata type="publication-place">
237 <xsl:value-of select="tmarc:sa" />
239 <pz:metadata type="publication-name">
240 <xsl:value-of select="tmarc:sb" />
242 <pz:metadata type="publication-date">
243 <xsl:value-of select="tmarc:sc" />
247 <xsl:for-each select="tmarc:d300">
248 <pz:metadata type="physical-extent">
249 <xsl:value-of select="tmarc:sa" />
251 <pz:metadata type="physical-format">
252 <xsl:value-of select="tmarc:sb" />
254 <pz:metadata type="physical-dimensions">
255 <xsl:value-of select="tmarc:sc" />
257 <pz:metadata type="physical-accomp">
258 <xsl:value-of select="tmarc:se" />
260 <pz:metadata type="physical-unittype">
261 <xsl:value-of select="tmarc:sf" />
263 <pz:metadata type="physical-unitsize">
264 <xsl:value-of select="tmarc:sg" />
266 <pz:metadata type="physical-specified">
267 <xsl:value-of select="tmarc:s3" />
271 <xsl:for-each select="tmarc:d440">
272 <pz:metadata type="series-title">
273 <xsl:value-of select="tmarc:sa" />
277 <xsl:for-each select="tmarc:d500">
278 <pz:metadata type="description">
279 <xsl:for-each select="node()">
280 <xsl:value-of select="text()" />
285 <xsl:for-each select="tmarc:d505">
286 <pz:metadata type="description">
287 <xsl:for-each select="node()">
288 <xsl:value-of select="text()" />
293 <xsl:for-each select="tmarc:d518">
294 <pz:metadata type="description">
295 <xsl:for-each select="node()">
296 <xsl:value-of select="text()" />
301 <xsl:for-each select="tmarc:d520">
302 <pz:metadata type="description">
303 <xsl:for-each select="node()">
304 <xsl:value-of select="text()" />
309 <xsl:for-each select="tmarc:d522">
310 <pz:metadata type="description">
311 <xsl:for-each select="node()">
312 <xsl:value-of select="text()" />
317 <xsl:for-each select="tmarc:d600">
318 <pz:metadata type="subject">
319 <xsl:value-of select="tmarc:sa" />
321 <pz:metadata type="subject-long">
322 <xsl:for-each select="node()/text()">
323 <xsl:if test="position() > 1">
324 <xsl:text>, </xsl:text>
326 <xsl:value-of select="." />
331 <xsl:for-each select="tmarc:d610">
332 <pz:metadata type="subject">
333 <xsl:value-of select="tmarc:sa" />
335 <pz:metadata type="subject-long">
336 <xsl:for-each select="node()/text()">
337 <xsl:if test="position() > 1">
338 <xsl:text>, </xsl:text>
340 <xsl:value-of select="." />
345 <xsl:for-each select="tmarc:d611">
346 <pz:metadata type="subject">
347 <xsl:value-of select="tmarc:sa" />
349 <pz:metadata type="subject-long">
350 <xsl:for-each select="node()/text()">
351 <xsl:if test="position() > 1">
352 <xsl:text>, </xsl:text>
354 <xsl:value-of select="." />
359 <xsl:for-each select="tmarc:d630">
360 <pz:metadata type="subject">
361 <xsl:value-of select="tmarc:sa" />
363 <pz:metadata type="subject-long">
364 <xsl:for-each select="node()/text()">
365 <xsl:if test="position() > 1">
366 <xsl:text>, </xsl:text>
368 <xsl:value-of select="." />
373 <xsl:for-each select="tmarc:d648">
374 <pz:metadata type="subject">
375 <xsl:value-of select="tmarc:sa" />
377 <pz:metadata type="subject-long">
378 <xsl:for-each select="node()/text()">
379 <xsl:if test="position() > 1">
380 <xsl:text>, </xsl:text>
382 <xsl:value-of select="." />
387 <xsl:for-each select="tmarc:d650">
388 <pz:metadata type="subject">
389 <xsl:value-of select="tmarc:sa" />
391 <pz:metadata type="subject-long">
392 <xsl:for-each select="node()/text()">
393 <xsl:if test="position() > 1">
394 <xsl:text>, </xsl:text>
396 <xsl:value-of select="." />
401 <xsl:for-each select="tmarc:d651">
402 <pz:metadata type="subject">
403 <xsl:value-of select="tmarc:sa" />
405 <pz:metadata type="subject-long">
406 <xsl:for-each select="node()/text()">
407 <xsl:if test="position() > 1">
408 <xsl:text>, </xsl:text>
410 <xsl:value-of select="." />
415 <xsl:for-each select="tmarc:d653">
416 <pz:metadata type="subject">
417 <xsl:value-of select="tmarc:sa" />
419 <pz:metadata type="subject-long">
420 <xsl:for-each select="node()/text()">
421 <xsl:if test="position() > 1">
422 <xsl:text>, </xsl:text>
424 <xsl:value-of select="." />
429 <xsl:for-each select="tmarc:d654">
430 <pz:metadata type="subject">
431 <xsl:value-of select="tmarc:sa" />
433 <pz:metadata type="subject-long">
434 <xsl:for-each select="node()/text()">
435 <xsl:if test="position() > 1">
436 <xsl:text>, </xsl:text>
438 <xsl:value-of select="." />
443 <xsl:for-each select="tmarc:d655">
444 <pz:metadata type="subject">
445 <xsl:value-of select="tmarc:sa" />
447 <pz:metadata type="subject-long">
448 <xsl:for-each select="node()/text()">
449 <xsl:if test="position() > 1">
450 <xsl:text>, </xsl:text>
452 <xsl:value-of select="." />
457 <xsl:for-each select="tmarc:d656">
458 <pz:metadata type="subject">
459 <xsl:value-of select="tmarc:sa" />
461 <pz:metadata type="subject-long">
462 <xsl:for-each select="node()/text()">
463 <xsl:if test="position() > 1">
464 <xsl:text>, </xsl:text>
466 <xsl:value-of select="." />
471 <xsl:for-each select="tmarc:d657">
472 <pz:metadata type="subject">
473 <xsl:value-of select="tmarc:sa" />
475 <pz:metadata type="subject-long">
476 <xsl:for-each select="node()/text()">
477 <xsl:if test="position() > 1">
478 <xsl:text>, </xsl:text>
480 <xsl:value-of select="." />
485 <xsl:for-each select="tmarc:d658">
486 <pz:metadata type="subject">
487 <xsl:value-of select="tmarc:sa" />
489 <pz:metadata type="subject-long">
490 <xsl:for-each select="node()/text()">
491 <xsl:if test="position() > 1">
492 <xsl:text>, </xsl:text>
494 <xsl:value-of select="." />
499 <xsl:for-each select="tmarc:d662">
500 <pz:metadata type="subject">
501 <xsl:value-of select="tmarc:sa" />
503 <pz:metadata type="subject-long">
504 <xsl:for-each select="node()/text()">
505 <xsl:if test="position() > 1">
506 <xsl:text>, </xsl:text>
508 <xsl:value-of select="." />
513 <xsl:for-each select="tmarc:d69X">
514 <pz:metadata type="subject">
515 <xsl:value-of select="tmarc:sa" />
517 <pz:metadata type="subject-long">
518 <xsl:for-each select="node()/text()">
519 <xsl:if test="position() > 1">
520 <xsl:text>, </xsl:text>
522 <xsl:value-of select="." />
527 <!-- or tmarc:d651 or tmarc:d653 or tmarc:d654 or tmarc:d655 or tmarc:d656
528 or tmarc:d657 or tmarc:d658 or tmarc:d662 or tmarc:d69X"> -->
530 <!-- <xsl:for-each select="tmarc:d600" > <pz:metadata type="subject">
531 <xsl:value-of select="tmarc:sa"/> </pz:metadata> <pz:metadata type="subject-long">
532 <xsl:for-each select="tmarc:sa tmarc:sb tmarc:sc tmarc:sd "> <xsl:if test="position()
533 > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:value-of select="."/> </xsl:for-each>
534 </pz:metadata> </xsl:for-each> -->
536 <xsl:for-each select="tmarc:d856">
537 <pz:metadata type="electronic-url">
538 <xsl:value-of select="tmarc:su" />
540 <pz:metadata type="electronic-text">
541 <xsl:if test="tmarc:sy">
542 <xsl:value-of select="tmarc:sy/text()" />
544 <xsl:if test="tmarc:s3">
545 <xsl:value-of select="tmarc:s3/text()" />
548 <pz:metadata type="electronic-note">
549 <xsl:value-of select="tmarc:sz" />
551 <pz:metadata type="electronic-format-instruction">
552 <xsl:value-of select="tmarc:si" />
554 <pz:metadata type="electronic-format-type">
555 <xsl:value-of select="tmarc:sq" />
559 <xsl:for-each select="tmarc:d773">
560 <pz:metadata type="citation">
561 <xsl:for-each select="*">
562 <xsl:value-of select="normalize-space(.)" />
563 <xsl:text> </xsl:text>
568 <xsl:for-each select="tmarc:d852">
569 <xsl:if test="tmarc:sy">
570 <pz:metadata type="publicnote">
571 <xsl:value-of select="tmarc:sy" />
574 <xsl:if test="tmarc:sh">
575 <pz:metadata type="callnumber">
576 <xsl:value-of select="tmarc:sh" />
581 <pz:metadata type="medium">
582 <xsl:value-of select="$medium" />
585 <pz:metadata type="electronic">
586 <xsl:value-of select="$electronic"/>
589 <xsl:for-each select="tmarc:d900/tmarc:sa">
590 <pz:metadata type="fulltext">
591 <xsl:value-of select="." />
595 <!-- <xsl:if test="$fulltext_a"> <pz:metadata type="fulltext"> <xsl:value-of
596 select="$fulltext_a"/> </pz:metadata> </xsl:if> -->
598 <xsl:for-each select="tmarc:d900/tmarc:sb">
599 <pz:metadata type="fulltext">
600 <xsl:value-of select="." />
604 <!-- <xsl:if test="$fulltext_b"> <pz:metadata type="fulltext"> <xsl:value-of
605 select="$fulltext_b"/> </pz:metadata> </xsl:if> -->
607 <xsl:for-each select="tmarc:d907">
608 <!-- or tmarc:d901"> -->
609 <pz:metadata type="iii-id">
610 <xsl:value-of select="tmarc:sa" />
614 <xsl:for-each select="tmarc:d926">
615 <pz:metadata type="holding">
616 <xsl:for-each select="tmarc:s">
617 <xsl:if test="position() > 1">
618 <xsl:text> </xsl:text>
620 <xsl:value-of select="." />
625 <xsl:for-each select="tmarc:d948">
626 <pz:metadata type="holding">
627 <xsl:for-each select="tmarc:s">
628 <xsl:if test="position() > 1">
629 <xsl:text> </xsl:text>
631 <xsl:value-of select="." />
636 <xsl:for-each select="tmarc:d991">
637 <pz:metadata type="holding">
638 <xsl:for-each select="tmarc:s">
639 <xsl:if test="position() > 1">
640 <xsl:text> </xsl:text>
642 <xsl:value-of select="." />
647 <pz:metadata tag="tag100">
648 <xsl:call-template name="shortTitle">
649 <xsl:with-param name="tag" select="100" />
653 <!-- passthrough id data -->
654 <xsl:for-each select="pz:metadata">
655 <xsl:copy-of select="." />
658 <!-- other stylesheets importing this might want to define this -->
659 <xsl:call-template name="record-hook" />
664 <xsl:template match="text()" />
666 <!-- TODO Does not work anymore -->
667 <xsl:template name="shortTitle">
668 <xsl:param name="tag" />
669 <xsl:for-each select="tmarc:d">
670 <xsl:value-of select="tmarc:sa" />
671 <xsl:value-of select="tmarc:sm" />
672 <xsl:value-of select="tmarc:sn" />
673 <xsl:value-of select="tmarc:sp" />
674 <xsl:value-of select="tmarc:sr" />
678 <!-- No working as expected -->
679 <xsl:template name="description">
680 <xsl:param name="element" />
681 <xsl:for-each select="$element">
682 <pz:metadata type="description">
683 <xsl:for-each select="node()">
684 <xsl:value-of select="text()" />
688 <xsl:apply-templates />
691 <!-- <xsl:for-each select="tmarc:d500"> <pz:metadata type="description">
692 <xsl:for-each select="node()"> <xsl:value-of select="text()"/> </xsl:for-each>
693 </pz:metadata> </xsl:for-each> -->
697 <xsl:template name="subject">
698 <xsl:param name="element" />
699 <xsl:for-each select="$element">
700 <pz:metadata type="subject">
701 <xsl:value-of select="tmarc:sa" />
703 <pz:metadata type="subject-long">
704 <xsl:for-each select="node()/text()">
705 <xsl:if test="position() > 1">
706 <xsl:text>, </xsl:text>
708 <xsl:value-of select="." />