3 -- check whether patch can be applied
4 -- SELECT evergreen.upgrade_deps_block_check('YYYY', :eg_version);
6 ALTER TABLE authority.control_set_authority_field
7 ADD COLUMN display_sf_list TEXT;
9 UPDATE authority.control_set_authority_field
10 SET display_sf_list = REGEXP_REPLACE(sf_list, '[w254]', '', 'g');
12 ALTER TABLE authority.control_set_authority_field
13 ALTER COLUMN display_sf_list SET NOT NULL;
15 ALTER TABLE metabib.browse_entry_def_map
16 ADD COLUMN authority BIGINT REFERENCES authority.record_entry (id)
19 ALTER TABLE config.metabib_field ADD COLUMN authority_xpath TEXT;
20 ALTER TABLE config.metabib_field ADD COLUMN browse_sort_xpath TEXT;
22 UPDATE config.metabib_field
23 SET authority_xpath = '//@xlink:href'
26 field_class IN ('subject','series','title','author') AND
29 ALTER TYPE metabib.field_entry_template ADD ATTRIBUTE authority BIGINT;
30 ALTER TYPE metabib.field_entry_template ADD ATTRIBUTE sort_value TEXT;
32 CREATE OR REPLACE FUNCTION metabib.reingest_metabib_field_entries( bib_id BIGINT, skip_facet BOOL DEFAULT FALSE, skip_browse BOOL DEFAULT FALSE, skip_search BOOL DEFAULT FALSE ) RETURNS VOID AS $func$
35 ind_data metabib.field_entry_template%ROWTYPE;
36 mbe_row metabib.browse_entry%ROWTYPE;
44 SELECT COALESCE(NULLIF(skip_facet, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name = 'ingest.skip_facet_indexing' AND enabled)) INTO b_skip_facet;
45 SELECT COALESCE(NULLIF(skip_browse, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name = 'ingest.skip_browse_indexing' AND enabled)) INTO b_skip_browse;
46 SELECT COALESCE(NULLIF(skip_search, FALSE), EXISTS (SELECT enabled FROM config.internal_flag WHERE name = 'ingest.skip_search_indexing' AND enabled)) INTO b_skip_search;
48 PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled;
50 IF NOT b_skip_search THEN
51 FOR fclass IN SELECT * FROM config.metabib_class LOOP
52 -- RAISE NOTICE 'Emptying out %', fclass.name;
53 EXECUTE $$DELETE FROM metabib.$$ || fclass.name || $$_field_entry WHERE source = $$ || bib_id;
56 IF NOT b_skip_facet THEN
57 DELETE FROM metabib.facet_entry WHERE source = bib_id;
59 IF NOT b_skip_browse THEN
60 DELETE FROM metabib.browse_entry_def_map WHERE source = bib_id;
64 FOR ind_data IN SELECT * FROM biblio.extract_metabib_field_entry( bib_id ) LOOP
65 IF ind_data.field < 0 THEN
66 ind_data.field = -1 * ind_data.field;
69 IF ind_data.facet_field AND NOT b_skip_facet THEN
70 INSERT INTO metabib.facet_entry (field, source, value)
71 VALUES (ind_data.field, ind_data.source, ind_data.value);
74 IF ind_data.browse_field AND NOT b_skip_browse THEN
75 -- A caveat about this SELECT: this should take care of replacing
76 -- old mbe rows when data changes, but not if normalization (by
77 -- which I mean specifically the output of
78 -- evergreen.oils_tsearch2()) changes. It may or may not be
79 -- expensive to add a comparison of index_vector to index_vector
80 -- to the WHERE clause below.
82 value_prepped := metabib.browse_normalize(ind_data.value, ind_data.field);
83 SELECT INTO mbe_row * FROM metabib.browse_entry
84 WHERE value = value_prepped AND sort_value = ind_data.sort_value;
89 INSERT INTO metabib.browse_entry
90 ( value, sort_value ) VALUES
91 ( value_prepped, ind_data.sort_value );
93 mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS);
96 INSERT INTO metabib.browse_entry_def_map (entry, def, source, authority)
97 VALUES (mbe_id, ind_data.field, ind_data.source, ind_data.authority);
100 IF ind_data.search_field AND NOT b_skip_search THEN
102 INSERT INTO metabib.$$ || ind_data.field_class || $$_field_entry (field, source, value)
104 quote_literal(ind_data.field) || $$, $$ ||
105 quote_literal(ind_data.source) || $$, $$ ||
106 quote_literal(ind_data.value) ||
112 IF NOT b_skip_search THEN
113 PERFORM metabib.update_combined_index_vectors(bib_id);
118 $func$ LANGUAGE PLPGSQL;
121 CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry ( rid BIGINT, default_joiner TEXT ) RETURNS SETOF metabib.field_entry_template AS $func$
123 bib biblio.record_entry%ROWTYPE;
124 idx config.metabib_field%ROWTYPE;
125 xfrm config.xml_transform%ROWTYPE;
127 transformed_xml TEXT;
129 xml_node_list TEXT[];
135 joiner TEXT := default_joiner; -- XXX will index defs supply a joiner?
137 authority_link BIGINT;
138 output_row metabib.field_entry_template%ROWTYPE;
142 SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
144 -- Loop over the indexing entries
145 FOR idx IN SELECT * FROM config.metabib_field ORDER BY format LOOP
147 SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
149 -- See if we can skip the XSLT ... it's expensive
150 IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
151 -- Can't skip the transform
152 IF xfrm.xslt <> '---' THEN
153 transformed_xml := oils_xslt_process(bib.marc,xfrm.xslt);
155 transformed_xml := bib.marc;
158 prev_xfrm := xfrm.name;
161 xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
164 FOR xml_node IN SELECT x FROM unnest(xml_node_list) AS x LOOP
165 CONTINUE WHEN xml_node !~ E'^\\s*<';
167 curr_text := ARRAY_TO_STRING(
168 oils_xpath( '//text()',
169 REGEXP_REPLACE( -- This escapes all &s not followed by "amp;". Data ise returned from oils_xpath (above) in UTF-8, not entity encoded
170 REGEXP_REPLACE( -- This escapes embeded <s
172 $re$(>[^<]+)(<)([^>]+<)$re$,
184 CONTINUE WHEN curr_text IS NULL OR curr_text = '';
186 IF raw_text IS NOT NULL THEN
187 raw_text := raw_text || joiner;
190 raw_text := COALESCE(raw_text,'') || curr_text;
192 -- autosuggest/metabib.browse_entry
193 IF idx.browse_field THEN
195 IF idx.browse_xpath IS NOT NULL AND idx.browse_xpath <> '' THEN
196 browse_text := oils_xpath_string( idx.browse_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
198 browse_text := curr_text;
201 IF idx.browse_sort_xpath IS NOT NULL AND
202 idx.browse_sort_xpath <> '' THEN
204 sort_value := oils_xpath_string(
205 idx.browse_sort_xpath, xml_node, joiner,
206 ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
209 sort_value := browse_text;
212 output_row.field_class = idx.field_class;
213 output_row.field = idx.id;
214 output_row.source = rid;
215 output_row.value = BTRIM(REGEXP_REPLACE(browse_text, E'\\s+', ' ', 'g'));
216 output_row.sort_value :=
217 public.search_normalize(sort_value);
219 output_row.authority := NULL;
221 IF idx.authority_xpath IS NOT NULL AND idx.authority_xpath <> '' THEN
222 authority_text := oils_xpath_string(
223 idx.authority_xpath, xml_node, joiner,
225 ARRAY[xfrm.prefix, xfrm.namespace_uri],
226 ARRAY['xlink','http://www.w3.org/1999/xlink']
230 IF authority_text ~ '^\d+$' THEN
231 authority_link := authority_text::BIGINT;
232 PERFORM * FROM authority.record_entry WHERE id = authority_link;
234 output_row.authority := authority_link;
240 output_row.browse_field = TRUE;
241 RETURN NEXT output_row;
242 output_row.browse_field = FALSE;
243 output_row.sort_value := NULL;
246 -- insert raw node text for faceting
247 IF idx.facet_field THEN
249 IF idx.facet_xpath IS NOT NULL AND idx.facet_xpath <> '' THEN
250 facet_text := oils_xpath_string( idx.facet_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
252 facet_text := curr_text;
255 output_row.field_class = idx.field_class;
256 output_row.field = -1 * idx.id;
257 output_row.source = rid;
258 output_row.value = BTRIM(REGEXP_REPLACE(facet_text, E'\\s+', ' ', 'g'));
260 output_row.facet_field = TRUE;
261 RETURN NEXT output_row;
262 output_row.facet_field = FALSE;
267 CONTINUE WHEN raw_text IS NULL OR raw_text = '';
269 -- insert combined node text for searching
270 IF idx.search_field THEN
271 output_row.field_class = idx.field_class;
272 output_row.field = idx.id;
273 output_row.source = rid;
274 output_row.value = BTRIM(REGEXP_REPLACE(raw_text, E'\\s+', ' ', 'g'));
276 output_row.search_field = TRUE;
277 RETURN NEXT output_row;
278 output_row.search_field = FALSE;
285 $func$ LANGUAGE PLPGSQL;
288 -- 953.data.MODS32-xsl.sql
289 UPDATE config.xml_transform SET xslt=$$<?xml version="1.0" encoding="UTF-8"?>
290 <xsl:stylesheet xmlns="http://www.loc.gov/mods/v3" xmlns:marc="http://www.loc.gov/MARC21/slim" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xlink marc" version="1.0">
291 <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
293 Revision 1.14 - Fixed template isValid and fields 010, 020, 022, 024, 028, and 037 to output additional identifier elements
294 with corresponding @type and @invalid eq 'yes' when subfields z or y (in the case of 022) exist in the MARCXML ::: 2007/01/04 17:35:20 cred
296 Revision 1.13 - Changed order of output under cartographics to reflect schema 2006/11/28 tmee
298 Revision 1.12 - Updated to reflect MODS 3.2 Mapping 2006/10/11 tmee
300 Revision 1.11 - The attribute objectPart moved from <languageTerm> to <language>
303 Revision 1.10 MODS 3.1 revisions to language and classification elements
304 (plus ability to find marc:collection embedded in wrapper elements such as SRU zs: wrappers)
307 Revision 1.9 subfield $y was added to field 242 2004/09/02 10:57 jrad
309 Revision 1.8 Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
311 Revision 1.7 2004/03/25 08:29 jrad
313 Revision 1.6 various validation fixes 2004/02/20 ntra
315 Revision 1.5 2003/10/02 16:18:58 ntra
316 MODS2 to MODS3 updates, language unstacking and
317 de-duping, chopPunctuation expanded
319 Revision 1.3 2003/04/03 00:07:19 ntra
320 Revision 1.3 Additional Changes not related to MODS Version 2.0 by ntra
322 Revision 1.2 2003/03/24 19:37:42 ckeith
326 <xsl:template match="/">
328 <xsl:when test="//marc:collection">
329 <modsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
330 <xsl:for-each select="//marc:collection/marc:record">
332 <xsl:call-template name="marcRecord"/>
338 <mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
339 <xsl:for-each select="//marc:record">
340 <xsl:call-template name="marcRecord"/>
346 <xsl:template name="marcRecord">
347 <xsl:variable name="leader" select="marc:leader"/>
348 <xsl:variable name="leader6" select="substring($leader,7,1)"/>
349 <xsl:variable name="leader7" select="substring($leader,8,1)"/>
350 <xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
351 <xsl:variable name="typeOf008">
353 <xsl:when test="$leader6='a'">
355 <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
356 <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
359 <xsl:when test="$leader6='t'">BK</xsl:when>
360 <xsl:when test="$leader6='p'">MM</xsl:when>
361 <xsl:when test="$leader6='m'">CF</xsl:when>
362 <xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
363 <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
364 <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">MU</xsl:when>
367 <xsl:for-each select="marc:datafield[@tag='245']">
369 <xsl:variable name="title">
371 <xsl:when test="marc:subfield[@code='b']">
372 <xsl:call-template name="specialSubfieldSelect">
373 <xsl:with-param name="axis">b</xsl:with-param>
374 <xsl:with-param name="beforeCodes">afgk</xsl:with-param>
378 <xsl:call-template name="subfieldSelect">
379 <xsl:with-param name="codes">abfgk</xsl:with-param>
384 <xsl:variable name="titleChop">
385 <xsl:call-template name="chopPunctuation">
386 <xsl:with-param name="chopString">
387 <xsl:value-of select="$title"/>
392 <xsl:when test="@ind2>0">
394 <xsl:value-of select="substring($titleChop,1,@ind2)"/>
397 <xsl:value-of select="substring($titleChop,@ind2+1)"/>
402 <xsl:value-of select="$titleChop"/>
406 <xsl:if test="marc:subfield[@code='b']">
408 <xsl:call-template name="chopPunctuation">
409 <xsl:with-param name="chopString">
410 <xsl:call-template name="specialSubfieldSelect">
411 <xsl:with-param name="axis">b</xsl:with-param>
412 <xsl:with-param name="anyCodes">b</xsl:with-param>
413 <xsl:with-param name="afterCodes">afgk</xsl:with-param>
419 <xsl:call-template name="part"></xsl:call-template>
421 <!-- A form of title that ignores non-filing characters; useful
422 for not converting "L'Oreal" into "L' Oreal" at index time -->
424 <xsl:variable name="title">
426 <xsl:when test="marc:subfield[@code='b']">
427 <xsl:call-template name="specialSubfieldSelect">
428 <xsl:with-param name="axis">b</xsl:with-param>
429 <xsl:with-param name="beforeCodes">afgk</xsl:with-param>
433 <xsl:call-template name="subfieldSelect">
434 <xsl:with-param name="codes">abfgk</xsl:with-param>
440 <xsl:value-of select="$title"/>
442 <xsl:if test="marc:subfield[@code='b']">
444 <xsl:call-template name="chopPunctuation">
445 <xsl:with-param name="chopString">
446 <xsl:call-template name="specialSubfieldSelect">
447 <xsl:with-param name="axis">b</xsl:with-param>
448 <xsl:with-param name="anyCodes">b</xsl:with-param>
449 <xsl:with-param name="afterCodes">afgk</xsl:with-param>
455 <xsl:call-template name="part"></xsl:call-template>
458 <xsl:for-each select="marc:datafield[@tag='210']">
459 <titleInfo type="abbreviated">
461 <xsl:call-template name="chopPunctuation">
462 <xsl:with-param name="chopString">
463 <xsl:call-template name="subfieldSelect">
464 <xsl:with-param name="codes">a</xsl:with-param>
469 <xsl:call-template name="subtitle"/>
472 <xsl:for-each select="marc:datafield[@tag='242']">
473 <xsl:variable name="titleChop">
474 <xsl:call-template name="chopPunctuation">
475 <xsl:with-param name="chopString">
476 <xsl:call-template name="subfieldSelect">
477 <!-- 1/04 removed $h, b -->
478 <xsl:with-param name="codes">a</xsl:with-param>
483 <titleInfo type="translated">
484 <!--09/01/04 Added subfield $y-->
485 <xsl:for-each select="marc:subfield[@code='y']">
486 <xsl:attribute name="lang">
487 <xsl:value-of select="text()"/>
491 <xsl:value-of select="$titleChop" />
494 <xsl:call-template name="subtitle"/>
495 <xsl:call-template name="part"/>
497 <titleInfo type="translated-nfi">
498 <xsl:for-each select="marc:subfield[@code='y']">
499 <xsl:attribute name="lang">
500 <xsl:value-of select="text()"/>
504 <xsl:when test="@ind2>0">
506 <xsl:value-of select="substring($titleChop,1,@ind2)"/>
509 <xsl:value-of select="substring($titleChop,@ind2+1)"/>
514 <xsl:value-of select="$titleChop" />
518 <xsl:call-template name="subtitle"/>
519 <xsl:call-template name="part"/>
522 <xsl:for-each select="marc:datafield[@tag='246']">
523 <titleInfo type="alternative">
524 <xsl:for-each select="marc:subfield[@code='i']">
525 <xsl:attribute name="displayLabel">
526 <xsl:value-of select="text()"/>
530 <xsl:call-template name="chopPunctuation">
531 <xsl:with-param name="chopString">
532 <xsl:call-template name="subfieldSelect">
533 <!-- 1/04 removed $h, $b -->
534 <xsl:with-param name="codes">af</xsl:with-param>
539 <xsl:call-template name="subtitle"/>
540 <xsl:call-template name="part"/>
543 <xsl:for-each select="marc:datafield[@tag='130']|marc:datafield[@tag='240']|marc:datafield[@tag='730'][@ind2!='2']">
544 <xsl:variable name="nfi">
546 <xsl:when test="@tag='240'">
547 <xsl:value-of select="@ind2"/>
550 <xsl:value-of select="@ind1"/>
554 <xsl:variable name="titleChop">
555 <xsl:call-template name="uri" />
556 <xsl:variable name="str">
557 <xsl:for-each select="marc:subfield">
558 <xsl:if test="(contains('adfklmor',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
559 <xsl:value-of select="text()"/>
560 <xsl:text> </xsl:text>
564 <xsl:call-template name="chopPunctuation">
565 <xsl:with-param name="chopString">
566 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
570 <titleInfo type="uniform">
572 <xsl:value-of select="$titleChop"/>
574 <xsl:call-template name="part"/>
576 <titleInfo type="uniform-nfi">
578 <xsl:when test="$nfi>0">
580 <xsl:value-of select="substring($titleChop,1,$nfi)"/>
583 <xsl:value-of select="substring($titleChop,$nfi+1)"/>
588 <xsl:value-of select="$titleChop"/>
592 <xsl:call-template name="part"/>
595 <xsl:for-each select="marc:datafield[@tag='740'][@ind2!='2']">
596 <xsl:variable name="titleChop">
597 <xsl:call-template name="chopPunctuation">
598 <xsl:with-param name="chopString">
599 <xsl:call-template name="subfieldSelect">
600 <xsl:with-param name="codes">ah</xsl:with-param>
605 <titleInfo type="alternative">
607 <xsl:value-of select="$titleChop" />
609 <xsl:call-template name="part"/>
611 <titleInfo type="alternative-nfi">
613 <xsl:when test="@ind1>0">
615 <xsl:value-of select="substring($titleChop,1,@ind1)"/>
618 <xsl:value-of select="substring($titleChop,@ind1+1)"/>
623 <xsl:value-of select="$titleChop" />
627 <xsl:call-template name="part"/>
630 <xsl:for-each select="marc:datafield[@tag='100']">
631 <name type="personal">
632 <xsl:call-template name="uri" />
633 <xsl:call-template name="nameABCDQ"/>
634 <xsl:call-template name="affiliation"/>
636 <roleTerm authority="marcrelator" type="text">creator</roleTerm>
638 <xsl:call-template name="role"/>
641 <xsl:for-each select="marc:datafield[@tag='110']">
642 <name type="corporate">
643 <xsl:call-template name="uri" />
644 <xsl:call-template name="nameABCDN"/>
646 <roleTerm authority="marcrelator" type="text">creator</roleTerm>
648 <xsl:call-template name="role"/>
651 <xsl:for-each select="marc:datafield[@tag='111']">
652 <name type="conference">
653 <xsl:call-template name="uri" />
654 <xsl:call-template name="nameACDEQ"/>
656 <roleTerm authority="marcrelator" type="text">creator</roleTerm>
658 <xsl:call-template name="role"/>
661 <xsl:for-each select="marc:datafield[@tag='700'][not(marc:subfield[@code='t'])]">
662 <name type="personal">
663 <xsl:call-template name="uri" />
664 <xsl:call-template name="nameABCDQ"/>
665 <xsl:call-template name="affiliation"/>
666 <xsl:call-template name="role"/>
669 <xsl:for-each select="marc:datafield[@tag='710'][not(marc:subfield[@code='t'])]">
670 <name type="corporate">
671 <xsl:call-template name="uri" />
672 <xsl:call-template name="nameABCDN"/>
673 <xsl:call-template name="role"/>
676 <xsl:for-each select="marc:datafield[@tag='711'][not(marc:subfield[@code='t'])]">
677 <name type="conference">
678 <xsl:call-template name="uri" />
679 <xsl:call-template name="nameACDEQ"/>
680 <xsl:call-template name="role"/>
683 <xsl:for-each select="marc:datafield[@tag='720'][not(marc:subfield[@code='t'])]">
685 <xsl:if test="@ind1=1">
686 <xsl:attribute name="type">
687 <xsl:text>personal</xsl:text>
691 <xsl:value-of select="marc:subfield[@code='a']"/>
693 <xsl:call-template name="role"/>
697 <xsl:if test="$leader7='c'">
698 <xsl:attribute name="collection">yes</xsl:attribute>
700 <xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
701 <xsl:attribute name="manuscript">yes</xsl:attribute>
704 <xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
705 <xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
706 <xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
707 <xsl:when test="$leader6='i'">sound recording-nonmusical</xsl:when>
708 <xsl:when test="$leader6='j'">sound recording-musical</xsl:when>
709 <xsl:when test="$leader6='k'">still image</xsl:when>
710 <xsl:when test="$leader6='g'">moving image</xsl:when>
711 <xsl:when test="$leader6='r'">three dimensional object</xsl:when>
712 <xsl:when test="$leader6='m'">software, multimedia</xsl:when>
713 <xsl:when test="$leader6='p'">mixed material</xsl:when>
716 <xsl:if test="substring($controlField008,26,1)='d'">
717 <genre authority="marc">globe</genre>
719 <xsl:if test="marc:controlfield[@tag='007'][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
720 <genre authority="marc">remote sensing image</genre>
722 <xsl:if test="$typeOf008='MP'">
723 <xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"></xsl:variable>
725 <xsl:when test="$controlField008-25='a' or $controlField008-25='b' or $controlField008-25='c' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
726 <genre authority="marc">map</genre>
728 <xsl:when test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
729 <genre authority="marc">atlas</genre>
733 <xsl:if test="$typeOf008='SE'">
734 <xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"></xsl:variable>
736 <xsl:when test="$controlField008-21='d'">
737 <genre authority="marc">database</genre>
739 <xsl:when test="$controlField008-21='l'">
740 <genre authority="marc">loose-leaf</genre>
742 <xsl:when test="$controlField008-21='m'">
743 <genre authority="marc">series</genre>
745 <xsl:when test="$controlField008-21='n'">
746 <genre authority="marc">newspaper</genre>
748 <xsl:when test="$controlField008-21='p'">
749 <genre authority="marc">periodical</genre>
751 <xsl:when test="$controlField008-21='w'">
752 <genre authority="marc">web site</genre>
756 <xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
757 <xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"></xsl:variable>
759 <xsl:when test="contains($controlField008-24,'a')">
760 <genre authority="marc">abstract or summary</genre>
762 <xsl:when test="contains($controlField008-24,'b')">
763 <genre authority="marc">bibliography</genre>
765 <xsl:when test="contains($controlField008-24,'c')">
766 <genre authority="marc">catalog</genre>
768 <xsl:when test="contains($controlField008-24,'d')">
769 <genre authority="marc">dictionary</genre>
771 <xsl:when test="contains($controlField008-24,'e')">
772 <genre authority="marc">encyclopedia</genre>
774 <xsl:when test="contains($controlField008-24,'f')">
775 <genre authority="marc">handbook</genre>
777 <xsl:when test="contains($controlField008-24,'g')">
778 <genre authority="marc">legal article</genre>
780 <xsl:when test="contains($controlField008-24,'i')">
781 <genre authority="marc">index</genre>
783 <xsl:when test="contains($controlField008-24,'k')">
784 <genre authority="marc">discography</genre>
786 <xsl:when test="contains($controlField008-24,'l')">
787 <genre authority="marc">legislation</genre>
789 <xsl:when test="contains($controlField008-24,'m')">
790 <genre authority="marc">theses</genre>
792 <xsl:when test="contains($controlField008-24,'n')">
793 <genre authority="marc">survey of literature</genre>
795 <xsl:when test="contains($controlField008-24,'o')">
796 <genre authority="marc">review</genre>
798 <xsl:when test="contains($controlField008-24,'p')">
799 <genre authority="marc">programmed text</genre>
801 <xsl:when test="contains($controlField008-24,'q')">
802 <genre authority="marc">filmography</genre>
804 <xsl:when test="contains($controlField008-24,'r')">
805 <genre authority="marc">directory</genre>
807 <xsl:when test="contains($controlField008-24,'s')">
808 <genre authority="marc">statistics</genre>
810 <xsl:when test="contains($controlField008-24,'t')">
811 <genre authority="marc">technical report</genre>
813 <xsl:when test="contains($controlField008-24,'v')">
814 <genre authority="marc">legal case and case notes</genre>
816 <xsl:when test="contains($controlField008-24,'w')">
817 <genre authority="marc">law report or digest</genre>
819 <xsl:when test="contains($controlField008-24,'z')">
820 <genre authority="marc">treaty</genre>
823 <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"></xsl:variable>
825 <xsl:when test="$controlField008-29='1'">
826 <genre authority="marc">conference publication</genre>
830 <xsl:if test="$typeOf008='CF'">
831 <xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"></xsl:variable>
833 <xsl:when test="$controlField008-26='a'">
834 <genre authority="marc">numeric data</genre>
836 <xsl:when test="$controlField008-26='e'">
837 <genre authority="marc">database</genre>
839 <xsl:when test="$controlField008-26='f'">
840 <genre authority="marc">font</genre>
842 <xsl:when test="$controlField008-26='g'">
843 <genre authority="marc">game</genre>
847 <xsl:if test="$typeOf008='BK'">
848 <xsl:if test="substring($controlField008,25,1)='j'">
849 <genre authority="marc">patent</genre>
851 <xsl:if test="substring($controlField008,31,1)='1'">
852 <genre authority="marc">festschrift</genre>
854 <xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"></xsl:variable>
855 <xsl:if test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
856 <genre authority="marc">biography</genre>
858 <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"></xsl:variable>
860 <xsl:when test="$controlField008-33='e'">
861 <genre authority="marc">essay</genre>
863 <xsl:when test="$controlField008-33='d'">
864 <genre authority="marc">drama</genre>
866 <xsl:when test="$controlField008-33='c'">
867 <genre authority="marc">comic strip</genre>
869 <xsl:when test="$controlField008-33='l'">
870 <genre authority="marc">fiction</genre>
872 <xsl:when test="$controlField008-33='h'">
873 <genre authority="marc">humor, satire</genre>
875 <xsl:when test="$controlField008-33='i'">
876 <genre authority="marc">letter</genre>
878 <xsl:when test="$controlField008-33='f'">
879 <genre authority="marc">novel</genre>
881 <xsl:when test="$controlField008-33='j'">
882 <genre authority="marc">short story</genre>
884 <xsl:when test="$controlField008-33='s'">
885 <genre authority="marc">speech</genre>
889 <xsl:if test="$typeOf008='MU'">
890 <xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"></xsl:variable>
891 <xsl:if test="contains($controlField008-30-31,'b')">
892 <genre authority="marc">biography</genre>
894 <xsl:if test="contains($controlField008-30-31,'c')">
895 <genre authority="marc">conference publication</genre>
897 <xsl:if test="contains($controlField008-30-31,'d')">
898 <genre authority="marc">drama</genre>
900 <xsl:if test="contains($controlField008-30-31,'e')">
901 <genre authority="marc">essay</genre>
903 <xsl:if test="contains($controlField008-30-31,'f')">
904 <genre authority="marc">fiction</genre>
906 <xsl:if test="contains($controlField008-30-31,'o')">
907 <genre authority="marc">folktale</genre>
909 <xsl:if test="contains($controlField008-30-31,'h')">
910 <genre authority="marc">history</genre>
912 <xsl:if test="contains($controlField008-30-31,'k')">
913 <genre authority="marc">humor, satire</genre>
915 <xsl:if test="contains($controlField008-30-31,'m')">
916 <genre authority="marc">memoir</genre>
918 <xsl:if test="contains($controlField008-30-31,'p')">
919 <genre authority="marc">poetry</genre>
921 <xsl:if test="contains($controlField008-30-31,'r')">
922 <genre authority="marc">rehearsal</genre>
924 <xsl:if test="contains($controlField008-30-31,'g')">
925 <genre authority="marc">reporting</genre>
927 <xsl:if test="contains($controlField008-30-31,'s')">
928 <genre authority="marc">sound</genre>
930 <xsl:if test="contains($controlField008-30-31,'l')">
931 <genre authority="marc">speech</genre>
934 <xsl:if test="$typeOf008='VM'">
935 <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"></xsl:variable>
937 <xsl:when test="$controlField008-33='a'">
938 <genre authority="marc">art original</genre>
940 <xsl:when test="$controlField008-33='b'">
941 <genre authority="marc">kit</genre>
943 <xsl:when test="$controlField008-33='c'">
944 <genre authority="marc">art reproduction</genre>
946 <xsl:when test="$controlField008-33='d'">
947 <genre authority="marc">diorama</genre>
949 <xsl:when test="$controlField008-33='f'">
950 <genre authority="marc">filmstrip</genre>
952 <xsl:when test="$controlField008-33='g'">
953 <genre authority="marc">legal article</genre>
955 <xsl:when test="$controlField008-33='i'">
956 <genre authority="marc">picture</genre>
958 <xsl:when test="$controlField008-33='k'">
959 <genre authority="marc">graphic</genre>
961 <xsl:when test="$controlField008-33='l'">
962 <genre authority="marc">technical drawing</genre>
964 <xsl:when test="$controlField008-33='m'">
965 <genre authority="marc">motion picture</genre>
967 <xsl:when test="$controlField008-33='n'">
968 <genre authority="marc">chart</genre>
970 <xsl:when test="$controlField008-33='o'">
971 <genre authority="marc">flash card</genre>
973 <xsl:when test="$controlField008-33='p'">
974 <genre authority="marc">microscope slide</genre>
976 <xsl:when test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
977 <genre authority="marc">model</genre>
979 <xsl:when test="$controlField008-33='r'">
980 <genre authority="marc">realia</genre>
982 <xsl:when test="$controlField008-33='s'">
983 <genre authority="marc">slide</genre>
985 <xsl:when test="$controlField008-33='t'">
986 <genre authority="marc">transparency</genre>
988 <xsl:when test="$controlField008-33='v'">
989 <genre authority="marc">videorecording</genre>
991 <xsl:when test="$controlField008-33='w'">
992 <genre authority="marc">toy</genre>
996 <xsl:for-each select="marc:datafield[@tag=655]">
997 <genre authority="marc">
998 <xsl:attribute name="authority">
999 <xsl:value-of select="marc:subfield[@code='2']"/>
1001 <xsl:call-template name="subfieldSelect">
1002 <xsl:with-param name="codes">abvxyz</xsl:with-param>
1003 <xsl:with-param name="delimeter">-</xsl:with-param>
1004 </xsl:call-template>
1008 <xsl:variable name="MARCpublicationCode" select="normalize-space(substring($controlField008,16,3))"></xsl:variable>
1009 <xsl:if test="translate($MARCpublicationCode,'|','')">
1012 <xsl:attribute name="type">code</xsl:attribute>
1013 <xsl:attribute name="authority">marccountry</xsl:attribute>
1014 <xsl:value-of select="$MARCpublicationCode"/>
1018 <xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
1021 <xsl:attribute name="type">code</xsl:attribute>
1022 <xsl:attribute name="authority">iso3166</xsl:attribute>
1023 <xsl:value-of select="."/>
1027 <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
1030 <xsl:attribute name="type">text</xsl:attribute>
1031 <xsl:call-template name="chopPunctuationFront">
1032 <xsl:with-param name="chopString">
1033 <xsl:call-template name="chopPunctuation">
1034 <xsl:with-param name="chopString" select="."/>
1035 </xsl:call-template>
1037 </xsl:call-template>
1041 <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='m']">
1042 <dateValid point="start">
1043 <xsl:value-of select="."/>
1046 <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='n']">
1047 <dateValid point="end">
1048 <xsl:value-of select="."/>
1051 <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='j']">
1053 <xsl:value-of select="."/>
1056 <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
1058 <xsl:when test="@code='b'">
1060 <xsl:call-template name="chopPunctuation">
1061 <xsl:with-param name="chopString" select="."/>
1062 <xsl:with-param name="punctuation">
1063 <xsl:text>:,;/ </xsl:text>
1065 </xsl:call-template>
1068 <xsl:when test="@code='c'">
1070 <xsl:call-template name="chopPunctuation">
1071 <xsl:with-param name="chopString" select="."/>
1072 </xsl:call-template>
1075 <xsl:when test="@code='g'">
1077 <xsl:value-of select="."/>
1082 <xsl:variable name="dataField260c">
1083 <xsl:call-template name="chopPunctuation">
1084 <xsl:with-param name="chopString" select="marc:datafield[@tag=260]/marc:subfield[@code='c']"></xsl:with-param>
1085 </xsl:call-template>
1087 <xsl:variable name="controlField008-7-10" select="normalize-space(substring($controlField008, 8, 4))"></xsl:variable>
1088 <xsl:variable name="controlField008-11-14" select="normalize-space(substring($controlField008, 12, 4))"></xsl:variable>
1089 <xsl:variable name="controlField008-6" select="normalize-space(substring($controlField008, 7, 1))"></xsl:variable>
1090 <xsl:if test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
1091 <xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
1092 <dateIssued encoding="marc">
1093 <xsl:value-of select="$controlField008-7-10"/>
1097 <xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
1098 <xsl:if test="$controlField008-7-10">
1099 <dateIssued encoding="marc" point="start">
1100 <xsl:value-of select="$controlField008-7-10"/>
1104 <xsl:if test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
1105 <xsl:if test="$controlField008-11-14">
1106 <dateIssued encoding="marc" point="end">
1107 <xsl:value-of select="$controlField008-11-14"/>
1111 <xsl:if test="$controlField008-6='q'">
1112 <xsl:if test="$controlField008-7-10">
1113 <dateIssued encoding="marc" point="start" qualifier="questionable">
1114 <xsl:value-of select="$controlField008-7-10"/>
1118 <xsl:if test="$controlField008-6='q'">
1119 <xsl:if test="$controlField008-11-14">
1120 <dateIssued encoding="marc" point="end" qualifier="questionable">
1121 <xsl:value-of select="$controlField008-11-14"/>
1125 <xsl:if test="$controlField008-6='t'">
1126 <xsl:if test="$controlField008-11-14">
1127 <copyrightDate encoding="marc">
1128 <xsl:value-of select="$controlField008-11-14"/>
1132 <xsl:for-each select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
1133 <dateCaptured encoding="iso8601">
1134 <xsl:value-of select="."/>
1137 <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
1138 <dateCaptured encoding="iso8601" point="start">
1139 <xsl:value-of select="."/>
1142 <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
1143 <dateCaptured encoding="iso8601" point="end">
1144 <xsl:value-of select="."/>
1147 <xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
1149 <xsl:value-of select="."/>
1152 <xsl:for-each select="marc:leader">
1155 <xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">monographic</xsl:when>
1156 <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">continuing</xsl:when>
1160 <xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
1162 <xsl:call-template name="subfieldSelect">
1163 <xsl:with-param name="codes">ab</xsl:with-param>
1164 </xsl:call-template>
1168 <xsl:variable name="controlField008-35-37" select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"></xsl:variable>
1169 <xsl:if test="$controlField008-35-37">
1171 <languageTerm authority="iso639-2b" type="code">
1172 <xsl:value-of select="substring($controlField008,36,3)"/>
1176 <xsl:for-each select="marc:datafield[@tag=041]">
1177 <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='d' or @code='e' or @code='f' or @code='g' or @code='h']">
1178 <xsl:variable name="langCodes" select="."/>
1180 <xsl:when test="../marc:subfield[@code='2']='rfc3066'">
1181 <!-- not stacked but could be repeated -->
1182 <xsl:call-template name="rfcLanguages">
1183 <xsl:with-param name="nodeNum">
1184 <xsl:value-of select="1"/>
1186 <xsl:with-param name="usedLanguages">
1187 <xsl:text></xsl:text>
1189 <xsl:with-param name="controlField008-35-37">
1190 <xsl:value-of select="$controlField008-35-37"></xsl:value-of>
1192 </xsl:call-template>
1196 <xsl:variable name="allLanguages">
1197 <xsl:copy-of select="$langCodes"></xsl:copy-of>
1199 <xsl:variable name="currentLanguage">
1200 <xsl:value-of select="substring($allLanguages,1,3)"></xsl:value-of>
1202 <xsl:call-template name="isoLanguage">
1203 <xsl:with-param name="currentLanguage">
1204 <xsl:value-of select="substring($allLanguages,1,3)"></xsl:value-of>
1206 <xsl:with-param name="remainingLanguages">
1207 <xsl:value-of select="substring($allLanguages,4,string-length($allLanguages)-3)"></xsl:value-of>
1209 <xsl:with-param name="usedLanguages">
1210 <xsl:if test="$controlField008-35-37">
1211 <xsl:value-of select="$controlField008-35-37"></xsl:value-of>
1214 </xsl:call-template>
1219 <xsl:variable name="physicalDescription">
1220 <!--3.2 change tmee 007/11 -->
1221 <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a']">
1222 <digitalOrigin>reformatted digital</digitalOrigin>
1224 <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='b']">
1225 <digitalOrigin>digitized microfilm</digitalOrigin>
1227 <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='d']">
1228 <digitalOrigin>digitized other analog</digitalOrigin>
1230 <xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"></xsl:variable>
1231 <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"></xsl:variable>
1232 <xsl:variable name="check008-23">
1233 <xsl:if test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
1234 <xsl:value-of select="true()"></xsl:value-of>
1237 <xsl:variable name="check008-29">
1238 <xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
1239 <xsl:value-of select="true()"></xsl:value-of>
1243 <xsl:when test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
1244 <form authority="marcform">braille</form>
1246 <xsl:when test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
1247 <form authority="marcform">print</form>
1249 <xsl:when test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
1250 <form authority="marcform">electronic</form>
1252 <xsl:when test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
1253 <form authority="marcform">microfiche</form>
1255 <xsl:when test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
1256 <form authority="marcform">microfilm</form>
1260 <xsl:if test="marc:datafield[@tag=130]/marc:subfield[@code='h']">
1261 <form authority="gmd">
1262 <xsl:call-template name="chopBrackets">
1263 <xsl:with-param name="chopString">
1264 <xsl:value-of select="marc:datafield[@tag=130]/marc:subfield[@code='h']"></xsl:value-of>
1266 </xsl:call-template>
1269 <xsl:if test="marc:datafield[@tag=240]/marc:subfield[@code='h']">
1270 <form authority="gmd">
1271 <xsl:call-template name="chopBrackets">
1272 <xsl:with-param name="chopString">
1273 <xsl:value-of select="marc:datafield[@tag=240]/marc:subfield[@code='h']"></xsl:value-of>
1275 </xsl:call-template>
1278 <xsl:if test="marc:datafield[@tag=242]/marc:subfield[@code='h']">
1279 <form authority="gmd">
1280 <xsl:call-template name="chopBrackets">
1281 <xsl:with-param name="chopString">
1282 <xsl:value-of select="marc:datafield[@tag=242]/marc:subfield[@code='h']"></xsl:value-of>
1284 </xsl:call-template>
1287 <xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='h']">
1288 <form authority="gmd">
1289 <xsl:call-template name="chopBrackets">
1290 <xsl:with-param name="chopString">
1291 <xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='h']"></xsl:value-of>
1293 </xsl:call-template>
1296 <xsl:if test="marc:datafield[@tag=246]/marc:subfield[@code='h']">
1297 <form authority="gmd">
1298 <xsl:call-template name="chopBrackets">
1299 <xsl:with-param name="chopString">
1300 <xsl:value-of select="marc:datafield[@tag=246]/marc:subfield[@code='h']"></xsl:value-of>
1302 </xsl:call-template>
1305 <xsl:if test="marc:datafield[@tag=730]/marc:subfield[@code='h']">
1306 <form authority="gmd">
1307 <xsl:call-template name="chopBrackets">
1308 <xsl:with-param name="chopString">
1309 <xsl:value-of select="marc:datafield[@tag=730]/marc:subfield[@code='h']"></xsl:value-of>
1311 </xsl:call-template>
1314 <xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
1316 <xsl:value-of select="."></xsl:value-of>
1319 <xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
1321 <xsl:when test="substring(text(),14,1)='a'">
1322 <reformattingQuality>access</reformattingQuality>
1324 <xsl:when test="substring(text(),14,1)='p'">
1325 <reformattingQuality>preservation</reformattingQuality>
1327 <xsl:when test="substring(text(),14,1)='r'">
1328 <reformattingQuality>replacement</reformattingQuality>
1332 <!--3.2 change tmee 007/01 -->
1333 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='b']">
1334 <form authority="smd">chip cartridge</form>
1336 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='c']">
1337 <form authority="smd">computer optical disc cartridge</form>
1339 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='j']">
1340 <form authority="smd">magnetic disc</form>
1342 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='m']">
1343 <form authority="smd">magneto-optical disc</form>
1345 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='o']">
1346 <form authority="smd">optical disc</form>
1348 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='r']">
1349 <form authority="smd">remote</form>
1351 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='a']">
1352 <form authority="smd">tape cartridge</form>
1354 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='f']">
1355 <form authority="smd">tape cassette</form>
1357 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='h']">
1358 <form authority="smd">tape reel</form>
1361 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='a']">
1362 <form authority="smd">celestial globe</form>
1364 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='e']">
1365 <form authority="smd">earth moon globe</form>
1367 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='b']">
1368 <form authority="smd">planetary or lunar globe</form>
1370 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='c']">
1371 <form authority="smd">terrestrial globe</form>
1374 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='o'][substring(text(),2,1)='o']">
1375 <form authority="smd">kit</form>
1378 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
1379 <form authority="smd">atlas</form>
1381 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='g']">
1382 <form authority="smd">diagram</form>
1384 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
1385 <form authority="smd">map</form>
1387 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
1388 <form authority="smd">model</form>
1390 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='k']">
1391 <form authority="smd">profile</form>
1393 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
1394 <form authority="smd">remote-sensing image</form>
1396 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='s']">
1397 <form authority="smd">section</form>
1399 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='y']">
1400 <form authority="smd">view</form>
1403 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='a']">
1404 <form authority="smd">aperture card</form>
1406 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='e']">
1407 <form authority="smd">microfiche</form>
1409 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='f']">
1410 <form authority="smd">microfiche cassette</form>
1412 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='b']">
1413 <form authority="smd">microfilm cartridge</form>
1415 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='c']">
1416 <form authority="smd">microfilm cassette</form>
1418 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='d']">
1419 <form authority="smd">microfilm reel</form>
1421 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='g']">
1422 <form authority="smd">microopaque</form>
1425 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='c']">
1426 <form authority="smd">film cartridge</form>
1428 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='f']">
1429 <form authority="smd">film cassette</form>
1431 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='r']">
1432 <form authority="smd">film reel</form>
1435 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='n']">
1436 <form authority="smd">chart</form>
1438 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='c']">
1439 <form authority="smd">collage</form>
1441 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='d']">
1442 <form authority="smd">drawing</form>
1444 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='o']">
1445 <form authority="smd">flash card</form>
1447 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='e']">
1448 <form authority="smd">painting</form>
1450 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='f']">
1451 <form authority="smd">photomechanical print</form>
1453 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='g']">
1454 <form authority="smd">photonegative</form>
1456 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='h']">
1457 <form authority="smd">photoprint</form>
1459 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='i']">
1460 <form authority="smd">picture</form>
1462 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='j']">
1463 <form authority="smd">print</form>
1465 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='l']">
1466 <form authority="smd">technical drawing</form>
1469 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='q'][substring(text(),2,1)='q']">
1470 <form authority="smd">notated music</form>
1473 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='d']">
1474 <form authority="smd">filmslip</form>
1476 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='c']">
1477 <form authority="smd">filmstrip cartridge</form>
1479 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='o']">
1480 <form authority="smd">filmstrip roll</form>
1482 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='f']">
1483 <form authority="smd">other filmstrip type</form>
1485 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='s']">
1486 <form authority="smd">slide</form>
1488 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='t']">
1489 <form authority="smd">transparency</form>
1491 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='r'][substring(text(),2,1)='r']">
1492 <form authority="smd">remote-sensing image</form>
1494 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='e']">
1495 <form authority="smd">cylinder</form>
1497 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='q']">
1498 <form authority="smd">roll</form>
1500 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='g']">
1501 <form authority="smd">sound cartridge</form>
1503 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='s']">
1504 <form authority="smd">sound cassette</form>
1506 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='d']">
1507 <form authority="smd">sound disc</form>
1509 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='t']">
1510 <form authority="smd">sound-tape reel</form>
1512 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='i']">
1513 <form authority="smd">sound-track film</form>
1515 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='w']">
1516 <form authority="smd">wire recording</form>
1519 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='c']">
1520 <form authority="smd">braille</form>
1522 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='b']">
1523 <form authority="smd">combination</form>
1525 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='a']">
1526 <form authority="smd">moon</form>
1528 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='d']">
1529 <form authority="smd">tactile, with no writing system</form>
1532 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='c']">
1533 <form authority="smd">braille</form>
1535 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='b']">
1536 <form authority="smd">large print</form>
1538 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='a']">
1539 <form authority="smd">regular print</form>
1541 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='d']">
1542 <form authority="smd">text in looseleaf binder</form>
1545 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='c']">
1546 <form authority="smd">videocartridge</form>
1548 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='f']">
1549 <form authority="smd">videocassette</form>
1551 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='d']">
1552 <form authority="smd">videodisc</form>
1554 <xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='r']">
1555 <form authority="smd">videoreel</form>
1558 <xsl:for-each select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)>1]">
1560 <xsl:value-of select="."></xsl:value-of>
1561 </internetMediaType>
1563 <xsl:for-each select="marc:datafield[@tag=300]">
1565 <xsl:call-template name="subfieldSelect">
1566 <xsl:with-param name="codes">abce</xsl:with-param>
1567 </xsl:call-template>
1571 <xsl:if test="string-length(normalize-space($physicalDescription))">
1572 <physicalDescription>
1573 <xsl:copy-of select="$physicalDescription"></xsl:copy-of>
1574 </physicalDescription>
1576 <xsl:for-each select="marc:datafield[@tag=520]">
1578 <xsl:call-template name="uri"></xsl:call-template>
1579 <xsl:call-template name="subfieldSelect">
1580 <xsl:with-param name="codes">ab</xsl:with-param>
1581 </xsl:call-template>
1584 <xsl:for-each select="marc:datafield[@tag=505]">
1586 <xsl:call-template name="uri"></xsl:call-template>
1587 <xsl:call-template name="subfieldSelect">
1588 <xsl:with-param name="codes">agrt</xsl:with-param>
1589 </xsl:call-template>
1592 <xsl:for-each select="marc:datafield[@tag=521]">
1594 <xsl:call-template name="subfieldSelect">
1595 <xsl:with-param name="codes">ab</xsl:with-param>
1596 </xsl:call-template>
1599 <xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
1600 <xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"></xsl:variable>
1603 <xsl:when test="$controlField008-22='d'">
1604 <targetAudience authority="marctarget">adolescent</targetAudience>
1606 <xsl:when test="$controlField008-22='e'">
1607 <targetAudience authority="marctarget">adult</targetAudience>
1609 <xsl:when test="$controlField008-22='g'">
1610 <targetAudience authority="marctarget">general</targetAudience>
1612 <xsl:when test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
1613 <targetAudience authority="marctarget">juvenile</targetAudience>
1615 <xsl:when test="$controlField008-22='a'">
1616 <targetAudience authority="marctarget">preschool</targetAudience>
1618 <xsl:when test="$controlField008-22='f'">
1619 <targetAudience authority="marctarget">specialized</targetAudience>
1623 <xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
1624 <note type="statement of responsibility">
1625 <xsl:value-of select="."></xsl:value-of>
1628 <xsl:for-each select="marc:datafield[@tag=500]">
1630 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
1631 <xsl:call-template name="uri"></xsl:call-template>
1635 <!--3.2 change tmee additional note fields-->
1637 <xsl:for-each select="marc:datafield[@tag=506]">
1638 <note type="restrictions">
1639 <xsl:call-template name="uri"></xsl:call-template>
1640 <xsl:variable name="str">
1641 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
1642 <xsl:value-of select="."></xsl:value-of>
1643 <xsl:text> </xsl:text>
1646 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
1650 <xsl:for-each select="marc:datafield[@tag=510]">
1651 <note type="citation/reference">
1652 <xsl:call-template name="uri"></xsl:call-template>
1653 <xsl:variable name="str">
1654 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
1655 <xsl:value-of select="."></xsl:value-of>
1656 <xsl:text> </xsl:text>
1659 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
1664 <xsl:for-each select="marc:datafield[@tag=511]">
1665 <note type="performers">
1666 <xsl:call-template name="uri"></xsl:call-template>
1667 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
1670 <xsl:for-each select="marc:datafield[@tag=518]">
1672 <xsl:call-template name="uri"></xsl:call-template>
1673 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
1677 <xsl:for-each select="marc:datafield[@tag=530]">
1678 <note type="additional physical form">
1679 <xsl:call-template name="uri"></xsl:call-template>
1680 <xsl:variable name="str">
1681 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
1682 <xsl:value-of select="."></xsl:value-of>
1683 <xsl:text> </xsl:text>
1686 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
1690 <xsl:for-each select="marc:datafield[@tag=533]">
1691 <note type="reproduction">
1692 <xsl:call-template name="uri"></xsl:call-template>
1693 <xsl:variable name="str">
1694 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
1695 <xsl:value-of select="."></xsl:value-of>
1696 <xsl:text> </xsl:text>
1699 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
1703 <xsl:for-each select="marc:datafield[@tag=534]">
1704 <note type="original version">
1705 <xsl:call-template name="uri"></xsl:call-template>
1706 <xsl:variable name="str">
1707 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
1708 <xsl:value-of select="."></xsl:value-of>
1709 <xsl:text> </xsl:text>
1712 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
1716 <xsl:for-each select="marc:datafield[@tag=538]">
1717 <note type="system details">
1718 <xsl:call-template name="uri"></xsl:call-template>
1719 <xsl:variable name="str">
1720 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
1721 <xsl:value-of select="."></xsl:value-of>
1722 <xsl:text> </xsl:text>
1725 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
1729 <xsl:for-each select="marc:datafield[@tag=583]">
1730 <note type="action">
1731 <xsl:call-template name="uri"></xsl:call-template>
1732 <xsl:variable name="str">
1733 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
1734 <xsl:value-of select="."></xsl:value-of>
1735 <xsl:text> </xsl:text>
1738 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
1746 <xsl:for-each select="marc:datafield[@tag=501 or @tag=502 or @tag=504 or @tag=507 or @tag=508 or @tag=513 or @tag=514 or @tag=515 or @tag=516 or @tag=522 or @tag=524 or @tag=525 or @tag=526 or @tag=535 or @tag=536 or @tag=540 or @tag=541 or @tag=544 or @tag=545 or @tag=546 or @tag=547 or @tag=550 or @tag=552 or @tag=555 or @tag=556 or @tag=561 or @tag=562 or @tag=565 or @tag=567 or @tag=580 or @tag=581 or @tag=584 or @tag=585 or @tag=586]">
1748 <xsl:call-template name="uri"></xsl:call-template>
1749 <xsl:variable name="str">
1750 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
1751 <xsl:value-of select="."></xsl:value-of>
1752 <xsl:text> </xsl:text>
1755 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
1758 <xsl:for-each select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
1762 <xsl:call-template name="subfieldSelect">
1763 <xsl:with-param name="codes">defg</xsl:with-param>
1764 </xsl:call-template>
1769 <xsl:for-each select="marc:datafield[@tag=043]">
1771 <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
1773 <xsl:attribute name="authority">
1774 <xsl:if test="@code='a'">
1775 <xsl:text>marcgac</xsl:text>
1777 <xsl:if test="@code='b'">
1778 <xsl:value-of select="following-sibling::marc:subfield[@code=2]"></xsl:value-of>
1780 <xsl:if test="@code='c'">
1781 <xsl:text>iso3166</xsl:text>
1784 <xsl:value-of select="self::marc:subfield"></xsl:value-of>
1789 <!-- tmee 2006/11/27 -->
1790 <xsl:for-each select="marc:datafield[@tag=255]">
1792 <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
1794 <xsl:if test="@code='a'">
1796 <xsl:value-of select="."></xsl:value-of>
1799 <xsl:if test="@code='b'">
1801 <xsl:value-of select="."></xsl:value-of>
1804 <xsl:if test="@code='c'">
1806 <xsl:value-of select="."></xsl:value-of>
1814 <xsl:apply-templates select="marc:datafield[653 >= @tag and @tag >= 600]"></xsl:apply-templates>
1815 <xsl:apply-templates select="marc:datafield[@tag=656]"></xsl:apply-templates>
1816 <xsl:for-each select="marc:datafield[@tag=752]">
1818 <hierarchicalGeographic>
1819 <xsl:for-each select="marc:subfield[@code='a']">
1821 <xsl:call-template name="chopPunctuation">
1822 <xsl:with-param name="chopString" select="."></xsl:with-param>
1823 </xsl:call-template>
1826 <xsl:for-each select="marc:subfield[@code='b']">
1828 <xsl:call-template name="chopPunctuation">
1829 <xsl:with-param name="chopString" select="."></xsl:with-param>
1830 </xsl:call-template>
1833 <xsl:for-each select="marc:subfield[@code='c']">
1835 <xsl:call-template name="chopPunctuation">
1836 <xsl:with-param name="chopString" select="."></xsl:with-param>
1837 </xsl:call-template>
1840 <xsl:for-each select="marc:subfield[@code='d']">
1842 <xsl:call-template name="chopPunctuation">
1843 <xsl:with-param name="chopString" select="."></xsl:with-param>
1844 </xsl:call-template>
1847 </hierarchicalGeographic>
1850 <xsl:for-each select="marc:datafield[@tag=045][marc:subfield[@code='b']]">
1853 <xsl:when test="@ind1=2">
1854 <temporal encoding="iso8601" point="start">
1855 <xsl:call-template name="chopPunctuation">
1856 <xsl:with-param name="chopString">
1857 <xsl:value-of select="marc:subfield[@code='b'][1]"></xsl:value-of>
1859 </xsl:call-template>
1861 <temporal encoding="iso8601" point="end">
1862 <xsl:call-template name="chopPunctuation">
1863 <xsl:with-param name="chopString">
1864 <xsl:value-of select="marc:subfield[@code='b'][2]"></xsl:value-of>
1866 </xsl:call-template>
1870 <xsl:for-each select="marc:subfield[@code='b']">
1871 <temporal encoding="iso8601">
1872 <xsl:call-template name="chopPunctuation">
1873 <xsl:with-param name="chopString" select="."></xsl:with-param>
1874 </xsl:call-template>
1881 <xsl:for-each select="marc:datafield[@tag=050]">
1882 <xsl:for-each select="marc:subfield[@code='b']">
1883 <classification authority="lcc">
1884 <xsl:if test="../marc:subfield[@code='3']">
1885 <xsl:attribute name="displayLabel">
1886 <xsl:value-of select="../marc:subfield[@code='3']"></xsl:value-of>
1889 <xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"></xsl:value-of>
1890 <xsl:text> </xsl:text>
1891 <xsl:value-of select="text()"></xsl:value-of>
1894 <xsl:for-each select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
1895 <classification authority="lcc">
1896 <xsl:if test="../marc:subfield[@code='3']">
1897 <xsl:attribute name="displayLabel">
1898 <xsl:value-of select="../marc:subfield[@code='3']"></xsl:value-of>
1901 <xsl:value-of select="text()"></xsl:value-of>
1905 <xsl:for-each select="marc:datafield[@tag=082]">
1906 <classification authority="ddc">
1907 <xsl:if test="marc:subfield[@code='2']">
1908 <xsl:attribute name="edition">
1909 <xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
1912 <xsl:call-template name="subfieldSelect">
1913 <xsl:with-param name="codes">ab</xsl:with-param>
1914 </xsl:call-template>
1917 <xsl:for-each select="marc:datafield[@tag=080]">
1918 <classification authority="udc">
1919 <xsl:call-template name="subfieldSelect">
1920 <xsl:with-param name="codes">abx</xsl:with-param>
1921 </xsl:call-template>
1924 <xsl:for-each select="marc:datafield[@tag=060]">
1925 <classification authority="nlm">
1926 <xsl:call-template name="subfieldSelect">
1927 <xsl:with-param name="codes">ab</xsl:with-param>
1928 </xsl:call-template>
1931 <xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
1932 <classification authority="sudocs">
1933 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
1936 <xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
1937 <classification authority="candoc">
1938 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
1941 <xsl:for-each select="marc:datafield[@tag=086]">
1943 <xsl:attribute name="authority">
1944 <xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
1946 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
1949 <xsl:for-each select="marc:datafield[@tag=084]">
1951 <xsl:attribute name="authority">
1952 <xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
1954 <xsl:call-template name="subfieldSelect">
1955 <xsl:with-param name="codes">ab</xsl:with-param>
1956 </xsl:call-template>
1959 <xsl:for-each select="marc:datafield[@tag=440]">
1960 <relatedItem type="series">
1961 <xsl:variable name="titleChop">
1962 <xsl:call-template name="chopPunctuation">
1963 <xsl:with-param name="chopString">
1964 <xsl:call-template name="subfieldSelect">
1965 <xsl:with-param name="codes">av</xsl:with-param>
1966 </xsl:call-template>
1968 </xsl:call-template>
1972 <xsl:value-of select="$titleChop" />
1974 <xsl:call-template name="part"></xsl:call-template>
1976 <titleInfo type="nfi">
1978 <xsl:when test="@ind2>0">
1980 <xsl:value-of select="substring($titleChop,1,@ind2)"/>
1983 <xsl:value-of select="substring($titleChop,@ind2+1)"/>
1985 <xsl:call-template name="part"/>
1989 <xsl:value-of select="$titleChop" />
1993 <xsl:call-template name="part"></xsl:call-template>
1997 <xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
1998 <relatedItem type="series">
2001 <xsl:call-template name="chopPunctuation">
2002 <xsl:with-param name="chopString">
2003 <xsl:call-template name="subfieldSelect">
2004 <xsl:with-param name="codes">av</xsl:with-param>
2005 </xsl:call-template>
2007 </xsl:call-template>
2009 <xsl:call-template name="part"></xsl:call-template>
2013 <xsl:for-each select="marc:datafield[@tag=510]">
2014 <relatedItem type="isReferencedBy">
2016 <xsl:call-template name="subfieldSelect">
2017 <xsl:with-param name="codes">abcx3</xsl:with-param>
2018 </xsl:call-template>
2022 <xsl:for-each select="marc:datafield[@tag=534]">
2023 <relatedItem type="original">
2024 <xsl:call-template name="relatedTitle"></xsl:call-template>
2025 <xsl:call-template name="relatedName"></xsl:call-template>
2026 <xsl:if test="marc:subfield[@code='b' or @code='c']">
2028 <xsl:for-each select="marc:subfield[@code='c']">
2030 <xsl:value-of select="."></xsl:value-of>
2033 <xsl:for-each select="marc:subfield[@code='b']">
2035 <xsl:value-of select="."></xsl:value-of>
2040 <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
2041 <xsl:for-each select="marc:subfield[@code='z']">
2042 <identifier type="isbn">
2043 <xsl:value-of select="."></xsl:value-of>
2046 <xsl:call-template name="relatedNote"></xsl:call-template>
2049 <xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
2051 <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
2054 <xsl:call-template name="chopPunctuation">
2055 <xsl:with-param name="chopString">
2056 <xsl:call-template name="specialSubfieldSelect">
2057 <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
2058 <xsl:with-param name="axis">t</xsl:with-param>
2059 <xsl:with-param name="afterCodes">g</xsl:with-param>
2060 </xsl:call-template>
2062 </xsl:call-template>
2064 <xsl:call-template name="part"></xsl:call-template>
2066 <name type="personal">
2068 <xsl:call-template name="specialSubfieldSelect">
2069 <xsl:with-param name="anyCodes">aq</xsl:with-param>
2070 <xsl:with-param name="axis">t</xsl:with-param>
2071 <xsl:with-param name="beforeCodes">g</xsl:with-param>
2072 </xsl:call-template>
2074 <xsl:call-template name="termsOfAddress"></xsl:call-template>
2075 <xsl:call-template name="nameDate"></xsl:call-template>
2076 <xsl:call-template name="role"></xsl:call-template>
2078 <xsl:call-template name="relatedForm"></xsl:call-template>
2079 <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
2082 <xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
2084 <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
2087 <xsl:call-template name="chopPunctuation">
2088 <xsl:with-param name="chopString">
2089 <xsl:call-template name="specialSubfieldSelect">
2090 <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
2091 <xsl:with-param name="axis">t</xsl:with-param>
2092 <xsl:with-param name="afterCodes">dg</xsl:with-param>
2093 </xsl:call-template>
2095 </xsl:call-template>
2097 <xsl:call-template name="relatedPartNumName"></xsl:call-template>
2099 <name type="corporate">
2100 <xsl:for-each select="marc:subfield[@code='a']">
2102 <xsl:value-of select="."></xsl:value-of>
2105 <xsl:for-each select="marc:subfield[@code='b']">
2107 <xsl:value-of select="."></xsl:value-of>
2110 <xsl:variable name="tempNamePart">
2111 <xsl:call-template name="specialSubfieldSelect">
2112 <xsl:with-param name="anyCodes">c</xsl:with-param>
2113 <xsl:with-param name="axis">t</xsl:with-param>
2114 <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
2115 </xsl:call-template>
2117 <xsl:if test="normalize-space($tempNamePart)">
2119 <xsl:value-of select="$tempNamePart"></xsl:value-of>
2122 <xsl:call-template name="role"></xsl:call-template>
2124 <xsl:call-template name="relatedForm"></xsl:call-template>
2125 <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
2128 <xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
2130 <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
2133 <xsl:call-template name="chopPunctuation">
2134 <xsl:with-param name="chopString">
2135 <xsl:call-template name="specialSubfieldSelect">
2136 <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
2137 <xsl:with-param name="axis">t</xsl:with-param>
2138 <xsl:with-param name="afterCodes">g</xsl:with-param>
2139 </xsl:call-template>
2141 </xsl:call-template>
2143 <xsl:call-template name="relatedPartNumName"></xsl:call-template>
2145 <name type="conference">
2147 <xsl:call-template name="specialSubfieldSelect">
2148 <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
2149 <xsl:with-param name="axis">t</xsl:with-param>
2150 <xsl:with-param name="beforeCodes">gn</xsl:with-param>
2151 </xsl:call-template>
2154 <xsl:call-template name="relatedForm"></xsl:call-template>
2155 <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
2158 <xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
2160 <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
2163 <xsl:call-template name="chopPunctuation">
2164 <xsl:with-param name="chopString">
2165 <xsl:call-template name="subfieldSelect">
2166 <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
2167 </xsl:call-template>
2169 </xsl:call-template>
2171 <xsl:call-template name="part"></xsl:call-template>
2173 <xsl:call-template name="relatedForm"></xsl:call-template>
2174 <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
2177 <xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
2179 <xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
2180 <xsl:variable name="titleChop">
2181 <xsl:call-template name="chopPunctuation">
2182 <xsl:with-param name="chopString">
2183 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
2185 </xsl:call-template>
2189 <xsl:value-of select="$titleChop" />
2191 <xsl:call-template name="part"></xsl:call-template>
2193 <titleInfo type="nfi">
2195 <xsl:when test="@ind1>0">
2197 <xsl:value-of select="substring($titleChop,1,@ind1)"/>
2200 <xsl:value-of select="substring($titleChop,@ind1+1)"/>
2205 <xsl:value-of select="$titleChop" />
2209 <xsl:call-template name="part"></xsl:call-template>
2211 <xsl:call-template name="relatedForm"></xsl:call-template>
2214 <xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
2215 <relatedItem type="series">
2216 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2219 <xsl:for-each select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
2221 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2224 <xsl:for-each select="marc:datafield[@tag=775]">
2225 <relatedItem type="otherVersion">
2226 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2229 <xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
2230 <relatedItem type="constituent">
2231 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2234 <xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
2235 <relatedItem type="host">
2236 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2239 <xsl:for-each select="marc:datafield[@tag=776]">
2240 <relatedItem type="otherFormat">
2241 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2244 <xsl:for-each select="marc:datafield[@tag=780]">
2245 <relatedItem type="preceding">
2246 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2249 <xsl:for-each select="marc:datafield[@tag=785]">
2250 <relatedItem type="succeeding">
2251 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2254 <xsl:for-each select="marc:datafield[@tag=786]">
2255 <relatedItem type="original">
2256 <xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
2259 <xsl:for-each select="marc:datafield[@tag=800]">
2260 <relatedItem type="series">
2263 <xsl:call-template name="chopPunctuation">
2264 <xsl:with-param name="chopString">
2265 <xsl:call-template name="specialSubfieldSelect">
2266 <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
2267 <xsl:with-param name="axis">t</xsl:with-param>
2268 <xsl:with-param name="afterCodes">g</xsl:with-param>
2269 </xsl:call-template>
2271 </xsl:call-template>
2273 <xsl:call-template name="part"></xsl:call-template>
2275 <name type="personal">
2277 <xsl:call-template name="chopPunctuation">
2278 <xsl:with-param name="chopString">
2279 <xsl:call-template name="specialSubfieldSelect">
2280 <xsl:with-param name="anyCodes">aq</xsl:with-param>
2281 <xsl:with-param name="axis">t</xsl:with-param>
2282 <xsl:with-param name="beforeCodes">g</xsl:with-param>
2283 </xsl:call-template>
2285 </xsl:call-template>
2287 <xsl:call-template name="termsOfAddress"></xsl:call-template>
2288 <xsl:call-template name="nameDate"></xsl:call-template>
2289 <xsl:call-template name="role"></xsl:call-template>
2291 <xsl:call-template name="relatedForm"></xsl:call-template>
2294 <xsl:for-each select="marc:datafield[@tag=810]">
2295 <relatedItem type="series">
2298 <xsl:call-template name="chopPunctuation">
2299 <xsl:with-param name="chopString">
2300 <xsl:call-template name="specialSubfieldSelect">
2301 <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
2302 <xsl:with-param name="axis">t</xsl:with-param>
2303 <xsl:with-param name="afterCodes">dg</xsl:with-param>
2304 </xsl:call-template>
2306 </xsl:call-template>
2308 <xsl:call-template name="relatedPartNumName"></xsl:call-template>
2310 <name type="corporate">
2311 <xsl:for-each select="marc:subfield[@code='a']">
2313 <xsl:value-of select="."></xsl:value-of>
2316 <xsl:for-each select="marc:subfield[@code='b']">
2318 <xsl:value-of select="."></xsl:value-of>
2322 <xsl:call-template name="specialSubfieldSelect">
2323 <xsl:with-param name="anyCodes">c</xsl:with-param>
2324 <xsl:with-param name="axis">t</xsl:with-param>
2325 <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
2326 </xsl:call-template>
2328 <xsl:call-template name="role"></xsl:call-template>
2330 <xsl:call-template name="relatedForm"></xsl:call-template>
2333 <xsl:for-each select="marc:datafield[@tag=811]">
2334 <relatedItem type="series">
2337 <xsl:call-template name="chopPunctuation">
2338 <xsl:with-param name="chopString">
2339 <xsl:call-template name="specialSubfieldSelect">
2340 <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
2341 <xsl:with-param name="axis">t</xsl:with-param>
2342 <xsl:with-param name="afterCodes">g</xsl:with-param>
2343 </xsl:call-template>
2345 </xsl:call-template>
2347 <xsl:call-template name="relatedPartNumName"/>
2349 <name type="conference">
2351 <xsl:call-template name="specialSubfieldSelect">
2352 <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
2353 <xsl:with-param name="axis">t</xsl:with-param>
2354 <xsl:with-param name="beforeCodes">gn</xsl:with-param>
2355 </xsl:call-template>
2357 <xsl:call-template name="role"/>
2359 <xsl:call-template name="relatedForm"/>
2362 <xsl:for-each select="marc:datafield[@tag='830']">
2363 <relatedItem type="series">
2364 <xsl:variable name="titleChop">
2365 <xsl:call-template name="chopPunctuation">
2366 <xsl:with-param name="chopString">
2367 <xsl:call-template name="subfieldSelect">
2368 <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
2369 </xsl:call-template>
2371 </xsl:call-template>
2375 <xsl:value-of select="$titleChop" />
2377 <xsl:call-template name="part"/>
2379 <titleInfo type="nfi">
2381 <xsl:when test="@ind2>0">
2383 <xsl:value-of select="substring($titleChop,1,@ind2)"/>
2386 <xsl:value-of select="substring($titleChop,@ind2+1)"/>
2391 <xsl:value-of select="$titleChop" />
2395 <xsl:call-template name="part"/>
2397 <xsl:call-template name="relatedForm"/>
2400 <xsl:for-each select="marc:datafield[@tag='856'][@ind2='2']/marc:subfield[@code='q']">
2403 <xsl:value-of select="."/>
2404 </internetMediaType>
2407 <xsl:for-each select="marc:datafield[@tag='020']">
2408 <xsl:call-template name="isInvalid">
2409 <xsl:with-param name="type">isbn</xsl:with-param>
2410 </xsl:call-template>
2411 <xsl:if test="marc:subfield[@code='a']">
2412 <identifier type="isbn">
2413 <xsl:value-of select="marc:subfield[@code='a']"/>
2417 <xsl:for-each select="marc:datafield[@tag='024'][@ind1='0']">
2418 <xsl:call-template name="isInvalid">
2419 <xsl:with-param name="type">isrc</xsl:with-param>
2420 </xsl:call-template>
2421 <xsl:if test="marc:subfield[@code='a']">
2422 <identifier type="isrc">
2423 <xsl:value-of select="marc:subfield[@code='a']"/>
2427 <xsl:for-each select="marc:datafield[@tag='024'][@ind1='2']">
2428 <xsl:call-template name="isInvalid">
2429 <xsl:with-param name="type">ismn</xsl:with-param>
2430 </xsl:call-template>
2431 <xsl:if test="marc:subfield[@code='a']">
2432 <identifier type="ismn">
2433 <xsl:value-of select="marc:subfield[@code='a']"/>
2437 <xsl:for-each select="marc:datafield[@tag='024'][@ind1='4']">
2438 <xsl:call-template name="isInvalid">
2439 <xsl:with-param name="type">sici</xsl:with-param>
2440 </xsl:call-template>
2441 <identifier type="sici">
2442 <xsl:call-template name="subfieldSelect">
2443 <xsl:with-param name="codes">ab</xsl:with-param>
2444 </xsl:call-template>
2447 <xsl:for-each select="marc:datafield[@tag='022']">
2448 <xsl:call-template name="isInvalid">
2449 <xsl:with-param name="type">issn</xsl:with-param>
2450 </xsl:call-template>
2451 <identifier type="issn">
2452 <xsl:value-of select="marc:subfield[@code='a']"/>
2455 <xsl:for-each select="marc:datafield[@tag='010']">
2456 <xsl:call-template name="isInvalid">
2457 <xsl:with-param name="type">lccn</xsl:with-param>
2458 </xsl:call-template>
2459 <identifier type="lccn">
2460 <xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
2463 <xsl:for-each select="marc:datafield[@tag='028']">
2465 <xsl:attribute name="type">
2467 <xsl:when test="@ind1='0'">issue number</xsl:when>
2468 <xsl:when test="@ind1='1'">matrix number</xsl:when>
2469 <xsl:when test="@ind1='2'">music plate</xsl:when>
2470 <xsl:when test="@ind1='3'">music publisher</xsl:when>
2471 <xsl:when test="@ind1='4'">videorecording identifier</xsl:when>
2474 <!--<xsl:call-template name="isInvalid"/>--> <!-- no $z in 028 -->
2475 <xsl:call-template name="subfieldSelect">
2476 <xsl:with-param name="codes">
2478 <xsl:when test="@ind1='0'">ba</xsl:when>
2479 <xsl:otherwise>ab</xsl:otherwise>
2482 </xsl:call-template>
2485 <xsl:for-each select="marc:datafield[@tag='037']">
2486 <identifier type="stock number">
2487 <!--<xsl:call-template name="isInvalid"/>--> <!-- no $z in 037 -->
2488 <xsl:call-template name="subfieldSelect">
2489 <xsl:with-param name="codes">ab</xsl:with-param>
2490 </xsl:call-template>
2493 <xsl:for-each select="marc:datafield[@tag='856'][marc:subfield[@code='u']]">
2495 <xsl:attribute name="type">
2497 <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi')">doi</xsl:when>
2498 <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov')">hdl</xsl:when>
2499 <xsl:otherwise>uri</xsl:otherwise>
2503 <xsl:when test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov') ">
2504 <xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"></xsl:value-of>
2507 <xsl:value-of select="marc:subfield[@code='u']"></xsl:value-of>
2511 <xsl:if test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl')">
2512 <identifier type="hdl">
2513 <xsl:if test="marc:subfield[@code='y' or @code='3' or @code='z']">
2514 <xsl:attribute name="displayLabel">
2515 <xsl:call-template name="subfieldSelect">
2516 <xsl:with-param name="codes">y3z</xsl:with-param>
2517 </xsl:call-template>
2520 <xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"></xsl:value-of>
2524 <xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
2525 <identifier type="upc">
2526 <xsl:call-template name="isInvalid"/>
2527 <xsl:value-of select="marc:subfield[@code='a']"/>
2530 <!-- 1/04 fix added $y -->
2531 <xsl:for-each select="marc:datafield[@tag=856][marc:subfield[@code='u']]">
2534 <xsl:if test="marc:subfield[@code='y' or @code='3']">
2535 <xsl:attribute name="displayLabel">
2536 <xsl:call-template name="subfieldSelect">
2537 <xsl:with-param name="codes">y3</xsl:with-param>
2538 </xsl:call-template>
2541 <xsl:if test="marc:subfield[@code='z' ]">
2542 <xsl:attribute name="note">
2543 <xsl:call-template name="subfieldSelect">
2544 <xsl:with-param name="codes">z</xsl:with-param>
2545 </xsl:call-template>
2548 <xsl:value-of select="marc:subfield[@code='u']"></xsl:value-of>
2554 <!-- 3.2 change tmee 856z -->
2557 <xsl:for-each select="marc:datafield[@tag=852]">
2560 <xsl:call-template name="displayLabel"></xsl:call-template>
2561 <xsl:call-template name="subfieldSelect">
2562 <xsl:with-param name="codes">abje</xsl:with-param>
2563 </xsl:call-template>
2567 <xsl:for-each select="marc:datafield[@tag=506]">
2568 <accessCondition type="restrictionOnAccess">
2569 <xsl:call-template name="subfieldSelect">
2570 <xsl:with-param name="codes">abcd35</xsl:with-param>
2571 </xsl:call-template>
2574 <xsl:for-each select="marc:datafield[@tag=540]">
2575 <accessCondition type="useAndReproduction">
2576 <xsl:call-template name="subfieldSelect">
2577 <xsl:with-param name="codes">abcde35</xsl:with-param>
2578 </xsl:call-template>
2582 <xsl:for-each select="marc:datafield[@tag=040]">
2583 <recordContentSource authority="marcorg">
2584 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
2585 </recordContentSource>
2587 <xsl:for-each select="marc:controlfield[@tag=008]">
2588 <recordCreationDate encoding="marc">
2589 <xsl:value-of select="substring(.,1,6)"></xsl:value-of>
2590 </recordCreationDate>
2592 <xsl:for-each select="marc:controlfield[@tag=005]">
2593 <recordChangeDate encoding="iso8601">
2594 <xsl:value-of select="."></xsl:value-of>
2597 <xsl:for-each select="marc:controlfield[@tag=001]">
2599 <xsl:if test="../marc:controlfield[@tag=003]">
2600 <xsl:attribute name="source">
2601 <xsl:value-of select="../marc:controlfield[@tag=003]"></xsl:value-of>
2604 <xsl:value-of select="."></xsl:value-of>
2607 <xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
2608 <languageOfCataloging>
2609 <languageTerm authority="iso639-2b" type="code">
2610 <xsl:value-of select="."></xsl:value-of>
2612 </languageOfCataloging>
2616 <xsl:template name="displayForm">
2617 <xsl:for-each select="marc:subfield[@code='c']">
2619 <xsl:value-of select="."></xsl:value-of>
2623 <xsl:template name="affiliation">
2624 <xsl:for-each select="marc:subfield[@code='u']">
2626 <xsl:value-of select="."></xsl:value-of>
2630 <xsl:template name="uri">
2631 <xsl:for-each select="marc:subfield[@code='u']">
2632 <xsl:attribute name="xlink:href">
2633 <xsl:value-of select="."></xsl:value-of>
2636 <xsl:for-each select="marc:subfield[@code='0']">
2638 <xsl:when test="contains(text(), ')')">
2639 <xsl:attribute name="xlink:href">
2640 <xsl:value-of select="substring-after(text(), ')')"></xsl:value-of>
2644 <xsl:attribute name="xlink:href">
2645 <xsl:value-of select="."></xsl:value-of>
2651 <xsl:template name="role">
2652 <xsl:for-each select="marc:subfield[@code='e']">
2654 <roleTerm type="text">
2655 <xsl:value-of select="."></xsl:value-of>
2659 <xsl:for-each select="marc:subfield[@code='4']">
2661 <roleTerm authority="marcrelator" type="code">
2662 <xsl:value-of select="."></xsl:value-of>
2667 <xsl:template name="part">
2668 <xsl:variable name="partNumber">
2669 <xsl:call-template name="specialSubfieldSelect">
2670 <xsl:with-param name="axis">n</xsl:with-param>
2671 <xsl:with-param name="anyCodes">n</xsl:with-param>
2672 <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
2673 </xsl:call-template>
2675 <xsl:variable name="partName">
2676 <xsl:call-template name="specialSubfieldSelect">
2677 <xsl:with-param name="axis">p</xsl:with-param>
2678 <xsl:with-param name="anyCodes">p</xsl:with-param>
2679 <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
2680 </xsl:call-template>
2682 <xsl:if test="string-length(normalize-space($partNumber))">
2684 <xsl:call-template name="chopPunctuation">
2685 <xsl:with-param name="chopString" select="$partNumber"></xsl:with-param>
2686 </xsl:call-template>
2689 <xsl:if test="string-length(normalize-space($partName))">
2691 <xsl:call-template name="chopPunctuation">
2692 <xsl:with-param name="chopString" select="$partName"></xsl:with-param>
2693 </xsl:call-template>
2697 <xsl:template name="relatedPart">
2698 <xsl:if test="@tag=773">
2699 <xsl:for-each select="marc:subfield[@code='g']">
2702 <xsl:value-of select="."></xsl:value-of>
2706 <xsl:for-each select="marc:subfield[@code='q']">
2708 <xsl:call-template name="parsePart"></xsl:call-template>
2713 <xsl:template name="relatedPartNumName">
2714 <xsl:variable name="partNumber">
2715 <xsl:call-template name="specialSubfieldSelect">
2716 <xsl:with-param name="axis">g</xsl:with-param>
2717 <xsl:with-param name="anyCodes">g</xsl:with-param>
2718 <xsl:with-param name="afterCodes">pst</xsl:with-param>
2719 </xsl:call-template>
2721 <xsl:variable name="partName">
2722 <xsl:call-template name="specialSubfieldSelect">
2723 <xsl:with-param name="axis">p</xsl:with-param>
2724 <xsl:with-param name="anyCodes">p</xsl:with-param>
2725 <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
2726 </xsl:call-template>
2728 <xsl:if test="string-length(normalize-space($partNumber))">
2730 <xsl:value-of select="$partNumber"></xsl:value-of>
2733 <xsl:if test="string-length(normalize-space($partName))">
2735 <xsl:value-of select="$partName"></xsl:value-of>
2739 <xsl:template name="relatedName">
2740 <xsl:for-each select="marc:subfield[@code='a']">
2743 <xsl:value-of select="."></xsl:value-of>
2748 <xsl:template name="relatedForm">
2749 <xsl:for-each select="marc:subfield[@code='h']">
2750 <physicalDescription>
2752 <xsl:value-of select="."></xsl:value-of>
2754 </physicalDescription>
2757 <xsl:template name="relatedExtent">
2758 <xsl:for-each select="marc:subfield[@code='h']">
2759 <physicalDescription>
2761 <xsl:value-of select="."></xsl:value-of>
2763 </physicalDescription>
2766 <xsl:template name="relatedNote">
2767 <xsl:for-each select="marc:subfield[@code='n']">
2769 <xsl:value-of select="."></xsl:value-of>
2773 <xsl:template name="relatedSubject">
2774 <xsl:for-each select="marc:subfield[@code='j']">
2776 <temporal encoding="iso8601">
2777 <xsl:call-template name="chopPunctuation">
2778 <xsl:with-param name="chopString" select="."></xsl:with-param>
2779 </xsl:call-template>
2784 <xsl:template name="relatedIdentifierISSN">
2785 <xsl:for-each select="marc:subfield[@code='x']">
2786 <identifier type="issn">
2787 <xsl:value-of select="."></xsl:value-of>
2791 <xsl:template name="relatedIdentifierLocal">
2792 <xsl:for-each select="marc:subfield[@code='w']">
2793 <identifier type="local">
2794 <xsl:value-of select="."></xsl:value-of>
2798 <xsl:template name="relatedIdentifier">
2799 <xsl:for-each select="marc:subfield[@code='o']">
2801 <xsl:value-of select="."></xsl:value-of>
2805 <xsl:template name="relatedItem76X-78X">
2806 <xsl:call-template name="displayLabel"></xsl:call-template>
2807 <xsl:call-template name="relatedTitle76X-78X"></xsl:call-template>
2808 <xsl:call-template name="relatedName"></xsl:call-template>
2809 <xsl:call-template name="relatedOriginInfo"></xsl:call-template>
2810 <xsl:call-template name="relatedLanguage"></xsl:call-template>
2811 <xsl:call-template name="relatedExtent"></xsl:call-template>
2812 <xsl:call-template name="relatedNote"></xsl:call-template>
2813 <xsl:call-template name="relatedSubject"></xsl:call-template>
2814 <xsl:call-template name="relatedIdentifier"></xsl:call-template>
2815 <xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
2816 <xsl:call-template name="relatedIdentifierLocal"></xsl:call-template>
2817 <xsl:call-template name="relatedPart"></xsl:call-template>
2819 <xsl:template name="subjectGeographicZ">
2821 <xsl:call-template name="chopPunctuation">
2822 <xsl:with-param name="chopString" select="."></xsl:with-param>
2823 </xsl:call-template>
2826 <xsl:template name="subjectTemporalY">
2828 <xsl:call-template name="chopPunctuation">
2829 <xsl:with-param name="chopString" select="."></xsl:with-param>
2830 </xsl:call-template>
2833 <xsl:template name="subjectTopic">
2835 <xsl:call-template name="chopPunctuation">
2836 <xsl:with-param name="chopString" select="."></xsl:with-param>
2837 </xsl:call-template>
2840 <!-- 3.2 change tmee 6xx $v genre -->
2841 <xsl:template name="subjectGenre">
2843 <xsl:call-template name="chopPunctuation">
2844 <xsl:with-param name="chopString" select="."></xsl:with-param>
2845 </xsl:call-template>
2849 <xsl:template name="nameABCDN">
2850 <xsl:for-each select="marc:subfield[@code='a']">
2852 <xsl:call-template name="chopPunctuation">
2853 <xsl:with-param name="chopString" select="."></xsl:with-param>
2854 </xsl:call-template>
2857 <xsl:for-each select="marc:subfield[@code='b']">
2859 <xsl:value-of select="."></xsl:value-of>
2862 <xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
2864 <xsl:call-template name="subfieldSelect">
2865 <xsl:with-param name="codes">cdn</xsl:with-param>
2866 </xsl:call-template>
2870 <xsl:template name="nameABCDQ">
2872 <xsl:call-template name="chopPunctuation">
2873 <xsl:with-param name="chopString">
2874 <xsl:call-template name="subfieldSelect">
2875 <xsl:with-param name="codes">aq</xsl:with-param>
2876 </xsl:call-template>
2878 <xsl:with-param name="punctuation">
2879 <xsl:text>:,;/ </xsl:text>
2881 </xsl:call-template>
2883 <xsl:call-template name="termsOfAddress"></xsl:call-template>
2884 <xsl:call-template name="nameDate"></xsl:call-template>
2886 <xsl:template name="nameACDEQ">
2888 <xsl:call-template name="subfieldSelect">
2889 <xsl:with-param name="codes">acdeq</xsl:with-param>
2890 </xsl:call-template>
2893 <xsl:template name="constituentOrRelatedType">
2894 <xsl:if test="@ind2=2">
2895 <xsl:attribute name="type">constituent</xsl:attribute>
2898 <xsl:template name="relatedTitle">
2899 <xsl:for-each select="marc:subfield[@code='t']">
2902 <xsl:call-template name="chopPunctuation">
2903 <xsl:with-param name="chopString">
2904 <xsl:value-of select="."></xsl:value-of>
2906 </xsl:call-template>
2911 <xsl:template name="relatedTitle76X-78X">
2912 <xsl:for-each select="marc:subfield[@code='t']">
2915 <xsl:call-template name="chopPunctuation">
2916 <xsl:with-param name="chopString">
2917 <xsl:value-of select="."></xsl:value-of>
2919 </xsl:call-template>
2921 <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
2922 <xsl:call-template name="relatedPartNumName"></xsl:call-template>
2926 <xsl:for-each select="marc:subfield[@code='p']">
2927 <titleInfo type="abbreviated">
2929 <xsl:call-template name="chopPunctuation">
2930 <xsl:with-param name="chopString">
2931 <xsl:value-of select="."></xsl:value-of>
2933 </xsl:call-template>
2935 <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
2936 <xsl:call-template name="relatedPartNumName"></xsl:call-template>
2940 <xsl:for-each select="marc:subfield[@code='s']">
2941 <titleInfo type="uniform">
2943 <xsl:call-template name="chopPunctuation">
2944 <xsl:with-param name="chopString">
2945 <xsl:value-of select="."></xsl:value-of>
2947 </xsl:call-template>
2949 <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
2950 <xsl:call-template name="relatedPartNumName"></xsl:call-template>
2955 <xsl:template name="relatedOriginInfo">
2956 <xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
2958 <xsl:if test="@tag=775">
2959 <xsl:for-each select="marc:subfield[@code='f']">
2962 <xsl:attribute name="type">code</xsl:attribute>
2963 <xsl:attribute name="authority">marcgac</xsl:attribute>
2964 <xsl:value-of select="."></xsl:value-of>
2969 <xsl:for-each select="marc:subfield[@code='d']">
2971 <xsl:value-of select="."></xsl:value-of>
2974 <xsl:for-each select="marc:subfield[@code='b']">
2976 <xsl:value-of select="."></xsl:value-of>
2982 <xsl:template name="relatedLanguage">
2983 <xsl:for-each select="marc:subfield[@code='e']">
2984 <xsl:call-template name="getLanguage">
2985 <xsl:with-param name="langString">
2986 <xsl:value-of select="."></xsl:value-of>
2988 </xsl:call-template>
2991 <xsl:template name="nameDate">
2992 <xsl:for-each select="marc:subfield[@code='d']">
2993 <namePart type="date">
2994 <xsl:call-template name="chopPunctuation">
2995 <xsl:with-param name="chopString" select="."></xsl:with-param>
2996 </xsl:call-template>
3000 <xsl:template name="subjectAuthority">
3001 <xsl:if test="@ind2!=4">
3002 <xsl:if test="@ind2!=' '">
3003 <xsl:if test="@ind2!=8">
3004 <xsl:if test="@ind2!=9">
3005 <xsl:attribute name="authority">
3007 <xsl:when test="@ind2=0">lcsh</xsl:when>
3008 <xsl:when test="@ind2=1">lcshac</xsl:when>
3009 <xsl:when test="@ind2=2">mesh</xsl:when>
3011 <xsl:when test="@ind2=3">nal</xsl:when>
3012 <xsl:when test="@ind2=5">csh</xsl:when>
3013 <xsl:when test="@ind2=6">rvm</xsl:when>
3014 <xsl:when test="@ind2=7">
3015 <xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
3024 <xsl:template name="subjectAnyOrder">
3025 <xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
3027 <xsl:when test="@code='v'">
3028 <xsl:call-template name="subjectGenre"></xsl:call-template>
3030 <xsl:when test="@code='x'">
3031 <xsl:call-template name="subjectTopic"></xsl:call-template>
3033 <xsl:when test="@code='y'">
3034 <xsl:call-template name="subjectTemporalY"></xsl:call-template>
3036 <xsl:when test="@code='z'">
3037 <xsl:call-template name="subjectGeographicZ"></xsl:call-template>
3042 <xsl:template name="specialSubfieldSelect">
3043 <xsl:param name="anyCodes"></xsl:param>
3044 <xsl:param name="axis"></xsl:param>
3045 <xsl:param name="beforeCodes"></xsl:param>
3046 <xsl:param name="afterCodes"></xsl:param>
3047 <xsl:variable name="str">
3048 <xsl:for-each select="marc:subfield">
3049 <xsl:if test="contains($anyCodes, @code) or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis]) or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
3050 <xsl:value-of select="text()"></xsl:value-of>
3051 <xsl:text> </xsl:text>
3055 <xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
3058 <!-- 3.2 change tmee 6xx $v genre -->
3059 <xsl:template match="marc:datafield[@tag=600]">
3061 <xsl:call-template name="subjectAuthority"></xsl:call-template>
3062 <name type="personal">
3063 <xsl:call-template name="uri" />
3064 <xsl:call-template name="termsOfAddress"></xsl:call-template>
3066 <xsl:call-template name="chopPunctuation">
3067 <xsl:with-param name="chopString">
3068 <xsl:call-template name="subfieldSelect">
3069 <xsl:with-param name="codes">aq</xsl:with-param>
3070 </xsl:call-template>
3072 </xsl:call-template>
3074 <xsl:call-template name="nameDate"></xsl:call-template>
3075 <xsl:call-template name="affiliation"></xsl:call-template>
3076 <xsl:call-template name="role"></xsl:call-template>
3078 <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
3081 <xsl:template match="marc:datafield[@tag=610]">
3083 <xsl:call-template name="subjectAuthority"></xsl:call-template>
3084 <name type="corporate">
3085 <xsl:call-template name="uri" />
3086 <xsl:for-each select="marc:subfield[@code='a']">
3088 <xsl:value-of select="."></xsl:value-of>
3091 <xsl:for-each select="marc:subfield[@code='b']">
3093 <xsl:value-of select="."></xsl:value-of>
3096 <xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
3098 <xsl:call-template name="subfieldSelect">
3099 <xsl:with-param name="codes">cdnp</xsl:with-param>
3100 </xsl:call-template>
3103 <xsl:call-template name="role"></xsl:call-template>
3105 <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
3108 <xsl:template match="marc:datafield[@tag=611]">
3110 <xsl:call-template name="subjectAuthority"></xsl:call-template>
3111 <name type="conference">
3112 <xsl:call-template name="uri" />
3114 <xsl:call-template name="subfieldSelect">
3115 <xsl:with-param name="codes">abcdeqnp</xsl:with-param>
3116 </xsl:call-template>
3118 <xsl:for-each select="marc:subfield[@code='4']">
3120 <roleTerm authority="marcrelator" type="code">
3121 <xsl:value-of select="."></xsl:value-of>
3126 <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
3129 <xsl:template match="marc:datafield[@tag=630]">
3131 <xsl:call-template name="subjectAuthority"></xsl:call-template>
3132 <xsl:variable name="titleChop">
3133 <xsl:call-template name="chopPunctuation">
3134 <xsl:with-param name="chopString">
3135 <xsl:call-template name="subfieldSelect">
3136 <xsl:with-param name="codes">adfhklor</xsl:with-param>
3137 </xsl:call-template>
3139 </xsl:call-template>
3143 <xsl:value-of select="$titleChop" />
3145 <xsl:call-template name="part"></xsl:call-template>
3147 <titleInfo type="nfi">
3149 <xsl:when test="@ind1>0">
3151 <xsl:value-of select="substring($titleChop,1,@ind1)"/>
3154 <xsl:value-of select="substring($titleChop,@ind1+1)"/>
3156 <xsl:call-template name="part"/>
3160 <xsl:value-of select="$titleChop" />
3164 <xsl:call-template name="part"></xsl:call-template>
3166 <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
3169 <xsl:template match="marc:datafield[@tag=650]">
3171 <xsl:call-template name="subjectAuthority"></xsl:call-template>
3173 <xsl:call-template name="uri" />
3174 <xsl:call-template name="chopPunctuation">
3175 <xsl:with-param name="chopString">
3176 <xsl:call-template name="subfieldSelect">
3177 <xsl:with-param name="codes">abcd</xsl:with-param>
3178 </xsl:call-template>
3180 </xsl:call-template>
3182 <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
3185 <xsl:template match="marc:datafield[@tag=651]">
3187 <xsl:call-template name="subjectAuthority"></xsl:call-template>
3188 <xsl:for-each select="marc:subfield[@code='a']">
3190 <xsl:call-template name="uri" />
3191 <xsl:call-template name="chopPunctuation">
3192 <xsl:with-param name="chopString" select="."></xsl:with-param>
3193 </xsl:call-template>
3196 <xsl:call-template name="subjectAnyOrder"></xsl:call-template>
3199 <xsl:template match="marc:datafield[@tag=653]">
3201 <xsl:for-each select="marc:subfield[@code='a']">
3203 <xsl:call-template name="uri" />
3204 <xsl:value-of select="."></xsl:value-of>
3209 <xsl:template match="marc:datafield[@tag=656]">
3211 <xsl:if test="marc:subfield[@code=2]">
3212 <xsl:attribute name="authority">
3213 <xsl:value-of select="marc:subfield[@code=2]"></xsl:value-of>
3217 <xsl:call-template name="uri" />
3218 <xsl:call-template name="chopPunctuation">
3219 <xsl:with-param name="chopString">
3220 <xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
3222 </xsl:call-template>
3226 <xsl:template name="termsOfAddress">
3227 <xsl:if test="marc:subfield[@code='b' or @code='c']">
3228 <namePart type="termsOfAddress">
3229 <xsl:call-template name="chopPunctuation">
3230 <xsl:with-param name="chopString">
3231 <xsl:call-template name="subfieldSelect">
3232 <xsl:with-param name="codes">bc</xsl:with-param>
3233 </xsl:call-template>
3235 </xsl:call-template>
3239 <xsl:template name="displayLabel">
3240 <xsl:if test="marc:subfield[@code='i']">
3241 <xsl:attribute name="displayLabel">
3242 <xsl:value-of select="marc:subfield[@code='i']"></xsl:value-of>
3245 <xsl:if test="marc:subfield[@code='3']">
3246 <xsl:attribute name="displayLabel">
3247 <xsl:value-of select="marc:subfield[@code='3']"></xsl:value-of>
3251 <xsl:template name="isInvalid">
3252 <xsl:param name="type"/>
3253 <xsl:if test="marc:subfield[@code='z'] or marc:subfield[@code='y']">
3255 <xsl:attribute name="type">
3256 <xsl:value-of select="$type"/>
3258 <xsl:attribute name="invalid">
3259 <xsl:text>yes</xsl:text>
3261 <xsl:if test="marc:subfield[@code='z']">
3262 <xsl:value-of select="marc:subfield[@code='z']"/>
3264 <xsl:if test="marc:subfield[@code='y']">
3265 <xsl:value-of select="marc:subfield[@code='y']"/>
3270 <xsl:template name="subtitle">
3271 <xsl:if test="marc:subfield[@code='b']">
3273 <xsl:call-template name="chopPunctuation">
3274 <xsl:with-param name="chopString">
3275 <xsl:value-of select="marc:subfield[@code='b']"/>
3276 <!--<xsl:call-template name="subfieldSelect">
3277 <xsl:with-param name="codes">b</xsl:with-param>
3278 </xsl:call-template>-->
3280 </xsl:call-template>
3284 <xsl:template name="script">
3285 <xsl:param name="scriptCode"></xsl:param>
3286 <xsl:attribute name="script">
3288 <xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
3289 <xsl:when test="$scriptCode='(B'">Latin</xsl:when>
3290 <xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
3291 <xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
3292 <xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
3293 <xsl:when test="$scriptCode='(S'">Greek</xsl:when>
3297 <xsl:template name="parsePart">
3298 <!-- assumes 773$q= 1:2:3<4
3299 with up to 3 levels and one optional start page
3301 <xsl:variable name="level1">
3303 <xsl:when test="contains(text(),':')">
3305 <xsl:value-of select="substring-before(text(),':')"></xsl:value-of>
3307 <xsl:when test="not(contains(text(),':'))">
3309 <xsl:if test="contains(text(),'<')">
3311 <xsl:value-of select="substring-before(text(),'<')"></xsl:value-of>
3313 <xsl:if test="not(contains(text(),'<'))">
3315 <xsl:value-of select="text()"></xsl:value-of>
3320 <xsl:variable name="sici2">
3322 <xsl:when test="starts-with(substring-after(text(),$level1),':')">
3323 <xsl:value-of select="substring(substring-after(text(),$level1),2)"></xsl:value-of>
3326 <xsl:value-of select="substring-after(text(),$level1)"></xsl:value-of>
3330 <xsl:variable name="level2">
3332 <xsl:when test="contains($sici2,':')">
3334 <xsl:value-of select="substring-before($sici2,':')"></xsl:value-of>
3336 <xsl:when test="contains($sici2,'<')">
3338 <xsl:value-of select="substring-before($sici2,'<')"></xsl:value-of>
3341 <xsl:value-of select="$sici2"></xsl:value-of>
3346 <xsl:variable name="sici3">
3348 <xsl:when test="starts-with(substring-after($sici2,$level2),':')">
3349 <xsl:value-of select="substring(substring-after($sici2,$level2),2)"></xsl:value-of>
3352 <xsl:value-of select="substring-after($sici2,$level2)"></xsl:value-of>
3356 <xsl:variable name="level3">
3358 <xsl:when test="contains($sici3,'<')">
3360 <xsl:value-of select="substring-before($sici3,'<')"></xsl:value-of>
3363 <xsl:value-of select="$sici3"></xsl:value-of>
3368 <xsl:variable name="page">
3369 <xsl:if test="contains(text(),'<')">
3370 <xsl:value-of select="substring-after(text(),'<')"></xsl:value-of>
3373 <xsl:if test="$level1">
3376 <xsl:value-of select="$level1"></xsl:value-of>
3380 <xsl:if test="$level2">
3383 <xsl:value-of select="$level2"></xsl:value-of>
3387 <xsl:if test="$level3">
3390 <xsl:value-of select="$level3"></xsl:value-of>
3394 <xsl:if test="$page">
3395 <extent unit="page">
3397 <xsl:value-of select="$page"></xsl:value-of>
3402 <xsl:template name="getLanguage">
3403 <xsl:param name="langString"></xsl:param>
3404 <xsl:param name="controlField008-35-37"></xsl:param>
3405 <xsl:variable name="length" select="string-length($langString)"></xsl:variable>
3407 <xsl:when test="$length=0"></xsl:when>
3408 <xsl:when test="$controlField008-35-37=substring($langString,1,3)">
3409 <xsl:call-template name="getLanguage">
3410 <xsl:with-param name="langString" select="substring($langString,4,$length)"></xsl:with-param>
3411 <xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"></xsl:with-param>
3412 </xsl:call-template>
3416 <languageTerm authority="iso639-2b" type="code">
3417 <xsl:value-of select="substring($langString,1,3)"></xsl:value-of>
3420 <xsl:call-template name="getLanguage">
3421 <xsl:with-param name="langString" select="substring($langString,4,$length)"></xsl:with-param>
3422 <xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"></xsl:with-param>
3423 </xsl:call-template>
3427 <xsl:template name="isoLanguage">
3428 <xsl:param name="currentLanguage"></xsl:param>
3429 <xsl:param name="usedLanguages"></xsl:param>
3430 <xsl:param name="remainingLanguages"></xsl:param>
3432 <xsl:when test="string-length($currentLanguage)=0"></xsl:when>
3433 <xsl:when test="not(contains($usedLanguages, $currentLanguage))">
3435 <xsl:if test="@code!='a'">
3436 <xsl:attribute name="objectPart">
3438 <xsl:when test="@code='b'">summary or subtitle</xsl:when>
3439 <xsl:when test="@code='d'">sung or spoken text</xsl:when>
3440 <xsl:when test="@code='e'">libretto</xsl:when>
3441 <xsl:when test="@code='f'">table of contents</xsl:when>
3442 <xsl:when test="@code='g'">accompanying material</xsl:when>
3443 <xsl:when test="@code='h'">translation</xsl:when>
3447 <languageTerm authority="iso639-2b" type="code">
3448 <xsl:value-of select="$currentLanguage"></xsl:value-of>
3451 <xsl:call-template name="isoLanguage">
3452 <xsl:with-param name="currentLanguage">
3453 <xsl:value-of select="substring($remainingLanguages,1,3)"></xsl:value-of>
3455 <xsl:with-param name="usedLanguages">
3456 <xsl:value-of select="concat($usedLanguages,$currentLanguage)"></xsl:value-of>
3458 <xsl:with-param name="remainingLanguages">
3459 <xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"></xsl:value-of>
3461 </xsl:call-template>
3464 <xsl:call-template name="isoLanguage">
3465 <xsl:with-param name="currentLanguage">
3466 <xsl:value-of select="substring($remainingLanguages,1,3)"></xsl:value-of>
3468 <xsl:with-param name="usedLanguages">
3469 <xsl:value-of select="concat($usedLanguages,$currentLanguage)"></xsl:value-of>
3471 <xsl:with-param name="remainingLanguages">
3472 <xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"></xsl:value-of>
3474 </xsl:call-template>
3478 <xsl:template name="chopBrackets">
3479 <xsl:param name="chopString"></xsl:param>
3480 <xsl:variable name="string">
3481 <xsl:call-template name="chopPunctuation">
3482 <xsl:with-param name="chopString" select="$chopString"></xsl:with-param>
3483 </xsl:call-template>
3485 <xsl:if test="substring($string, 1,1)='['">
3486 <xsl:value-of select="substring($string,2, string-length($string)-2)"></xsl:value-of>
3488 <xsl:if test="substring($string, 1,1)!='['">
3489 <xsl:value-of select="$string"></xsl:value-of>
3492 <xsl:template name="rfcLanguages">
3493 <xsl:param name="nodeNum"></xsl:param>
3494 <xsl:param name="usedLanguages"></xsl:param>
3495 <xsl:param name="controlField008-35-37"></xsl:param>
3496 <xsl:variable name="currentLanguage" select="."></xsl:variable>
3498 <xsl:when test="not($currentLanguage)"></xsl:when>
3499 <xsl:when test="$currentLanguage!=$controlField008-35-37 and $currentLanguage!='rfc3066'">
3500 <xsl:if test="not(contains($usedLanguages,$currentLanguage))">
3502 <xsl:if test="@code!='a'">
3503 <xsl:attribute name="objectPart">
3505 <xsl:when test="@code='b'">summary or subtitle</xsl:when>
3506 <xsl:when test="@code='d'">sung or spoken text</xsl:when>
3507 <xsl:when test="@code='e'">libretto</xsl:when>
3508 <xsl:when test="@code='f'">table of contents</xsl:when>
3509 <xsl:when test="@code='g'">accompanying material</xsl:when>
3510 <xsl:when test="@code='h'">translation</xsl:when>
3514 <languageTerm authority="rfc3066" type="code">
3515 <xsl:value-of select="$currentLanguage"/>
3524 <xsl:template name="datafield">
3525 <xsl:param name="tag"/>
3526 <xsl:param name="ind1"><xsl:text> </xsl:text></xsl:param>
3527 <xsl:param name="ind2"><xsl:text> </xsl:text></xsl:param>
3528 <xsl:param name="subfields"/>
3529 <xsl:element name="marc:datafield">
3530 <xsl:attribute name="tag">
3531 <xsl:value-of select="$tag"/>
3533 <xsl:attribute name="ind1">
3534 <xsl:value-of select="$ind1"/>
3536 <xsl:attribute name="ind2">
3537 <xsl:value-of select="$ind2"/>
3539 <xsl:copy-of select="$subfields"/>
3543 <xsl:template name="subfieldSelect">
3544 <xsl:param name="codes"/>
3545 <xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
3546 <xsl:variable name="str">
3547 <xsl:for-each select="marc:subfield">
3548 <xsl:if test="contains($codes, @code)">
3549 <xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
3553 <xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
3556 <xsl:template name="buildSpaces">
3557 <xsl:param name="spaces"/>
3558 <xsl:param name="char"><xsl:text> </xsl:text></xsl:param>
3559 <xsl:if test="$spaces>0">
3560 <xsl:value-of select="$char"/>
3561 <xsl:call-template name="buildSpaces">
3562 <xsl:with-param name="spaces" select="$spaces - 1"/>
3563 <xsl:with-param name="char" select="$char"/>
3564 </xsl:call-template>
3568 <xsl:template name="chopPunctuation">
3569 <xsl:param name="chopString"/>
3570 <xsl:param name="punctuation"><xsl:text>.:,;/ </xsl:text></xsl:param>
3571 <xsl:variable name="length" select="string-length($chopString)"/>
3573 <xsl:when test="$length=0"/>
3574 <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
3575 <xsl:call-template name="chopPunctuation">
3576 <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
3577 <xsl:with-param name="punctuation" select="$punctuation"/>
3578 </xsl:call-template>
3580 <xsl:when test="not($chopString)"/>
3581 <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
3585 <xsl:template name="chopPunctuationFront">
3586 <xsl:param name="chopString"/>
3587 <xsl:variable name="length" select="string-length($chopString)"/>
3589 <xsl:when test="$length=0"/>
3590 <xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
3591 <xsl:call-template name="chopPunctuationFront">
3592 <xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"/>
3593 </xsl:call-template>
3595 <xsl:when test="not($chopString)"/>
3596 <xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
3599 </xsl:stylesheet>$$ WHERE name = 'mods32';
3602 -- 954.data.MODS33-xsl.sql
3603 UPDATE config.xml_transform SET xslt=$$<xsl:stylesheet xmlns="http://www.loc.gov/mods/v3" xmlns:marc="http://www.loc.gov/MARC21/slim"
3604 xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3605 exclude-result-prefixes="xlink marc" version="1.0">
3606 <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
3608 <xsl:variable name="ascii">
3609 <xsl:text> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:text>
3612 <xsl:variable name="latin1">
3613 <xsl:text> ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</xsl:text>
3615 <!-- Characters that usually don't need to be escaped -->
3616 <xsl:variable name="safe">
3617 <xsl:text>!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~</xsl:text>
3620 <xsl:variable name="hex">0123456789ABCDEF</xsl:variable>
3622 <!-- Evergreen specific: revert Revision 1.23, so we can have those authority xlink attributes back. -->
3624 <!--MARC21slim2MODS3-3.xsl
3625 Revision 1.27 - Mapped 648 to <subject> 2009/03/13 tmee
3626 Revision 1.26 - Added subfield $s mapping for 130/240/730 2008/10/16 tmee
3627 Revision 1.25 - Mapped 040e to <descriptiveStandard> and Leader/18 to <descriptive standard>aacr2 2008/09/18 tmee
3628 Revision 1.24 - Mapped 852 subfields $h, $i, $j, $k, $l, $m, $t to <shelfLocation> and 852 subfield $u to <physicalLocation> with @xlink 2008/09/17 tmee
3629 Revision 1.23 - Commented out xlink/uri for subfield 0 for 130/240/730, 100/700, 110/710, 111/711 as these are currently unactionable 2008/09/17 tmee
3630 Revision 1.22 - Mapped 022 subfield $l to type "issn-l" subfield $m to output identifier element with corresponding @type and @invalid eq 'yes'2008/09/17 tmee
3631 Revision 1.21 - Mapped 856 ind2=1 or ind2=2 to <relatedItem><location><url> 2008/07/03 tmee
3632 Revision 1.20 - Added genre w/@auth="contents of 2" and type= "musical composition" 2008/07/01 tmee
3633 Revision 1.19 - Added genre offprint for 008/24+ BK code 2 2008/07/01 tmee
3634 Revision 1.18 - Added xlink/uri for subfield 0 for 130/240/730, 100/700, 110/710, 111/711 2008/06/26 tmee
3635 Revision 1.17 - Added mapping of 662 2008/05/14 tmee
3636 Revision 1.16 - Changed @authority from "marc" to "marcgt" for 007 and 008 codes mapped to a term in <genre> 2007/07/10 tmee
3637 Revision 1.15 - For field 630, moved call to part template outside title element 2007/07/10 tmee
3638 Revision 1.14 - Fixed template isValid and fields 010, 020, 022, 024, 028, and 037 to output additional identifier elements with corresponding @type and @invalid eq 'yes' when subfields z or y (in the case of 022) exist in the MARCXML ::: 2007/01/04 17:35:20 cred
3639 Revision 1.13 - Changed order of output under cartographics to reflect schema 2006/11/28 tmee
3640 Revision 1.12 - Updated to reflect MODS 3.2 Mapping 2006/10/11 tmee
3641 Revision 1.11 - The attribute objectPart moved from <languageTerm> to <language> 2006/04/08 jrad
3642 Revision 1.10 - MODS 3.1 revisions to language and classification elements (plus ability to find marc:collection embedded in wrapper elements such as SRU zs: wrappers) 2006/02/06 ggar
3643 Revision 1.9 - Subfield $y was added to field 242 2004/09/02 10:57 jrad
3644 Revision 1.8 - Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
3645 Revision 1.7 - 2004/03/25 08:29 jrad
3646 Revision 1.6 - Various validation fixes 2004/02/20 ntra
3647 Revision 1.5 - MODS2 to MODS3 updates, language unstacking and de-duping, chopPunctuation expanded 2003/10/02 16:18:58 ntra
3648 Revision 1.3 - Additional Changes not related to MODS Version 2.0 by ntra
3649 Revision 1.2 - Added Log Comment 2003/03/24 19:37:42 ckeith
3651 <xsl:template match="/">
3653 <xsl:when test="//marc:collection">
3654 <modsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3655 xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
3656 <xsl:for-each select="//marc:collection/marc:record">
3657 <mods version="3.3">
3658 <xsl:call-template name="marcRecord"/>
3664 <mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3"
3665 xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
3666 <xsl:for-each select="//marc:record">
3667 <xsl:call-template name="marcRecord"/>
3673 <xsl:template name="marcRecord">
3674 <xsl:variable name="leader" select="marc:leader"/>
3675 <xsl:variable name="leader6" select="substring($leader,7,1)"/>
3676 <xsl:variable name="leader7" select="substring($leader,8,1)"/>
3677 <xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
3678 <xsl:variable name="typeOf008">
3680 <xsl:when test="$leader6='a'">
3683 test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
3684 <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
3687 <xsl:when test="$leader6='t'">BK</xsl:when>
3688 <xsl:when test="$leader6='p'">MM</xsl:when>
3689 <xsl:when test="$leader6='m'">CF</xsl:when>
3690 <xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
3691 <xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
3692 <xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'"
3696 <xsl:for-each select="marc:datafield[@tag='245']">
3698 <xsl:variable name="title">
3700 <xsl:when test="marc:subfield[@code='b']">
3701 <xsl:call-template name="specialSubfieldSelect">
3702 <xsl:with-param name="axis">b</xsl:with-param>
3703 <xsl:with-param name="beforeCodes">afgk</xsl:with-param>
3704 </xsl:call-template>
3707 <xsl:call-template name="subfieldSelect">
3708 <xsl:with-param name="codes">abfgk</xsl:with-param>
3709 </xsl:call-template>
3713 <xsl:variable name="titleChop">
3714 <xsl:call-template name="chopPunctuation">
3715 <xsl:with-param name="chopString">
3716 <xsl:value-of select="$title"/>
3718 </xsl:call-template>
3721 <xsl:when test="@ind2>0">
3723 <xsl:value-of select="substring($titleChop,1,@ind2)"/>
3726 <xsl:value-of select="substring($titleChop,@ind2+1)"/>
3731 <xsl:value-of select="$titleChop"/>
3735 <xsl:if test="marc:subfield[@code='b']">
3737 <xsl:call-template name="chopPunctuation">
3738 <xsl:with-param name="chopString">
3739 <xsl:call-template name="specialSubfieldSelect">
3740 <xsl:with-param name="axis">b</xsl:with-param>
3741 <xsl:with-param name="anyCodes">b</xsl:with-param>
3742 <xsl:with-param name="afterCodes">afgk</xsl:with-param>
3743 </xsl:call-template>
3745 </xsl:call-template>
3748 <xsl:call-template name="part"/>
3751 <xsl:for-each select="marc:datafield[@tag='210']">
3752 <titleInfo type="abbreviated">
3754 <xsl:call-template name="chopPunctuation">
3755 <xsl:with-param name="chopString">
3756 <xsl:call-template name="subfieldSelect">
3757 <xsl:with-param name="codes">a</xsl:with-param>
3758 </xsl:call-template>
3760 </xsl:call-template>
3762 <xsl:call-template name="subtitle"/>
3765 <xsl:for-each select="marc:datafield[@tag='242']">
3766 <titleInfo type="translated">
3767 <!--09/01/04 Added subfield $y-->
3768 <xsl:for-each select="marc:subfield[@code='y']">
3769 <xsl:attribute name="lang">
3770 <xsl:value-of select="text()"/>
3773 <xsl:for-each select="marc:subfield[@code='i']">
3774 <xsl:attribute name="displayLabel">
3775 <xsl:value-of select="text()"/>
3779 <xsl:call-template name="chopPunctuation">
3780 <xsl:with-param name="chopString">
3781 <xsl:call-template name="subfieldSelect">
3782 <!-- 1/04 removed $h, b -->
3783 <xsl:with-param name="codes">a</xsl:with-param>
3784 </xsl:call-template>
3786 </xsl:call-template>
3789 <xsl:call-template name="subtitle"/>
3790 <xsl:call-template name="part"/>
3793 <xsl:for-each select="marc:datafield[@tag='246']">
3794 <titleInfo type="alternative">
3795 <xsl:for-each select="marc:subfield[@code='i']">
3796 <xsl:attribute name="displayLabel">
3797 <xsl:value-of select="text()"/>
3801 <xsl:call-template name="chopPunctuation">
3802 <xsl:with-param name="chopString">
3803 <xsl:call-template name="subfieldSelect">
3804 <!-- 1/04 removed $h, $b -->
3805 <xsl:with-param name="codes">af</xsl:with-param>
3806 </xsl:call-template>
3808 </xsl:call-template>
3810 <xsl:call-template name="subtitle"/>
3811 <xsl:call-template name="part"/>
3815 select="marc:datafield[@tag='130']|marc:datafield[@tag='240']|marc:datafield[@tag='730'][@ind2!='2']">
3816 <titleInfo type="uniform">
3818 <xsl:call-template name="uri"/>
3820 <xsl:variable name="str">
3821 <xsl:for-each select="marc:subfield">
3823 test="(contains('adfklmors',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
3824 <xsl:value-of select="text()"/>
3825 <xsl:text> </xsl:text>
3829 <xsl:call-template name="chopPunctuation">
3830 <xsl:with-param name="chopString">
3831 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
3833 </xsl:call-template>
3835 <xsl:call-template name="part"/>
3838 <xsl:for-each select="marc:datafield[@tag='740'][@ind2!='2']">
3839 <titleInfo type="alternative">
3841 <xsl:call-template name="chopPunctuation">
3842 <xsl:with-param name="chopString">
3843 <xsl:call-template name="subfieldSelect">
3844 <xsl:with-param name="codes">ah</xsl:with-param>
3845 </xsl:call-template>
3847 </xsl:call-template>
3849 <xsl:call-template name="part"/>
3852 <xsl:for-each select="marc:datafield[@tag='100']">
3853 <name type="personal">
3855 <xsl:call-template name="uri"/>
3857 <xsl:call-template name="nameABCDQ"/>
3858 <xsl:call-template name="affiliation"/>
3860 <roleTerm authority="marcrelator" type="text">creator</roleTerm>
3862 <xsl:call-template name="role"/>
3865 <xsl:for-each select="marc:datafield[@tag='110']">
3866 <name type="corporate">
3868 <xsl:call-template name="uri"/>
3870 <xsl:call-template name="nameABCDN"/>
3872 <roleTerm authority="marcrelator" type="text">creator</roleTerm>
3874 <xsl:call-template name="role"/>
3877 <xsl:for-each select="marc:datafield[@tag='111']">
3878 <name type="conference">
3880 <xsl:call-template name="uri"/>
3882 <xsl:call-template name="nameACDEQ"/>
3884 <roleTerm authority="marcrelator" type="text">creator</roleTerm>
3886 <xsl:call-template name="role"/>
3889 <xsl:for-each select="marc:datafield[@tag='700'][not(marc:subfield[@code='t'])]">
3890 <name type="personal">
3892 <xsl:call-template name="uri"/>
3894 <xsl:call-template name="nameABCDQ"/>
3895 <xsl:call-template name="affiliation"/>
3896 <xsl:call-template name="role"/>
3899 <xsl:for-each select="marc:datafield[@tag='710'][not(marc:subfield[@code='t'])]">
3900 <name type="corporate">
3902 <xsl:call-template name="uri"/>
3904 <xsl:call-template name="nameABCDN"/>
3905 <xsl:call-template name="role"/>
3908 <xsl:for-each select="marc:datafield[@tag='711'][not(marc:subfield[@code='t'])]">
3909 <name type="conference">
3911 <xsl:call-template name="uri"/>
3913 <xsl:call-template name="nameACDEQ"/>
3914 <xsl:call-template name="role"/>
3917 <xsl:for-each select="marc:datafield[@tag='720'][not(marc:subfield[@code='t'])]">
3919 <xsl:if test="@ind1=1">
3920 <xsl:attribute name="type">
3921 <xsl:text>personal</xsl:text>
3925 <xsl:value-of select="marc:subfield[@code='a']"/>
3927 <xsl:call-template name="role"/>
3931 <xsl:if test="$leader7='c'">
3932 <xsl:attribute name="collection">yes</xsl:attribute>
3934 <xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
3935 <xsl:attribute name="manuscript">yes</xsl:attribute>
3938 <xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
3939 <xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
3940 <xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
3941 <xsl:when test="$leader6='i'">sound recording-nonmusical</xsl:when>
3942 <xsl:when test="$leader6='j'">sound recording-musical</xsl:when>
3943 <xsl:when test="$leader6='k'">still image</xsl:when>
3944 <xsl:when test="$leader6='g'">moving image</xsl:when>
3945 <xsl:when test="$leader6='r'">three dimensional object</xsl:when>
3946 <xsl:when test="$leader6='m'">software, multimedia</xsl:when>
3947 <xsl:when test="$leader6='p'">mixed material</xsl:when>
3950 <xsl:if test="substring($controlField008,26,1)='d'">
3951 <genre authority="marcgt">globe</genre>
3954 test="marc:controlfield[@tag='007'][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
3955 <genre authority="marcgt">remote-sensing image</genre>
3957 <xsl:if test="$typeOf008='MP'">
3958 <xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"/>
3961 test="$controlField008-25='a' or $controlField008-25='b' or $controlField008-25='c' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
3962 <genre authority="marcgt">map</genre>
3965 test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
3966 <genre authority="marcgt">atlas</genre>
3970 <xsl:if test="$typeOf008='SE'">
3971 <xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"/>
3973 <xsl:when test="$controlField008-21='d'">
3974 <genre authority="marcgt">database</genre>
3976 <xsl:when test="$controlField008-21='l'">
3977 <genre authority="marcgt">loose-leaf</genre>
3979 <xsl:when test="$controlField008-21='m'">
3980 <genre authority="marcgt">series</genre>
3982 <xsl:when test="$controlField008-21='n'">
3983 <genre authority="marcgt">newspaper</genre>
3985 <xsl:when test="$controlField008-21='p'">
3986 <genre authority="marcgt">periodical</genre>
3988 <xsl:when test="$controlField008-21='w'">
3989 <genre authority="marcgt">web site</genre>
3993 <xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
3994 <xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"/>
3996 <xsl:when test="contains($controlField008-24,'a')">
3997 <genre authority="marcgt">abstract or summary</genre>
3999 <xsl:when test="contains($controlField008-24,'b')">
4000 <genre authority="marcgt">bibliography</genre>
4002 <xsl:when test="contains($controlField008-24,'c')">
4003 <genre authority="marcgt">catalog</genre>
4005 <xsl:when test="contains($controlField008-24,'d')">
4006 <genre authority="marcgt">dictionary</genre>
4008 <xsl:when test="contains($controlField008-24,'e')">
4009 <genre authority="marcgt">encyclopedia</genre>
4011 <xsl:when test="contains($controlField008-24,'f')">
4012 <genre authority="marcgt">handbook</genre>
4014 <xsl:when test="contains($controlField008-24,'g')">
4015 <genre authority="marcgt">legal article</genre>
4017 <xsl:when test="contains($controlField008-24,'i')">
4018 <genre authority="marcgt">index</genre>
4020 <xsl:when test="contains($controlField008-24,'k')">
4021 <genre authority="marcgt">discography</genre>
4023 <xsl:when test="contains($controlField008-24,'l')">
4024 <genre authority="marcgt">legislation</genre>
4026 <xsl:when test="contains($controlField008-24,'m')">
4027 <genre authority="marcgt">theses</genre>
4029 <xsl:when test="contains($controlField008-24,'n')">
4030 <genre authority="marcgt">survey of literature</genre>
4032 <xsl:when test="contains($controlField008-24,'o')">
4033 <genre authority="marcgt">review</genre>
4035 <xsl:when test="contains($controlField008-24,'p')">
4036 <genre authority="marcgt">programmed text</genre>
4038 <xsl:when test="contains($controlField008-24,'q')">
4039 <genre authority="marcgt">filmography</genre>
4041 <xsl:when test="contains($controlField008-24,'r')">
4042 <genre authority="marcgt">directory</genre>
4044 <xsl:when test="contains($controlField008-24,'s')">
4045 <genre authority="marcgt">statistics</genre>
4047 <xsl:when test="contains($controlField008-24,'t')">
4048 <genre authority="marcgt">technical report</genre>
4050 <xsl:when test="contains($controlField008-24,'v')">
4051 <genre authority="marcgt">legal case and case notes</genre>
4053 <xsl:when test="contains($controlField008-24,'w')">
4054 <genre authority="marcgt">law report or digest</genre>
4056 <xsl:when test="contains($controlField008-24,'z')">
4057 <genre authority="marcgt">treaty</genre>
4060 <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
4062 <xsl:when test="$controlField008-29='1'">
4063 <genre authority="marcgt">conference publication</genre>
4067 <xsl:if test="$typeOf008='CF'">
4068 <xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"/>
4070 <xsl:when test="$controlField008-26='a'">
4071 <genre authority="marcgt">numeric data</genre>
4073 <xsl:when test="$controlField008-26='e'">
4074 <genre authority="marcgt">database</genre>
4076 <xsl:when test="$controlField008-26='f'">
4077 <genre authority="marcgt">font</genre>
4079 <xsl:when test="$controlField008-26='g'">
4080 <genre authority="marcgt">game</genre>
4084 <xsl:if test="$typeOf008='BK'">
4085 <xsl:if test="substring($controlField008,25,1)='j'">
4086 <genre authority="marcgt">patent</genre>
4088 <xsl:if test="substring($controlField008,25,1)='2'">
4089 <genre authority="marcgt">offprint</genre>
4091 <xsl:if test="substring($controlField008,31,1)='1'">
4092 <genre authority="marcgt">festschrift</genre>
4094 <xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"/>
4096 test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
4097 <genre authority="marcgt">biography</genre>
4099 <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
4101 <xsl:when test="$controlField008-33='e'">
4102 <genre authority="marcgt">essay</genre>
4104 <xsl:when test="$controlField008-33='d'">
4105 <genre authority="marcgt">drama</genre>
4107 <xsl:when test="$controlField008-33='c'">
4108 <genre authority="marcgt">comic strip</genre>
4110 <xsl:when test="$controlField008-33='l'">
4111 <genre authority="marcgt">fiction</genre>
4113 <xsl:when test="$controlField008-33='h'">
4114 <genre authority="marcgt">humor, satire</genre>
4116 <xsl:when test="$controlField008-33='i'">
4117 <genre authority="marcgt">letter</genre>
4119 <xsl:when test="$controlField008-33='f'">
4120 <genre authority="marcgt">novel</genre>
4122 <xsl:when test="$controlField008-33='j'">
4123 <genre authority="marcgt">short story</genre>
4125 <xsl:when test="$controlField008-33='s'">
4126 <genre authority="marcgt">speech</genre>
4130 <xsl:if test="$typeOf008='MU'">
4131 <xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"/>
4132 <xsl:if test="contains($controlField008-30-31,'b')">
4133 <genre authority="marcgt">biography</genre>
4135 <xsl:if test="contains($controlField008-30-31,'c')">
4136 <genre authority="marcgt">conference publication</genre>
4138 <xsl:if test="contains($controlField008-30-31,'d')">
4139 <genre authority="marcgt">drama</genre>
4141 <xsl:if test="contains($controlField008-30-31,'e')">
4142 <genre authority="marcgt">essay</genre>
4144 <xsl:if test="contains($controlField008-30-31,'f')">
4145 <genre authority="marcgt">fiction</genre>
4147 <xsl:if test="contains($controlField008-30-31,'o')">
4148 <genre authority="marcgt">folktale</genre>
4150 <xsl:if test="contains($controlField008-30-31,'h')">
4151 <genre authority="marcgt">history</genre>
4153 <xsl:if test="contains($controlField008-30-31,'k')">
4154 <genre authority="marcgt">humor, satire</genre>
4156 <xsl:if test="contains($controlField008-30-31,'m')">
4157 <genre authority="marcgt">memoir</genre>
4159 <xsl:if test="contains($controlField008-30-31,'p')">
4160 <genre authority="marcgt">poetry</genre>
4162 <xsl:if test="contains($controlField008-30-31,'r')">
4163 <genre authority="marcgt">rehearsal</genre>
4165 <xsl:if test="contains($controlField008-30-31,'g')">
4166 <genre authority="marcgt">reporting</genre>
4168 <xsl:if test="contains($controlField008-30-31,'s')">
4169 <genre authority="marcgt">sound</genre>
4171 <xsl:if test="contains($controlField008-30-31,'l')">
4172 <genre authority="marcgt">speech</genre>
4175 <xsl:if test="$typeOf008='VM'">
4176 <xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
4178 <xsl:when test="$controlField008-33='a'">
4179 <genre authority="marcgt">art original</genre>
4181 <xsl:when test="$controlField008-33='b'">
4182 <genre authority="marcgt">kit</genre>
4184 <xsl:when test="$controlField008-33='c'">
4185 <genre authority="marcgt">art reproduction</genre>
4187 <xsl:when test="$controlField008-33='d'">
4188 <genre authority="marcgt">diorama</genre>
4190 <xsl:when test="$controlField008-33='f'">
4191 <genre authority="marcgt">filmstrip</genre>
4193 <xsl:when test="$controlField008-33='g'">
4194 <genre authority="marcgt">legal article</genre>
4196 <xsl:when test="$controlField008-33='i'">
4197 <genre authority="marcgt">picture</genre>
4199 <xsl:when test="$controlField008-33='k'">
4200 <genre authority="marcgt">graphic</genre>
4202 <xsl:when test="$controlField008-33='l'">
4203 <genre authority="marcgt">technical drawing</genre>
4205 <xsl:when test="$controlField008-33='m'">
4206 <genre authority="marcgt">motion picture</genre>
4208 <xsl:when test="$controlField008-33='n'">
4209 <genre authority="marcgt">chart</genre>
4211 <xsl:when test="$controlField008-33='o'">
4212 <genre authority="marcgt">flash card</genre>
4214 <xsl:when test="$controlField008-33='p'">
4215 <genre authority="marcgt">microscope slide</genre>
4218 test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
4219 <genre authority="marcgt">model</genre>
4221 <xsl:when test="$controlField008-33='r'">
4222 <genre authority="marcgt">realia</genre>
4224 <xsl:when test="$controlField008-33='s'">
4225 <genre authority="marcgt">slide</genre>
4227 <xsl:when test="$controlField008-33='t'">
4228 <genre authority="marcgt">transparency</genre>
4230 <xsl:when test="$controlField008-33='v'">
4231 <genre authority="marcgt">videorecording</genre>
4233 <xsl:when test="$controlField008-33='w'">
4234 <genre authority="marcgt">toy</genre>
4239 <!-- 1.20 047 genre tmee-->
4241 <xsl:for-each select="marc:datafield[@tag=047]">
4242 <genre authority="marcgt">
4243 <xsl:attribute name="authority">
4244 <xsl:value-of select="marc:subfield[@code='2']"/>
4246 <xsl:call-template name="subfieldSelect">
4247 <xsl:with-param name="codes">abcdef</xsl:with-param>
4248 <xsl:with-param name="delimeter">-</xsl:with-param>
4249 </xsl:call-template>
4252 <xsl:for-each select="marc:datafield[@tag=655]">
4253 <genre authority="marcgt">
4254 <xsl:attribute name="authority">
4255 <xsl:value-of select="marc:subfield[@code='2']"/>
4257 <xsl:call-template name="subfieldSelect">
4258 <xsl:with-param name="codes">abvxyz</xsl:with-param>
4259 <xsl:with-param name="delimeter">-</xsl:with-param>
4260 </xsl:call-template>
4264 <xsl:variable name="MARCpublicationCode"
4265 select="normalize-space(substring($controlField008,16,3))"/>
4266 <xsl:if test="translate($MARCpublicationCode,'|','')">
4269 <xsl:attribute name="type">code</xsl:attribute>
4270 <xsl:attribute name="authority">marccountry</xsl:attribute>
4271 <xsl:value-of select="$MARCpublicationCode"/>
4275 <xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
4278 <xsl:attribute name="type">code</xsl:attribute>
4279 <xsl:attribute name="authority">iso3166</xsl:attribute>
4280 <xsl:value-of select="."/>
4284 <xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
4287 <xsl:attribute name="type">text</xsl:attribute>
4288 <xsl:call-template name="chopPunctuationFront">
4289 <xsl:with-param name="chopString">
4290 <xsl:call-template name="chopPunctuation">
4291 <xsl:with-param name="chopString" select="."/>
4292 </xsl:call-template>
4294 </xsl:call-template>
4298 <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='m']">
4299 <dateValid point="start">
4300 <xsl:value-of select="."/>
4303 <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='n']">
4304 <dateValid point="end">
4305 <xsl:value-of select="."/>
4308 <xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='j']">
4310 <xsl:value-of select="."/>
4314 select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
4316 <xsl:when test="@code='b'">
4318 <xsl:call-template name="chopPunctuation">
4319 <xsl:with-param name="chopString" select="."/>
4320 <xsl:with-param name="punctuation">
4321 <xsl:text>:,;/ </xsl:text>
4323 </xsl:call-template>
4326 <xsl:when test="@code='c'">
4328 <xsl:call-template name="chopPunctuation">
4329 <xsl:with-param name="chopString" select="."/>
4330 </xsl:call-template>
4333 <xsl:when test="@code='g'">
4335 <xsl:value-of select="."/>
4340 <xsl:variable name="dataField260c">
4341 <xsl:call-template name="chopPunctuation">
4342 <xsl:with-param name="chopString"
4343 select="marc:datafield[@tag=260]/marc:subfield[@code='c']"/>
4344 </xsl:call-template>
4346 <xsl:variable name="controlField008-7-10"
4347 select="normalize-space(substring($controlField008, 8, 4))"/>
4348 <xsl:variable name="controlField008-11-14"
4349 select="normalize-space(substring($controlField008, 12, 4))"/>
4350 <xsl:variable name="controlField008-6"
4351 select="normalize-space(substring($controlField008, 7, 1))"/>
4353 test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
4354 <xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
4355 <dateIssued encoding="marc">
4356 <xsl:value-of select="$controlField008-7-10"/>
4361 test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
4362 <xsl:if test="$controlField008-7-10">
4363 <dateIssued encoding="marc" point="start">
4364 <xsl:value-of select="$controlField008-7-10"/>
4369 test="$controlField008-6='c' or $controlField008-6='d' or $controlField008-6='i' or $controlField008-6='k' or $controlField008-6='m' or $controlField008-6='q' or $controlField008-6='u'">
4370 <xsl:if test="$controlField008-11-14">
4371 <dateIssued encoding="marc" point="end">
4372 <xsl:value-of select="$controlField008-11-14"/>
4376 <xsl:if test="$controlField008-6='q'">
4377 <xsl:if test="$controlField008-7-10">
4378 <dateIssued encoding="marc" point="start" qualifier="questionable">
4379 <xsl:value-of select="$controlField008-7-10"/>
4383 <xsl:if test="$controlField008-6='q'">
4384 <xsl:if test="$controlField008-11-14">
4385 <dateIssued encoding="marc" point="end" qualifier="questionable">
4386 <xsl:value-of select="$controlField008-11-14"/>
4390 <xsl:if test="$controlField008-6='t'">
4391 <xsl:if test="$controlField008-11-14">
4392 <copyrightDate encoding="marc">
4393 <xsl:value-of select="$controlField008-11-14"/>
4398 select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
4399 <dateCaptured encoding="iso8601">
4400 <xsl:value-of select="."/>
4403 <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
4404 <dateCaptured encoding="iso8601" point="start">
4405 <xsl:value-of select="."/>
4408 <xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
4409 <dateCaptured encoding="iso8601" point="end">
4410 <xsl:value-of select="."/>
4413 <xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
4415 <xsl:value-of select="."/>
4418 <xsl:for-each select="marc:leader">
4422 test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'"
4423 >monographic</xsl:when>
4424 <xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'"
4425 >continuing</xsl:when>
4429 <xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
4431 <xsl:call-template name="subfieldSelect">
4432 <xsl:with-param name="codes">ab</xsl:with-param>
4433 </xsl:call-template>
4437 <xsl:variable name="controlField008-35-37"
4438 select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"/>
4439 <xsl:if test="$controlField008-35-37">
4441 <languageTerm authority="iso639-2b" type="code">
4442 <xsl:value-of select="substring($controlField008,36,3)"/>
4446 <xsl:for-each select="marc:datafield[@tag=041]">
4448 select="marc:subfield[@code='a' or @code='b' or @code='d' or @code='e' or @code='f' or @code='g' or @code='h']">
4449 <xsl:variable name="langCodes" select="."/>
4451 <xsl:when test="../marc:subfield[@code='2']='rfc3066'">
4452 <!-- not stacked but could be repeated -->
4453 <xsl:call-template name="rfcLanguages">
4454 <xsl:with-param name="nodeNum">
4455 <xsl:value-of select="1"/>
4457 <xsl:with-param name="usedLanguages">
4460 <xsl:with-param name="controlField008-35-37">
4461 <xsl:value-of select="$controlField008-35-37"/>
4463 </xsl:call-template>
4467 <xsl:variable name="allLanguages">
4468 <xsl:copy-of select="$langCodes"/>
4470 <xsl:variable name="currentLanguage">
4471 <xsl:value-of select="substring($allLanguages,1,3)"/>
4473 <xsl:call-template name="isoLanguage">
4474 <xsl:with-param name="currentLanguage">
4475 <xsl:value-of select="substring($allLanguages,1,3)"/>
4477 <xsl:with-param name="remainingLanguages">
4479 select="substring($allLanguages,4,string-length($allLanguages)-3)"
4482 <xsl:with-param name="usedLanguages">
4483 <xsl:if test="$controlField008-35-37">
4484 <xsl:value-of select="$controlField008-35-37"/>
4487 </xsl:call-template>
4492 <xsl:variable name="physicalDescription">
4493 <!--3.2 change tmee 007/11 -->
4494 <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a']">
4495 <digitalOrigin>reformatted digital</digitalOrigin>
4497 <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='b']">
4498 <digitalOrigin>digitized microfilm</digitalOrigin>
4500 <xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='d']">
4501 <digitalOrigin>digitized other analog</digitalOrigin>
4503 <xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"/>
4504 <xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
4505 <xsl:variable name="check008-23">
4507 test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
4508 <xsl:value-of select="true()"/>
4511 <xsl:variable name="check008-29">
4512 <xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
4513 <xsl:value-of select="true()"/>
4518 test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
4519 <form authority="marcform">braille</form>
4522 test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
4523 <form authority="marcform">print</form>
4526 test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
4527 <form authority="marcform">electronic</form>
4530 test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
4531 <form authority="marcform">microfiche</form>
4534 test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
4535 <form authority="marcform">microfilm</form>
4539 <xsl:if test="marc:datafield[@tag=130]/marc:subfield[@code='h']">
4540 <form authority="gmd">
4541 <xsl:call-template name="chopBrackets">
4542 <xsl:with-param name="chopString">
4543 <xsl:value-of select="marc:datafield[@tag=130]/marc:subfield[@code='h']"
4546 </xsl:call-template>
4549 <xsl:if test="marc:datafield[@tag=240]/marc:subfield[@code='h']">
4550 <form authority="gmd">
4551 <xsl:call-template name="chopBrackets">
4552 <xsl:with-param name="chopString">
4553 <xsl:value-of select="marc:datafield[@tag=240]/marc:subfield[@code='h']"
4556 </xsl:call-template>
4559 <xsl:if test="marc:datafield[@tag=242]/marc:subfield[@code='h']">
4560 <form authority="gmd">
4561 <xsl:call-template name="chopBrackets">
4562 <xsl:with-param name="chopString">
4563 <xsl:value-of select="marc:datafield[@tag=242]/marc:subfield[@code='h']"
4566 </xsl:call-template>
4569 <xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='h']">
4570 <form authority="gmd">
4571 <xsl:call-template name="chopBrackets">
4572 <xsl:with-param name="chopString">
4573 <xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='h']"
4576 </xsl:call-template>
4579 <xsl:if test="marc:datafield[@tag=246]/marc:subfield[@code='h']">
4580 <form authority="gmd">
4581 <xsl:call-template name="chopBrackets">
4582 <xsl:with-param name="chopString">
4583 <xsl:value-of select="marc:datafield[@tag=246]/marc:subfield[@code='h']"
4586 </xsl:call-template>
4589 <xsl:if test="marc:datafield[@tag=730]/marc:subfield[@code='h']">
4590 <form authority="gmd">
4591 <xsl:call-template name="chopBrackets">
4592 <xsl:with-param name="chopString">
4593 <xsl:value-of select="marc:datafield[@tag=730]/marc:subfield[@code='h']"
4596 </xsl:call-template>
4599 <xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
4601 <xsl:value-of select="."/>
4604 <xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
4606 <xsl:when test="substring(text(),14,1)='a'">
4607 <reformattingQuality>access</reformattingQuality>
4609 <xsl:when test="substring(text(),14,1)='p'">
4610 <reformattingQuality>preservation</reformattingQuality>
4612 <xsl:when test="substring(text(),14,1)='r'">
4613 <reformattingQuality>replacement</reformattingQuality>
4617 <!--3.2 change tmee 007/01 -->
4619 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='b']">
4620 <form authority="smd">chip cartridge</form>
4623 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='c']">
4624 <form authority="smd">computer optical disc cartridge</form>
4627 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='j']">
4628 <form authority="smd">magnetic disc</form>
4631 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='m']">
4632 <form authority="smd">magneto-optical disc</form>
4635 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='o']">
4636 <form authority="smd">optical disc</form>
4639 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='r']">
4640 <form authority="smd">remote</form>
4643 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='a']">
4644 <form authority="smd">tape cartridge</form>
4647 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='f']">
4648 <form authority="smd">tape cassette</form>
4651 test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='h']">
4652 <form authority="smd">tape reel</form>
4656 test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='a']">
4657 <form authority="smd">celestial globe</form>
4660 test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='e']">
4661 <form authority="smd">earth moon globe</form>
4664 test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='b']">
4665 <form authority="smd">planetary or lunar globe</form>
4668 test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='c']">
4669 <form authority="smd">terrestrial globe</form>
4673 test="marc:controlfield[@tag=007][substring(text(),1,1)='o'][substring(text(),2,1)='o']">
4674 <form authority="smd">kit</form>
4678 test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
4679 <form authority="smd">atlas</form>
4682 test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='g']">
4683 <form authority="smd">diagram</form>
4686 test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
4687 <form authority="smd">map</form>
4690 test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
4691 <form authority="smd">model</form>
4694 test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='k']">
4695 <form authority="smd">profile</form>
4698 test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
4699 <form authority="smd">remote-sensing image</form>
4702 test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='s']">
4703 <form authority="smd">section</form>
4706 test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='y']">
4707 <form authority="smd">view</form>
4711 test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='a']">
4712 <form authority="smd">aperture card</form>
4715 test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='e']">
4716 <form authority="smd">microfiche</form>
4719 test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='f']">
4720 <form authority="smd">microfiche cassette</form>
4723 test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='b']">
4724 <form authority="smd">microfilm cartridge</form>
4727 test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='c']">
4728 <form authority="smd">microfilm cassette</form>
4731 test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='d']">
4732 <form authority="smd">microfilm reel</form>
4735 test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='g']">
4736 <form authority="smd">microopaque</form>
4740 test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='c']">
4741 <form authority="smd">film cartridge</form>
4744 test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='f']">
4745 <form authority="smd">film cassette</form>
4748 test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='r']">
4749 <form authority="smd">film reel</form>
4753 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='n']">
4754 <form authority="smd">chart</form>
4757 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='c']">
4758 <form authority="smd">collage</form>
4761 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='d']">
4762 <form authority="smd">drawing</form>
4765 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='o']">
4766 <form authority="smd">flash card</form>
4769 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='e']">
4770 <form authority="smd">painting</form>
4773 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='f']">
4774 <form authority="smd">photomechanical print</form>
4777 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='g']">
4778 <form authority="smd">photonegative</form>
4781 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='h']">
4782 <form authority="smd">photoprint</form>
4785 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='i']">
4786 <form authority="smd">picture</form>
4789 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='j']">
4790 <form authority="smd">print</form>
4793 test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='l']">
4794 <form authority="smd">technical drawing</form>
4798 test="marc:controlfield[@tag=007][substring(text(),1,1)='q'][substring(text(),2,1)='q']">
4799 <form authority="smd">notated music</form>
4803 test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='d']">
4804 <form authority="smd">filmslip</form>
4807 test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='c']">
4808 <form authority="smd">filmstrip cartridge</form>
4811 test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='o']">
4812 <form authority="smd">filmstrip roll</form>
4815 test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='f']">
4816 <form authority="smd">other filmstrip type</form>
4819 test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='s']">
4820 <form authority="smd">slide</form>
4823 test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='t']">
4824 <form authority="smd">transparency</form>
4827 test="marc:controlfield[@tag=007][substring(text(),1,1)='r'][substring(text(),2,1)='r']">
4828 <form authority="smd">remote-sensing image</form>
4831 test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='e']">
4832 <form authority="smd">cylinder</form>
4835 test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='q']">
4836 <form authority="smd">roll</form>
4839 test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='g']">
4840 <form authority="smd">sound cartridge</form>
4843 test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='s']">
4844 <form authority="smd">sound cassette</form>
4847 test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='d']">
4848 <form authority="smd">sound disc</form>
4851 test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='t']">
4852 <form authority="smd">sound-tape reel</form>
4855 test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='i']">
4856 <form authority="smd">sound-track film</form>
4859 test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='w']">
4860 <form authority="smd">wire recording</form>
4864 test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='c']">
4865 <form authority="smd">braille</form>
4868 test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='b']">
4869 <form authority="smd">combination</form>
4872 test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='a']">
4873 <form authority="smd">moon</form>
4876 test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='d']">
4877 <form authority="smd">tactile, with no writing system</form>
4881 test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='c']">
4882 <form authority="smd">braille</form>
4885 test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='b']">
4886 <form authority="smd">large print</form>
4889 test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='a']">
4890 <form authority="smd">regular print</form>
4893 test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='d']">
4894 <form authority="smd">text in looseleaf binder</form>
4898 test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='c']">
4899 <form authority="smd">videocartridge</form>
4902 test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='f']">
4903 <form authority="smd">videocassette</form>
4906 test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='d']">
4907 <form authority="smd">videodisc</form>
4910 test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='r']">
4911 <form authority="smd">videoreel</form>
4915 select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)>1]">
4917 <xsl:value-of select="."/>
4918 </internetMediaType>
4920 <xsl:for-each select="marc:datafield[@tag=300]">
4922 <xsl:call-template name="subfieldSelect">
4923 <xsl:with-param name="codes">abce</xsl:with-param>
4924 </xsl:call-template>
4928 <xsl:if test="string-length(normalize-space($physicalDescription))">
4929 <physicalDescription>
4930 <xsl:copy-of select="$physicalDescription"/>
4931 </physicalDescription>
4933 <xsl:for-each select="marc:datafield[@tag=520]">
4935 <xsl:call-template name="uri"/>
4936 <xsl:call-template name="subfieldSelect">
4937 <xsl:with-param name="codes">ab</xsl:with-param>
4938 </xsl:call-template>
4941 <xsl:for-each select="marc:datafield[@tag=505]">
4943 <xsl:call-template name="uri"/>
4944 <xsl:call-template name="subfieldSelect">
4945 <xsl:with-param name="codes">agrt</xsl:with-param>
4946 </xsl:call-template>
4949 <xsl:for-each select="marc:datafield[@tag=521]">
4951 <xsl:call-template name="subfieldSelect">
4952 <xsl:with-param name="codes">ab</xsl:with-param>
4953 </xsl:call-template>
4956 <xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
4957 <xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"/>
4960 <xsl:when test="$controlField008-22='d'">
4961 <targetAudience authority="marctarget">adolescent</targetAudience>
4963 <xsl:when test="$controlField008-22='e'">
4964 <targetAudience authority="marctarget">adult</targetAudience>
4966 <xsl:when test="$controlField008-22='g'">
4967 <targetAudience authority="marctarget">general</targetAudience>
4970 test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
4971 <targetAudience authority="marctarget">juvenile</targetAudience>
4973 <xsl:when test="$controlField008-22='a'">
4974 <targetAudience authority="marctarget">preschool</targetAudience>
4976 <xsl:when test="$controlField008-22='f'">
4977 <targetAudience authority="marctarget">specialized</targetAudience>
4981 <xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
4982 <note type="statement of responsibility">
4983 <xsl:value-of select="."/>
4986 <xsl:for-each select="marc:datafield[@tag=500]">
4988 <xsl:value-of select="marc:subfield[@code='a']"/>
4989 <xsl:call-template name="uri"/>
4993 <!--3.2 change tmee additional note fields-->
4995 <xsl:for-each select="marc:datafield[@tag=506]">
4996 <note type="restrictions">
4997 <xsl:call-template name="uri"/>
4998 <xsl:variable name="str">
4999 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
5000 <xsl:value-of select="."/>
5001 <xsl:text> </xsl:text>
5004 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
5008 <xsl:for-each select="marc:datafield[@tag=510]">
5009 <note type="citation/reference">
5010 <xsl:call-template name="uri"/>
5011 <xsl:variable name="str">
5012 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
5013 <xsl:value-of select="."/>
5014 <xsl:text> </xsl:text>
5017 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
5022 <xsl:for-each select="marc:datafield[@tag=511]">
5023 <note type="performers">
5024 <xsl:call-template name="uri"/>
5025 <xsl:value-of select="marc:subfield[@code='a']"/>
5028 <xsl:for-each select="marc:datafield[@tag=518]">
5030 <xsl:call-template name="uri"/>
5031 <xsl:value-of select="marc:subfield[@code='a']"/>
5035 <xsl:for-each select="marc:datafield[@tag=530]">
5036 <note type="additional physical form">
5037 <xsl:call-template name="uri"/>
5038 <xsl:variable name="str">
5039 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
5040 <xsl:value-of select="."/>
5041 <xsl:text> </xsl:text>
5044 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
5048 <xsl:for-each select="marc:datafield[@tag=533]">
5049 <note type="reproduction">
5050 <xsl:call-template name="uri"/>
5051 <xsl:variable name="str">
5052 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
5053 <xsl:value-of select="."/>
5054 <xsl:text> </xsl:text>
5057 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
5061 <xsl:for-each select="marc:datafield[@tag=534]">
5062 <note type="original version">
5063 <xsl:call-template name="uri"/>
5064 <xsl:variable name="str">
5065 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
5066 <xsl:value-of select="."/>
5067 <xsl:text> </xsl:text>
5070 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
5074 <xsl:for-each select="marc:datafield[@tag=538]">
5075 <note type="system details">
5076 <xsl:call-template name="uri"/>
5077 <xsl:variable name="str">
5078 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
5079 <xsl:value-of select="."/>
5080 <xsl:text> </xsl:text>
5083 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
5087 <xsl:for-each select="marc:datafield[@tag=583]">
5088 <note type="action">
5089 <xsl:call-template name="uri"/>
5090 <xsl:variable name="str">
5091 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
5092 <xsl:value-of select="."/>
5093 <xsl:text> </xsl:text>
5096 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
5101 select="marc:datafield[@tag=501 or @tag=502 or @tag=504 or @tag=507 or @tag=508 or @tag=513 or @tag=514 or @tag=515 or @tag=516 or @tag=522 or @tag=524 or @tag=525 or @tag=526 or @tag=535 or @tag=536 or @tag=540 or @tag=541 or @tag=544 or @tag=545 or @tag=546 or @tag=547 or @tag=550 or @tag=552 or @tag=555 or @tag=556 or @tag=561 or @tag=562 or @tag=565 or @tag=567 or @tag=580 or @tag=581 or @tag=584 or @tag=585 or @tag=586]">
5103 <xsl:call-template name="uri"/>
5104 <xsl:variable name="str">
5105 <xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
5106 <xsl:value-of select="."/>
5107 <xsl:text> </xsl:text>
5110 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
5114 select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
5118 <xsl:call-template name="subfieldSelect">
5119 <xsl:with-param name="codes">defg</xsl:with-param>
5120 </xsl:call-template>
5125 <xsl:for-each select="marc:datafield[@tag=043]">
5127 <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
5129 <xsl:attribute name="authority">
5130 <xsl:if test="@code='a'">
5131 <xsl:text>marcgac</xsl:text>
5133 <xsl:if test="@code='b'">
5134 <xsl:value-of select="following-sibling::marc:subfield[@code=2]"/>
5136 <xsl:if test="@code='c'">
5137 <xsl:text>iso3166</xsl:text>
5140 <xsl:value-of select="self::marc:subfield"/>
5145 <!-- tmee 2006/11/27 -->
5146 <xsl:for-each select="marc:datafield[@tag=255]">
5148 <xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
5150 <xsl:if test="@code='a'">
5152 <xsl:value-of select="."/>
5155 <xsl:if test="@code='b'">
5157 <xsl:value-of select="."/>
5160 <xsl:if test="@code='c'">
5162 <xsl:value-of select="."/>
5170 <xsl:apply-templates select="marc:datafield[653 >= @tag and @tag >= 600]"/>
5171 <xsl:apply-templates select="marc:datafield[@tag=656]"/>
5172 <xsl:for-each select="marc:datafield[@tag=752 or @tag=662]">
5174 <hierarchicalGeographic>
5175 <xsl:for-each select="marc:subfield[@code='a']">
5177 <xsl:call-template name="chopPunctuation">
5178 <xsl:with-param name="chopString" select="."/>
5179 </xsl:call-template>
5182 <xsl:for-each select="marc:subfield[@code='b']">
5184 <xsl:call-template name="chopPunctuation">
5185 <xsl:with-param name="chopString" select="."/>
5186 </xsl:call-template>
5189 <xsl:for-each select="marc:subfield[@code='c']">
5191 <xsl:call-template name="chopPunctuation">
5192 <xsl:with-param name="chopString" select="."/>
5193 </xsl:call-template>
5196 <xsl:for-each select="marc:subfield[@code='d']">
5198 <xsl:call-template name="chopPunctuation">
5199 <xsl:with-param name="chopString" select="."/>
5200 </xsl:call-template>
5203 <xsl:for-each select="marc:subfield[@code='e']">
5205 <xsl:call-template name="chopPunctuation">
5206 <xsl:with-param name="chopString" select="."/>
5207 </xsl:call-template>
5210 <xsl:for-each select="marc:subfield[@code='g']">
5212 <xsl:call-template name="chopPunctuation">
5213 <xsl:with-param name="chopString" select="."/>
5214 </xsl:call-template>
5217 <xsl:for-each select="marc:subfield[@code='h']">
5218 <extraterrestrialArea>
5219 <xsl:call-template name="chopPunctuation">
5220 <xsl:with-param name="chopString" select="."/>
5221 </xsl:call-template>
5222 </extraterrestrialArea>
5224 </hierarchicalGeographic>
5227 <xsl:for-each select="marc:datafield[@tag=045][marc:subfield[@code='b']]">
5230 <xsl:when test="@ind1=2">
5231 <temporal encoding="iso8601" point="start">
5232 <xsl:call-template name="chopPunctuation">
5233 <xsl:with-param name="chopString">
5234 <xsl:value-of select="marc:subfield[@code='b'][1]"/>
5236 </xsl:call-template>
5238 <temporal encoding="iso8601" point="end">
5239 <xsl:call-template name="chopPunctuation">
5240 <xsl:with-param name="chopString">
5241 <xsl:value-of select="marc:subfield[@code='b'][2]"/>
5243 </xsl:call-template>
5247 <xsl:for-each select="marc:subfield[@code='b']">
5248 <temporal encoding="iso8601">
5249 <xsl:call-template name="chopPunctuation">
5250 <xsl:with-param name="chopString" select="."/>
5251 </xsl:call-template>
5258 <xsl:for-each select="marc:datafield[@tag=050]">
5259 <xsl:for-each select="marc:subfield[@code='b']">
5260 <classification authority="lcc">
5261 <xsl:if test="../marc:subfield[@code='3']">
5262 <xsl:attribute name="displayLabel">
5263 <xsl:value-of select="../marc:subfield[@code='3']"/>
5266 <xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"/>
5267 <xsl:text> </xsl:text>
5268 <xsl:value-of select="text()"/>
5272 select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
5273 <classification authority="lcc">
5274 <xsl:if test="../marc:subfield[@code='3']">
5275 <xsl:attribute name="displayLabel">
5276 <xsl:value-of select="../marc:subfield[@code='3']"/>
5279 <xsl:value-of select="text()"/>
5283 <xsl:for-each select="marc:datafield[@tag=082]">
5284 <classification authority="ddc">
5285 <xsl:if test="marc:subfield[@code='2']">
5286 <xsl:attribute name="edition">
5287 <xsl:value-of select="marc:subfield[@code='2']"/>
5290 <xsl:call-template name="subfieldSelect">
5291 <xsl:with-param name="codes">ab</xsl:with-param>
5292 </xsl:call-template>
5295 <xsl:for-each select="marc:datafield[@tag=080]">
5296 <classification authority="udc">
5297 <xsl:call-template name="subfieldSelect">
5298 <xsl:with-param name="codes">abx</xsl:with-param>
5299 </xsl:call-template>
5302 <xsl:for-each select="marc:datafield[@tag=060]">
5303 <classification authority="nlm">
5304 <xsl:call-template name="subfieldSelect">
5305 <xsl:with-param name="codes">ab</xsl:with-param>
5306 </xsl:call-template>
5309 <xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
5310 <classification authority="sudocs">
5311 <xsl:value-of select="marc:subfield[@code='a']"/>
5314 <xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
5315 <classification authority="candoc">
5316 <xsl:value-of select="marc:subfield[@code='a']"/>
5319 <xsl:for-each select="marc:datafield[@tag=086]">
5321 <xsl:attribute name="authority">
5322 <xsl:value-of select="marc:subfield[@code='2']"/>
5324 <xsl:value-of select="marc:subfield[@code='a']"/>
5327 <xsl:for-each select="marc:datafield[@tag=084]">
5329 <xsl:attribute name="authority">
5330 <xsl:value-of select="marc:subfield[@code='2']"/>
5332 <xsl:call-template name="subfieldSelect">
5333 <xsl:with-param name="codes">ab</xsl:with-param>
5334 </xsl:call-template>
5337 <xsl:for-each select="marc:datafield[@tag=440]">
5338 <relatedItem type="series">
5341 <xsl:call-template name="chopPunctuation">
5342 <xsl:with-param name="chopString">
5343 <xsl:call-template name="subfieldSelect">
5344 <xsl:with-param name="codes">av</xsl:with-param>
5345 </xsl:call-template>
5347 </xsl:call-template>
5349 <xsl:call-template name="part"/>
5353 <xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
5354 <relatedItem type="series">
5357 <xsl:call-template name="chopPunctuation">
5358 <xsl:with-param name="chopString">
5359 <xsl:call-template name="subfieldSelect">
5360 <xsl:with-param name="codes">av</xsl:with-param>
5361 </xsl:call-template>
5363 </xsl:call-template>
5365 <xsl:call-template name="part"/>
5369 <xsl:for-each select="marc:datafield[@tag=510]">
5370 <relatedItem type="isReferencedBy">
5372 <xsl:call-template name="subfieldSelect">
5373 <xsl:with-param name="codes">abcx3</xsl:with-param>
5374 </xsl:call-template>
5378 <xsl:for-each select="marc:datafield[@tag=534]">
5379 <relatedItem type="original">
5380 <xsl:call-template name="relatedTitle"/>
5381 <xsl:call-template name="relatedName"/>
5382 <xsl:if test="marc:subfield[@code='b' or @code='c']">
5384 <xsl:for-each select="marc:subfield[@code='c']">
5386 <xsl:value-of select="."/>
5389 <xsl:for-each select="marc:subfield[@code='b']">
5391 <xsl:value-of select="."/>
5396 <xsl:call-template name="relatedIdentifierISSN"/>
5397 <xsl:for-each select="marc:subfield[@code='z']">
5398 <identifier type="isbn">
5399 <xsl:value-of select="."/>
5402 <xsl:call-template name="relatedNote"/>
5405 <xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
5407 <xsl:call-template name="constituentOrRelatedType"/>
5410 <xsl:call-template name="chopPunctuation">
5411 <xsl:with-param name="chopString">
5412 <xsl:call-template name="specialSubfieldSelect">
5413 <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
5414 <xsl:with-param name="axis">t</xsl:with-param>
5415 <xsl:with-param name="afterCodes">g</xsl:with-param>
5416 </xsl:call-template>
5418 </xsl:call-template>
5420 <xsl:call-template name="part"/>
5422 <name type="personal">
5424 <xsl:call-template name="specialSubfieldSelect">
5425 <xsl:with-param name="anyCodes">aq</xsl:with-param>
5426 <xsl:with-param name="axis">t</xsl:with-param>
5427 <xsl:with-param name="beforeCodes">g</xsl:with-param>
5428 </xsl:call-template>
5430 <xsl:call-template name="termsOfAddress"/>
5431 <xsl:call-template name="nameDate"/>
5432 <xsl:call-template name="role"/>
5434 <xsl:call-template name="relatedForm"/>
5435 <xsl:call-template name="relatedIdentifierISSN"/>
5438 <xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
5440 <xsl:call-template name="constituentOrRelatedType"/>
5443 <xsl:call-template name="chopPunctuation">
5444 <xsl:with-param name="chopString">
5445 <xsl:call-template name="specialSubfieldSelect">
5446 <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
5447 <xsl:with-param name="axis">t</xsl:with-param>
5448 <xsl:with-param name="afterCodes">dg</xsl:with-param>
5449 </xsl:call-template>
5451 </xsl:call-template>
5453 <xsl:call-template name="relatedPartNumName"/>
5455 <name type="corporate">
5456 <xsl:for-each select="marc:subfield[@code='a']">
5458 <xsl:value-of select="."/>
5461 <xsl:for-each select="marc:subfield[@code='b']">
5463 <xsl:value-of select="."/>
5466 <xsl:variable name="tempNamePart">
5467 <xsl:call-template name="specialSubfieldSelect">
5468 <xsl:with-param name="anyCodes">c</xsl:with-param>
5469 <xsl:with-param name="axis">t</xsl:with-param>
5470 <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
5471 </xsl:call-template>
5473 <xsl:if test="normalize-space($tempNamePart)">
5475 <xsl:value-of select="$tempNamePart"/>
5478 <xsl:call-template name="role"/>
5480 <xsl:call-template name="relatedForm"/>
5481 <xsl:call-template name="relatedIdentifierISSN"/>
5484 <xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
5486 <xsl:call-template name="constituentOrRelatedType"/>
5489 <xsl:call-template name="chopPunctuation">
5490 <xsl:with-param name="chopString">
5491 <xsl:call-template name="specialSubfieldSelect">
5492 <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
5493 <xsl:with-param name="axis">t</xsl:with-param>
5494 <xsl:with-param name="afterCodes">g</xsl:with-param>
5495 </xsl:call-template>
5497 </xsl:call-template>
5499 <xsl:call-template name="relatedPartNumName"/>
5501 <name type="conference">
5503 <xsl:call-template name="specialSubfieldSelect">
5504 <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
5505 <xsl:with-param name="axis">t</xsl:with-param>
5506 <xsl:with-param name="beforeCodes">gn</xsl:with-param>
5507 </xsl:call-template>
5510 <xsl:call-template name="relatedForm"/>
5511 <xsl:call-template name="relatedIdentifierISSN"/>
5514 <xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
5516 <xsl:call-template name="constituentOrRelatedType"/>
5519 <xsl:call-template name="chopPunctuation">
5520 <xsl:with-param name="chopString">
5521 <xsl:call-template name="subfieldSelect">
5522 <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
5523 </xsl:call-template>
5525 </xsl:call-template>
5527 <xsl:call-template name="part"/>
5529 <xsl:call-template name="relatedForm"/>
5530 <xsl:call-template name="relatedIdentifierISSN"/>
5533 <xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
5535 <xsl:call-template name="constituentOrRelatedType"/>
5538 <xsl:call-template name="chopPunctuation">
5539 <xsl:with-param name="chopString">
5540 <xsl:value-of select="marc:subfield[@code='a']"/>
5542 </xsl:call-template>
5544 <xsl:call-template name="part"/>
5546 <xsl:call-template name="relatedForm"/>
5549 <xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
5550 <relatedItem type="series">
5551 <xsl:call-template name="relatedItem76X-78X"/>
5555 select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
5557 <xsl:call-template name="relatedItem76X-78X"/>
5560 <xsl:for-each select="marc:datafield[@tag=775]">
5561 <relatedItem type="otherVersion">
5562 <xsl:call-template name="relatedItem76X-78X"/>
5565 <xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
5566 <relatedItem type="constituent">
5567 <xsl:call-template name="relatedItem76X-78X"/>
5570 <xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
5571 <relatedItem type="host">
5572 <xsl:call-template name="relatedItem76X-78X"/>
5575 <xsl:for-each select="marc:datafield[@tag=776]">
5576 <relatedItem type="otherFormat">
5577 <xsl:call-template name="relatedItem76X-78X"/>
5580 <xsl:for-each select="marc:datafield[@tag=780]">
5581 <relatedItem type="preceding">
5582 <xsl:call-template name="relatedItem76X-78X"/>
5585 <xsl:for-each select="marc:datafield[@tag=785]">
5586 <relatedItem type="succeeding">
5587 <xsl:call-template name="relatedItem76X-78X"/>
5590 <xsl:for-each select="marc:datafield[@tag=786]">
5591 <relatedItem type="original">
5592 <xsl:call-template name="relatedItem76X-78X"/>
5595 <xsl:for-each select="marc:datafield[@tag=800]">
5596 <relatedItem type="series">
5599 <xsl:call-template name="chopPunctuation">
5600 <xsl:with-param name="chopString">
5601 <xsl:call-template name="specialSubfieldSelect">
5602 <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
5603 <xsl:with-param name="axis">t</xsl:with-param>
5604 <xsl:with-param name="afterCodes">g</xsl:with-param>
5605 </xsl:call-template>
5607 </xsl:call-template>
5609 <xsl:call-template name="part"/>
5611 <name type="personal">
5613 <xsl:call-template name="chopPunctuation">
5614 <xsl:with-param name="chopString">
5615 <xsl:call-template name="specialSubfieldSelect">
5616 <xsl:with-param name="anyCodes">aq</xsl:with-param>
5617 <xsl:with-param name="axis">t</xsl:with-param>
5618 <xsl:with-param name="beforeCodes">g</xsl:with-param>
5619 </xsl:call-template>
5621 </xsl:call-template>
5623 <xsl:call-template name="termsOfAddress"/>
5624 <xsl:call-template name="nameDate"/>
5625 <xsl:call-template name="role"/>
5627 <xsl:call-template name="relatedForm"/>
5630 <xsl:for-each select="marc:datafield[@tag=810]">
5631 <relatedItem type="series">
5634 <xsl:call-template name="chopPunctuation">
5635 <xsl:with-param name="chopString">
5636 <xsl:call-template name="specialSubfieldSelect">
5637 <xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
5638 <xsl:with-param name="axis">t</xsl:with-param>
5639 <xsl:with-param name="afterCodes">dg</xsl:with-param>
5640 </xsl:call-template>
5642 </xsl:call-template>
5644 <xsl:call-template name="relatedPartNumName"/>
5646 <name type="corporate">
5647 <xsl:for-each select="marc:subfield[@code='a']">
5649 <xsl:value-of select="."/>
5652 <xsl:for-each select="marc:subfield[@code='b']">
5654 <xsl:value-of select="."/>
5658 <xsl:call-template name="specialSubfieldSelect">
5659 <xsl:with-param name="anyCodes">c</xsl:with-param>
5660 <xsl:with-param name="axis">t</xsl:with-param>
5661 <xsl:with-param name="beforeCodes">dgn</xsl:with-param>
5662 </xsl:call-template>
5664 <xsl:call-template name="role"/>
5666 <xsl:call-template name="relatedForm"/>
5669 <xsl:for-each select="marc:datafield[@tag=811]">
5670 <relatedItem type="series">
5673 <xsl:call-template name="chopPunctuation">
5674 <xsl:with-param name="chopString">
5675 <xsl:call-template name="specialSubfieldSelect">
5676 <xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
5677 <xsl:with-param name="axis">t</xsl:with-param>
5678 <xsl:with-param name="afterCodes">g</xsl:with-param>
5679 </xsl:call-template>
5681 </xsl:call-template>
5683 <xsl:call-template name="relatedPartNumName"/>
5685 <name type="conference">
5687 <xsl:call-template name="specialSubfieldSelect">
5688 <xsl:with-param name="anyCodes">aqdc</xsl:with-param>
5689 <xsl:with-param name="axis">t</xsl:with-param>
5690 <xsl:with-param name="beforeCodes">gn</xsl:with-param>
5691 </xsl:call-template>
5693 <xsl:call-template name="role"/>
5695 <xsl:call-template name="relatedForm"/>
5698 <xsl:for-each select="marc:datafield[@tag='830']">
5699 <relatedItem type="series">
5702 <xsl:call-template name="chopPunctuation">
5703 <xsl:with-param name="chopString">
5704 <xsl:call-template name="subfieldSelect">
5705 <xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
5706 </xsl:call-template>
5708 </xsl:call-template>
5710 <xsl:call-template name="part"/>
5712 <xsl:call-template name="relatedForm"/>
5715 <xsl:for-each select="marc:datafield[@tag='856'][@ind2='2']/marc:subfield[@code='q']">
5718 <xsl:value-of select="."/>
5719 </internetMediaType>
5722 <xsl:for-each select="marc:datafield[@tag='020']">
5723 <xsl:call-template name="isInvalid">
5724 <xsl:with-param name="type">isbn</xsl:with-param>
5725 </xsl:call-template>
5726 <xsl:if test="marc:subfield[@code='a']">
5727 <identifier type="isbn">
5728 <xsl:value-of select="marc:subfield[@code='a']"/>
5732 <xsl:for-each select="marc:datafield[@tag='024'][@ind1='0']">
5733 <xsl:call-template name="isInvalid">
5734 <xsl:with-param name="type">isrc</xsl:with-param>
5735 </xsl:call-template>
5736 <xsl:if test="marc:subfield[@code='a']">
5737 <identifier type="isrc">
5738 <xsl:value-of select="marc:subfield[@code='a']"/>
5742 <xsl:for-each select="marc:datafield[@tag='024'][@ind1='2']">
5743 <xsl:call-template name="isInvalid">
5744 <xsl:with-param name="type">ismn</xsl:with-param>
5745 </xsl:call-template>
5746 <xsl:if test="marc:subfield[@code='a']">
5747 <identifier type="ismn">
5748 <xsl:value-of select="marc:subfield[@code='a']"/>
5752 <xsl:for-each select="marc:datafield[@tag='024'][@ind1='4']">
5753 <xsl:call-template name="isInvalid">
5754 <xsl:with-param name="type">sici</xsl:with-param>
5755 </xsl:call-template>
5756 <identifier type="sici">
5757 <xsl:call-template name="subfieldSelect">
5758 <xsl:with-param name="codes">ab</xsl:with-param>
5759 </xsl:call-template>
5762 <xsl:for-each select="marc:datafield[@tag='022']">
5763 <xsl:if test="marc:subfield[@code='a']">
5764 <xsl:call-template name="isInvalid">
5765 <xsl:with-param name="type">issn</xsl:with-param>
5766 </xsl:call-template>
5767 <identifier type="issn">
5768 <xsl:value-of select="marc:subfield[@code='a']"/>
5771 <xsl:if test="marc:subfield[@code='l']">
5772 <xsl:call-template name="isInvalid">
5773 <xsl:with-param name="type">issn-l</xsl:with-param>
5774 </xsl:call-template>
5775 <identifier type="issn-l">
5776 <xsl:value-of select="marc:subfield[@code='l']"/>
5783 <xsl:for-each select="marc:datafield[@tag='010']">
5784 <xsl:call-template name="isInvalid">
5785 <xsl:with-param name="type">lccn</xsl:with-param>
5786 </xsl:call-template>
5787 <identifier type="lccn">
5788 <xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
5791 <xsl:for-each select="marc:datafield[@tag='028']">
5793 <xsl:attribute name="type">
5795 <xsl:when test="@ind1='0'">issue number</xsl:when>
5796 <xsl:when test="@ind1='1'">matrix number</xsl:when>
5797 <xsl:when test="@ind1='2'">music plate</xsl:when>
5798 <xsl:when test="@ind1='3'">music publisher</xsl:when>
5799 <xsl:when test="@ind1='4'">videorecording identifier</xsl:when>
5802 <!--<xsl:call-template name="isInvalid"/>-->
5803 <!-- no $z in 028 -->
5804 <xsl:call-template name="subfieldSelect">
5805 <xsl:with-param name="codes">
5807 <xsl:when test="@ind1='0'">ba</xsl:when>
5808 <xsl:otherwise>ab</xsl:otherwise>
5811 </xsl:call-template>
5814 <xsl:for-each select="marc:datafield[@tag='037']">
5815 <identifier type="stock number">
5816 <!--<xsl:call-template name="isInvalid"/>-->
5817 <!-- no $z in 037 -->
5818 <xsl:call-template name="subfieldSelect">
5819 <xsl:with-param name="codes">ab</xsl:with-param>
5820 </xsl:call-template>
5823 <xsl:for-each select="marc:datafield[@tag='856'][marc:subfield[@code='u']]">
5825 <xsl:attribute name="type">
5828 test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi')"
5831 test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov')"
5833 <xsl:otherwise>uri</xsl:otherwise>
5838 test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl') or starts-with(marc:subfield[@code='u'],'http://hdl.loc.gov') ">
5840 select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"
5844 <xsl:value-of select="marc:subfield[@code='u']"/>
5849 test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl')">
5850 <identifier type="hdl">
5851 <xsl:if test="marc:subfield[@code='y' or @code='3' or @code='z']">
5852 <xsl:attribute name="displayLabel">
5853 <xsl:call-template name="subfieldSelect">
5854 <xsl:with-param name="codes">y3z</xsl:with-param>
5855 </xsl:call-template>
5859 select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"
5864 <xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
5865 <identifier type="upc">
5866 <xsl:call-template name="isInvalid"/>
5867 <xsl:value-of select="marc:subfield[@code='a']"/>
5871 <!-- 1/04 fix added $y -->
5874 <xsl:for-each select="marc:datafield[@tag=856][@ind2=1][marc:subfield[@code='u']]">
5875 <relatedItem type="otherVersion">
5878 <xsl:if test="marc:subfield[@code='y' or @code='3']">
5879 <xsl:attribute name="displayLabel">
5880 <xsl:call-template name="subfieldSelect">
5881 <xsl:with-param name="codes">y3</xsl:with-param>
5882 </xsl:call-template>
5885 <xsl:if test="marc:subfield[@code='z' ]">
5886 <xsl:attribute name="note">
5887 <xsl:call-template name="subfieldSelect">
5888 <xsl:with-param name="codes">z</xsl:with-param>
5889 </xsl:call-template>
5892 <xsl:value-of select="marc:subfield[@code='u']"/>
5897 <xsl:for-each select="marc:datafield[@tag=856][@ind2=2][marc:subfield[@code='u']]">
5901 <xsl:if test="marc:subfield[@code='y' or @code='3']">
5902 <xsl:attribute name="displayLabel">
5903 <xsl:call-template name="subfieldSelect">
5904 <xsl:with-param name="codes">y3</xsl:with-param>
5905 </xsl:call-template>
5908 <xsl:if test="marc:subfield[@code='z' ]">
5909 <xsl:attribute name="note">
5910 <xsl:call-template name="subfieldSelect">
5911 <xsl:with-param name="codes">z</xsl:with-param>
5912 </xsl:call-template>
5915 <xsl:value-of select="marc:subfield[@code='u']"/>
5921 <!-- 3.2 change tmee 856z -->
5924 <xsl:for-each select="marc:datafield[@tag=852]">
5926 <xsl:if test="marc:subfield[@code='a' or @code='b' or @code='e']">
5928 <xsl:call-template name="subfieldSelect">
5929 <xsl:with-param name="codes">abe</xsl:with-param>
5930 </xsl:call-template>
5934 <xsl:if test="marc:subfield[@code='u']">
5936 <xsl:call-template name="uri"/>
5937 <xsl:call-template name="subfieldSelect">
5938 <xsl:with-param name="codes">u</xsl:with-param>
5939 </xsl:call-template>
5944 test="marc:subfield[@code='h' or @code='i' or @code='j' or @code='k' or @code='l' or @code='m' or @code='t']">
5946 <xsl:call-template name="subfieldSelect">
5947 <xsl:with-param name="codes">hijklmt</xsl:with-param>
5948 </xsl:call-template>
5954 <xsl:for-each select="marc:datafield[@tag=506]">
5955 <accessCondition type="restrictionOnAccess">
5956 <xsl:call-template name="subfieldSelect">
5957 <xsl:with-param name="codes">abcd35</xsl:with-param>
5958 </xsl:call-template>
5961 <xsl:for-each select="marc:datafield[@tag=540]">
5962 <accessCondition type="useAndReproduction">
5963 <xsl:call-template name="subfieldSelect">
5964 <xsl:with-param name="codes">abcde35</xsl:with-param>
5965 </xsl:call-template>
5973 <xsl:for-each select="marc:leader[substring($leader,19,1)='a']">
5974 <descriptionStandard>aacr2</descriptionStandard>
5977 <xsl:for-each select="marc:datafield[@tag=040]">
5978 <xsl:if test="marc:subfield[@code='e']">
5979 <descriptionStandard>
5980 <xsl:value-of select="marc:subfield[@code='e']"/>
5981 </descriptionStandard>
5983 <recordContentSource authority="marcorg">
5984 <xsl:value-of select="marc:subfield[@code='a']"/>
5985 </recordContentSource>
5987 <xsl:for-each select="marc:controlfield[@tag=008]">
5988 <recordCreationDate encoding="marc">
5989 <xsl:value-of select="substring(.,1,6)"/>
5990 </recordCreationDate>
5993 <xsl:for-each select="marc:controlfield[@tag=005]">
5994 <recordChangeDate encoding="iso8601">
5995 <xsl:value-of select="."/>
5998 <xsl:for-each select="marc:controlfield[@tag=001]">
6000 <xsl:if test="../marc:controlfield[@tag=003]">
6001 <xsl:attribute name="source">
6002 <xsl:value-of select="../marc:controlfield[@tag=003]"/>
6005 <xsl:value-of select="."/>
6008 <xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
6009 <languageOfCataloging>
6010 <languageTerm authority="iso639-2b" type="code">
6011 <xsl:value-of select="."/>
6013 </languageOfCataloging>
6017 <xsl:template name="displayForm">
6018 <xsl:for-each select="marc:subfield[@code='c']">
6020 <xsl:value-of select="."/>
6024 <xsl:template name="affiliation">
6025 <xsl:for-each select="marc:subfield[@code='u']">
6027 <xsl:value-of select="."/>
6031 <xsl:template name="uri">
6032 <xsl:for-each select="marc:subfield[@code='u']">
6033 <xsl:attribute name="xlink:href">
6034 <xsl:value-of select="."/>
6037 <xsl:for-each select="marc:subfield[@code='0']">
6039 <xsl:when test="contains(text(), ')')">
6040 <xsl:attribute name="xlink:href">
6041 <xsl:value-of select="substring-after(text(), ')')"></xsl:value-of>
6045 <xsl:attribute name="xlink:href">
6046 <xsl:value-of select="."></xsl:value-of>
6052 <xsl:template name="role">
6053 <xsl:for-each select="marc:subfield[@code='e']">
6055 <roleTerm type="text">
6056 <xsl:value-of select="."/>
6060 <xsl:for-each select="marc:subfield[@code='4']">
6062 <roleTerm authority="marcrelator" type="code">
6063 <xsl:value-of select="."/>
6068 <xsl:template name="part">
6069 <xsl:variable name="partNumber">
6070 <xsl:call-template name="specialSubfieldSelect">
6071 <xsl:with-param name="axis">n</xsl:with-param>
6072 <xsl:with-param name="anyCodes">n</xsl:with-param>
6073 <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
6074 </xsl:call-template>
6076 <xsl:variable name="partName">
6077 <xsl:call-template name="specialSubfieldSelect">
6078 <xsl:with-param name="axis">p</xsl:with-param>
6079 <xsl:with-param name="anyCodes">p</xsl:with-param>
6080 <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
6081 </xsl:call-template>
6083 <xsl:if test="string-length(normalize-space($partNumber))">
6085 <xsl:call-template name="chopPunctuation">
6086 <xsl:with-param name="chopString" select="$partNumber"/>
6087 </xsl:call-template>
6090 <xsl:if test="string-length(normalize-space($partName))">
6092 <xsl:call-template name="chopPunctuation">
6093 <xsl:with-param name="chopString" select="$partName"/>
6094 </xsl:call-template>
6098 <xsl:template name="relatedPart">
6099 <xsl:if test="@tag=773">
6100 <xsl:for-each select="marc:subfield[@code='g']">
6103 <xsl:value-of select="."/>
6107 <xsl:for-each select="marc:subfield[@code='q']">
6109 <xsl:call-template name="parsePart"/>
6114 <xsl:template name="relatedPartNumName">
6115 <xsl:variable name="partNumber">
6116 <xsl:call-template name="specialSubfieldSelect">
6117 <xsl:with-param name="axis">g</xsl:with-param>
6118 <xsl:with-param name="anyCodes">g</xsl:with-param>
6119 <xsl:with-param name="afterCodes">pst</xsl:with-param>
6120 </xsl:call-template>
6122 <xsl:variable name="partName">
6123 <xsl:call-template name="specialSubfieldSelect">
6124 <xsl:with-param name="axis">p</xsl:with-param>
6125 <xsl:with-param name="anyCodes">p</xsl:with-param>
6126 <xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
6127 </xsl:call-template>
6129 <xsl:if test="string-length(normalize-space($partNumber))">
6131 <xsl:value-of select="$partNumber"/>
6134 <xsl:if test="string-length(normalize-space($partName))">
6136 <xsl:value-of select="$partName"/>
6140 <xsl:template name="relatedName">
6141 <xsl:for-each select="marc:subfield[@code='a']">
6144 <xsl:value-of select="."/>
6149 <xsl:template name="relatedForm">
6150 <xsl:for-each select="marc:subfield[@code='h']">
6151 <physicalDescription>
6153 <xsl:value-of select="."/>
6155 </physicalDescription>
6158 <xsl:template name="relatedExtent">
6159 <xsl:for-each select="marc:subfield[@code='h']">
6160 <physicalDescription>
6162 <xsl:value-of select="."/>
6164 </physicalDescription>
6167 <xsl:template name="relatedNote">
6168 <xsl:for-each select="marc:subfield[@code='n']">
6170 <xsl:value-of select="."/>
6174 <xsl:template name="relatedSubject">
6175 <xsl:for-each select="marc:subfield[@code='j']">
6177 <temporal encoding="iso8601">
6178 <xsl:call-template name="chopPunctuation">
6179 <xsl:with-param name="chopString" select="."/>
6180 </xsl:call-template>
6185 <xsl:template name="relatedIdentifierISSN">
6186 <xsl:for-each select="marc:subfield[@code='x']">
6187 <identifier type="issn">
6188 <xsl:value-of select="."/>
6192 <xsl:template name="relatedIdentifierLocal">
6193 <xsl:for-each select="marc:subfield[@code='w']">
6194 <identifier type="local">
6195 <xsl:value-of select="."/>
6199 <xsl:template name="relatedIdentifier">
6200 <xsl:for-each select="marc:subfield[@code='o']">
6202 <xsl:value-of select="."/>
6206 <xsl:template name="relatedItem76X-78X">
6207 <xsl:call-template name="displayLabel"/>
6208 <xsl:call-template name="relatedTitle76X-78X"/>
6209 <xsl:call-template name="relatedName"/>
6210 <xsl:call-template name="relatedOriginInfo"/>
6211 <xsl:call-template name="relatedLanguage"/>
6212 <xsl:call-template name="relatedExtent"/>
6213 <xsl:call-template name="relatedNote"/>
6214 <xsl:call-template name="relatedSubject"/>
6215 <xsl:call-template name="relatedIdentifier"/>
6216 <xsl:call-template name="relatedIdentifierISSN"/>
6217 <xsl:call-template name="relatedIdentifierLocal"/>
6218 <xsl:call-template name="relatedPart"/>
6220 <xsl:template name="subjectGeographicZ">
6222 <xsl:call-template name="chopPunctuation">
6223 <xsl:with-param name="chopString" select="."/>
6224 </xsl:call-template>
6227 <xsl:template name="subjectTemporalY">
6229 <xsl:call-template name="chopPunctuation">
6230 <xsl:with-param name="chopString" select="."/>
6231 </xsl:call-template>
6234 <xsl:template name="subjectTopic">
6236 <xsl:call-template name="chopPunctuation">
6237 <xsl:with-param name="chopString" select="."/>
6238 </xsl:call-template>
6241 <!-- 3.2 change tmee 6xx $v genre -->
6242 <xsl:template name="subjectGenre">
6244 <xsl:call-template name="chopPunctuation">
6245 <xsl:with-param name="chopString" select="."/>
6246 </xsl:call-template>
6250 <xsl:template name="nameABCDN">
6251 <xsl:for-each select="marc:subfield[@code='a']">
6253 <xsl:call-template name="chopPunctuation">
6254 <xsl:with-param name="chopString" select="."/>
6255 </xsl:call-template>
6258 <xsl:for-each select="marc:subfield[@code='b']">
6260 <xsl:value-of select="."/>
6264 test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
6266 <xsl:call-template name="subfieldSelect">
6267 <xsl:with-param name="codes">cdn</xsl:with-param>
6268 </xsl:call-template>
6272 <xsl:template name="nameABCDQ">
6274 <xsl:call-template name="chopPunctuation">
6275 <xsl:with-param name="chopString">
6276 <xsl:call-template name="subfieldSelect">
6277 <xsl:with-param name="codes">aq</xsl:with-param>
6278 </xsl:call-template>
6280 <xsl:with-param name="punctuation">
6281 <xsl:text>:,;/ </xsl:text>
6283 </xsl:call-template>
6285 <xsl:call-template name="termsOfAddress"/>
6286 <xsl:call-template name="nameDate"/>
6288 <xsl:template name="nameACDEQ">
6290 <xsl:call-template name="subfieldSelect">
6291 <xsl:with-param name="codes">acdeq</xsl:with-param>
6292 </xsl:call-template>
6295 <xsl:template name="constituentOrRelatedType">
6296 <xsl:if test="@ind2=2">
6297 <xsl:attribute name="type">constituent</xsl:attribute>
6300 <xsl:template name="relatedTitle">
6301 <xsl:for-each select="marc:subfield[@code='t']">
6304 <xsl:call-template name="chopPunctuation">
6305 <xsl:with-param name="chopString">
6306 <xsl:value-of select="."/>
6308 </xsl:call-template>
6313 <xsl:template name="relatedTitle76X-78X">
6314 <xsl:for-each select="marc:subfield[@code='t']">
6317 <xsl:call-template name="chopPunctuation">
6318 <xsl:with-param name="chopString">
6319 <xsl:value-of select="."/>
6321 </xsl:call-template>
6323 <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
6324 <xsl:call-template name="relatedPartNumName"/>
6328 <xsl:for-each select="marc:subfield[@code='p']">
6329 <titleInfo type="abbreviated">
6331 <xsl:call-template name="chopPunctuation">
6332 <xsl:with-param name="chopString">
6333 <xsl:value-of select="."/>
6335 </xsl:call-template>
6337 <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
6338 <xsl:call-template name="relatedPartNumName"/>
6342 <xsl:for-each select="marc:subfield[@code='s']">
6343 <titleInfo type="uniform">
6345 <xsl:call-template name="chopPunctuation">
6346 <xsl:with-param name="chopString">
6347 <xsl:value-of select="."/>
6349 </xsl:call-template>
6351 <xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
6352 <xsl:call-template name="relatedPartNumName"/>
6357 <xsl:template name="relatedOriginInfo">
6358 <xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
6360 <xsl:if test="@tag=775">
6361 <xsl:for-each select="marc:subfield[@code='f']">
6364 <xsl:attribute name="type">code</xsl:attribute>
6365 <xsl:attribute name="authority">marcgac</xsl:attribute>
6366 <xsl:value-of select="."/>
6371 <xsl:for-each select="marc:subfield[@code='d']">
6373 <xsl:value-of select="."/>
6376 <xsl:for-each select="marc:subfield[@code='b']">
6378 <xsl:value-of select="."/>
6384 <xsl:template name="relatedLanguage">
6385 <xsl:for-each select="marc:subfield[@code='e']">
6386 <xsl:call-template name="getLanguage">
6387 <xsl:with-param name="langString">
6388 <xsl:value-of select="."/>
6390 </xsl:call-template>
6393 <xsl:template name="nameDate">
6394 <xsl:for-each select="marc:subfield[@code='d']">
6395 <namePart type="date">
6396 <xsl:call-template name="chopPunctuation">
6397 <xsl:with-param name="chopString" select="."/>
6398 </xsl:call-template>
6402 <xsl:template name="subjectAuthority">
6403 <xsl:if test="@ind2!=4">
6404 <xsl:if test="@ind2!=' '">
6405 <xsl:if test="@ind2!=8">
6406 <xsl:if test="@ind2!=9">
6407 <xsl:attribute name="authority">
6409 <xsl:when test="@ind2=0">lcsh</xsl:when>
6410 <xsl:when test="@ind2=1">lcshac</xsl:when>
6411 <xsl:when test="@ind2=2">mesh</xsl:when>
6413 <xsl:when test="@ind2=3">nal</xsl:when>
6414 <xsl:when test="@ind2=5">csh</xsl:when>
6415 <xsl:when test="@ind2=6">rvm</xsl:when>
6416 <xsl:when test="@ind2=7">
6417 <xsl:value-of select="marc:subfield[@code='2']"/>
6426 <xsl:template name="subjectAnyOrder">
6427 <xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
6429 <xsl:when test="@code='v'">
6430 <xsl:call-template name="subjectGenre"/>
6432 <xsl:when test="@code='x'">
6433 <xsl:call-template name="subjectTopic"/>
6435 <xsl:when test="@code='y'">
6436 <xsl:call-template name="subjectTemporalY"/>
6438 <xsl:when test="@code='z'">
6439 <xsl:call-template name="subjectGeographicZ"/>
6444 <xsl:template name="specialSubfieldSelect">
6445 <xsl:param name="anyCodes"/>
6446 <xsl:param name="axis"/>
6447 <xsl:param name="beforeCodes"/>
6448 <xsl:param name="afterCodes"/>
6449 <xsl:variable name="str">
6450 <xsl:for-each select="marc:subfield">
6452 test="contains($anyCodes, @code) or (contains($beforeCodes,@code) and following-sibling::marc:subfield[@code=$axis]) or (contains($afterCodes,@code) and preceding-sibling::marc:subfield[@code=$axis])">
6453 <xsl:value-of select="text()"/>
6454 <xsl:text> </xsl:text>
6458 <xsl:value-of select="substring($str,1,string-length($str)-1)"/>
6461 <!-- 3.2 change tmee 6xx $v genre -->
6462 <xsl:template match="marc:datafield[@tag=600]">
6464 <xsl:call-template name="subjectAuthority"/>
6465 <name type="personal">
6466 <xsl:call-template name="termsOfAddress"/>
6468 <xsl:call-template name="chopPunctuation">
6469 <xsl:with-param name="chopString">
6470 <xsl:call-template name="subfieldSelect">
6471 <xsl:with-param name="codes">aq</xsl:with-param>
6472 </xsl:call-template>
6474 </xsl:call-template>
6476 <xsl:call-template name="nameDate"/>
6477 <xsl:call-template name="affiliation"/>
6478 <xsl:call-template name="role"/>
6480 <xsl:call-template name="subjectAnyOrder"/>
6483 <xsl:template match="marc:datafield[@tag=610]">
6485 <xsl:call-template name="subjectAuthority"/>
6486 <name type="corporate">
6487 <xsl:for-each select="marc:subfield[@code='a']">
6489 <xsl:value-of select="."/>
6492 <xsl:for-each select="marc:subfield[@code='b']">
6494 <xsl:value-of select="."/>
6497 <xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
6499 <xsl:call-template name="subfieldSelect">
6500 <xsl:with-param name="codes">cdnp</xsl:with-param>
6501 </xsl:call-template>
6504 <xsl:call-template name="role"/>
6506 <xsl:call-template name="subjectAnyOrder"/>
6509 <xsl:template match="marc:datafield[@tag=611]">
6511 <xsl:call-template name="subjectAuthority"/>
6512 <name type="conference">
6514 <xsl:call-template name="subfieldSelect">
6515 <xsl:with-param name="codes">abcdeqnp</xsl:with-param>
6516 </xsl:call-template>
6518 <xsl:for-each select="marc:subfield[@code='4']">
6520 <roleTerm authority="marcrelator" type="code">
6521 <xsl:value-of select="."/>
6526 <xsl:call-template name="subjectAnyOrder"/>
6529 <xsl:template match="marc:datafield[@tag=630]">
6531 <xsl:call-template name="subjectAuthority"/>
6534 <xsl:call-template name="chopPunctuation">
6535 <xsl:with-param name="chopString">
6536 <xsl:call-template name="subfieldSelect">
6537 <xsl:with-param name="codes">adfhklor</xsl:with-param>
6538 </xsl:call-template>
6540 </xsl:call-template>
6542 <xsl:call-template name="part"/>
6544 <xsl:call-template name="subjectAnyOrder"/>
6547 <!-- 1.27 648 tmee-->
6548 <xsl:template match="marc:datafield[@tag=648]">
6550 <xsl:if test="marc:subfield[@code=2]">
6551 <xsl:attribute name="authority">
6552 <xsl:value-of select="marc:subfield[@code=2]"/>
6555 <xsl:call-template name="uri"/>
6557 <xsl:call-template name="subjectAuthority"/>
6559 <xsl:call-template name="chopPunctuation">
6560 <xsl:with-param name="chopString">
6561 <xsl:call-template name="subfieldSelect">
6562 <xsl:with-param name="codes">abcd</xsl:with-param>
6563 </xsl:call-template>
6565 </xsl:call-template>
6567 <xsl:call-template name="subjectAnyOrder"/>
6571 <xsl:template match="marc:datafield[@tag=650]">
6573 <xsl:call-template name="subjectAuthority"/>
6575 <xsl:call-template name="chopPunctuation">
6576 <xsl:with-param name="chopString">
6577 <xsl:call-template name="subfieldSelect">
6578 <xsl:with-param name="codes">abcd</xsl:with-param>
6579 </xsl:call-template>
6581 </xsl:call-template>
6583 <xsl:call-template name="subjectAnyOrder"/>
6586 <xsl:template match="marc:datafield[@tag=651]">
6588 <xsl:call-template name="subjectAuthority"/>
6589 <xsl:for-each select="marc:subfield[@code='a']">
6591 <xsl:call-template name="chopPunctuation">
6592 <xsl:with-param name="chopString" select="."/>
6593 </xsl:call-template>
6596 <xsl:call-template name="subjectAnyOrder"/>
6599 <xsl:template match="marc:datafield[@tag=653]">
6601 <xsl:for-each select="marc:subfield[@code='a']">
6603 <xsl:value-of select="."/>
6608 <xsl:template match="marc:datafield[@tag=656]">
6610 <xsl:if test="marc:subfield[@code=2]">
6611 <xsl:attribute name="authority">
6612 <xsl:value-of select="marc:subfield[@code=2]"/>
6616 <xsl:call-template name="chopPunctuation">
6617 <xsl:with-param name="chopString">
6618 <xsl:value-of select="marc:subfield[@code='a']"/>
6620 </xsl:call-template>
6624 <xsl:template name="termsOfAddress">
6625 <xsl:if test="marc:subfield[@code='b' or @code='c']">
6626 <namePart type="termsOfAddress">
6627 <xsl:call-template name="chopPunctuation">
6628 <xsl:with-param name="chopString">
6629 <xsl:call-template name="subfieldSelect">
6630 <xsl:with-param name="codes">bc</xsl:with-param>
6631 </xsl:call-template>
6633 </xsl:call-template>
6637 <xsl:template name="displayLabel">
6638 <xsl:if test="marc:subfield[@code='i']">
6639 <xsl:attribute name="displayLabel">
6640 <xsl:value-of select="marc:subfield[@code='i']"/>
6643 <xsl:if test="marc:subfield[@code='3']">
6644 <xsl:attribute name="displayLabel">
6645 <xsl:value-of select="marc:subfield[@code='3']"/>
6649 <xsl:template name="isInvalid">
6650 <xsl:param name="type"/>
6652 test="marc:subfield[@code='z'] or marc:subfield[@code='y'] or marc:subfield[@code='m']">
6654 <xsl:attribute name="type">
6655 <xsl:value-of select="$type"/>
6657 <xsl:attribute name="invalid">
6658 <xsl:text>yes</xsl:text>
6660 <xsl:if test="marc:subfield[@code='z']">
6661 <xsl:value-of select="marc:subfield[@code='z']"/>
6663 <xsl:if test="marc:subfield[@code='y']">
6664 <xsl:value-of select="marc:subfield[@code='y']"/>
6666 <xsl:if test="marc:subfield[@code='m']">
6667 <xsl:value-of select="marc:subfield[@code='m']"/>
6672 <xsl:template name="subtitle">
6673 <xsl:if test="marc:subfield[@code='b']">
6675 <xsl:call-template name="chopPunctuation">
6676 <xsl:with-param name="chopString">
6677 <xsl:value-of select="marc:subfield[@code='b']"/>
6678 <!--<xsl:call-template name="subfieldSelect">
6679 <xsl:with-param name="codes">b</xsl:with-param>
6680 </xsl:call-template>-->
6682 </xsl:call-template>
6686 <xsl:template name="script">
6687 <xsl:param name="scriptCode"/>
6688 <xsl:attribute name="script">
6690 <xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
6691 <xsl:when test="$scriptCode='(B'">Latin</xsl:when>
6692 <xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
6693 <xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
6694 <xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
6695 <xsl:when test="$scriptCode='(S'">Greek</xsl:when>
6699 <xsl:template name="parsePart">
6700 <!-- assumes 773$q= 1:2:3<4
6701 with up to 3 levels and one optional start page
6703 <xsl:variable name="level1">
6705 <xsl:when test="contains(text(),':')">
6707 <xsl:value-of select="substring-before(text(),':')"/>
6709 <xsl:when test="not(contains(text(),':'))">
6711 <xsl:if test="contains(text(),'<')">
6713 <xsl:value-of select="substring-before(text(),'<')"/>
6715 <xsl:if test="not(contains(text(),'<'))">
6717 <xsl:value-of select="text()"/>
6722 <xsl:variable name="sici2">
6724 <xsl:when test="starts-with(substring-after(text(),$level1),':')">
6725 <xsl:value-of select="substring(substring-after(text(),$level1),2)"/>
6728 <xsl:value-of select="substring-after(text(),$level1)"/>
6732 <xsl:variable name="level2">
6734 <xsl:when test="contains($sici2,':')">
6736 <xsl:value-of select="substring-before($sici2,':')"/>
6738 <xsl:when test="contains($sici2,'<')">
6740 <xsl:value-of select="substring-before($sici2,'<')"/>
6743 <xsl:value-of select="$sici2"/>
6748 <xsl:variable name="sici3">
6750 <xsl:when test="starts-with(substring-after($sici2,$level2),':')">
6751 <xsl:value-of select="substring(substring-after($sici2,$level2),2)"/>
6754 <xsl:value-of select="substring-after($sici2,$level2)"/>
6758 <xsl:variable name="level3">
6760 <xsl:when test="contains($sici3,'<')">
6762 <xsl:value-of select="substring-before($sici3,'<')"/>
6765 <xsl:value-of select="$sici3"/>
6770 <xsl:variable name="page">
6771 <xsl:if test="contains(text(),'<')">
6772 <xsl:value-of select="substring-after(text(),'<')"/>
6775 <xsl:if test="$level1">
6778 <xsl:value-of select="$level1"/>
6782 <xsl:if test="$level2">
6785 <xsl:value-of select="$level2"/>
6789 <xsl:if test="$level3">
6792 <xsl:value-of select="$level3"/>
6796 <xsl:if test="$page">
6797 <extent unit="page">
6799 <xsl:value-of select="$page"/>
6804 <xsl:template name="getLanguage">
6805 <xsl:param name="langString"/>
6806 <xsl:param name="controlField008-35-37"/>
6807 <xsl:variable name="length" select="string-length($langString)"/>
6809 <xsl:when test="$length=0"/>
6810 <xsl:when test="$controlField008-35-37=substring($langString,1,3)">
6811 <xsl:call-template name="getLanguage">
6812 <xsl:with-param name="langString" select="substring($langString,4,$length)"/>
6813 <xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"/>
6814 </xsl:call-template>
6818 <languageTerm authority="iso639-2b" type="code">
6819 <xsl:value-of select="substring($langString,1,3)"/>
6822 <xsl:call-template name="getLanguage">
6823 <xsl:with-param name="langString" select="substring($langString,4,$length)"/>
6824 <xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"/>
6825 </xsl:call-template>
6829 <xsl:template name="isoLanguage">
6830 <xsl:param name="currentLanguage"/>
6831 <xsl:param name="usedLanguages"/>
6832 <xsl:param name="remainingLanguages"/>
6834 <xsl:when test="string-length($currentLanguage)=0"/>
6835 <xsl:when test="not(contains($usedLanguages, $currentLanguage))">
6837 <xsl:if test="@code!='a'">
6838 <xsl:attribute name="objectPart">
6840 <xsl:when test="@code='b'">summary or subtitle</xsl:when>
6841 <xsl:when test="@code='d'">sung or spoken text</xsl:when>
6842 <xsl:when test="@code='e'">libretto</xsl:when>
6843 <xsl:when test="@code='f'">table of contents</xsl:when>
6844 <xsl:when test="@code='g'">accompanying material</xsl:when>
6845 <xsl:when test="@code='h'">translation</xsl:when>
6849 <languageTerm authority="iso639-2b" type="code">
6850 <xsl:value-of select="$currentLanguage"/>
6853 <xsl:call-template name="isoLanguage">
6854 <xsl:with-param name="currentLanguage">
6855 <xsl:value-of select="substring($remainingLanguages,1,3)"/>
6857 <xsl:with-param name="usedLanguages">
6858 <xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
6860 <xsl:with-param name="remainingLanguages">
6862 select="substring($remainingLanguages,4,string-length($remainingLanguages))"
6865 </xsl:call-template>
6868 <xsl:call-template name="isoLanguage">
6869 <xsl:with-param name="currentLanguage">
6870 <xsl:value-of select="substring($remainingLanguages,1,3)"/>
6872 <xsl:with-param name="usedLanguages">
6873 <xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
6875 <xsl:with-param name="remainingLanguages">
6877 select="substring($remainingLanguages,4,string-length($remainingLanguages))"
6880 </xsl:call-template>
6884 <xsl:template name="chopBrackets">
6885 <xsl:param name="chopString"/>
6886 <xsl:variable name="string">
6887 <xsl:call-template name="chopPunctuation">
6888 <xsl:with-param name="chopString" select="$chopString"/>
6889 </xsl:call-template>
6891 <xsl:if test="substring($string, 1,1)='['">
6892 <xsl:value-of select="substring($string,2, string-length($string)-2)"/>
6894 <xsl:if test="substring($string, 1,1)!='['">
6895 <xsl:value-of select="$string"/>
6898 <xsl:template name="rfcLanguages">
6899 <xsl:param name="nodeNum"/>
6900 <xsl:param name="usedLanguages"/>
6901 <xsl:param name="controlField008-35-37"/>
6902 <xsl:variable name="currentLanguage" select="."/>
6904 <xsl:when test="not($currentLanguage)"/>
6906 test="$currentLanguage!=$controlField008-35-37 and $currentLanguage!='rfc3066'">
6907 <xsl:if test="not(contains($usedLanguages,$currentLanguage))">
6909 <xsl:if test="@code!='a'">
6910 <xsl:attribute name="objectPart">
6912 <xsl:when test="@code='b'">summary or subtitle</xsl:when>
6913 <xsl:when test="@code='d'">sung or spoken text</xsl:when>
6914 <xsl:when test="@code='e'">libretto</xsl:when>
6915 <xsl:when test="@code='f'">table of contents</xsl:when>
6916 <xsl:when test="@code='g'">accompanying material</xsl:when>
6917 <xsl:when test="@code='h'">translation</xsl:when>
6921 <languageTerm authority="rfc3066" type="code">
6922 <xsl:value-of select="$currentLanguage"/>
6927 <xsl:otherwise> </xsl:otherwise>
6931 <xsl:template name="datafield">
6932 <xsl:param name="tag"/>
6933 <xsl:param name="ind1">
6934 <xsl:text> </xsl:text>
6936 <xsl:param name="ind2">
6937 <xsl:text> </xsl:text>
6939 <xsl:param name="subfields"/>
6940 <xsl:element name="marc:datafield">
6941 <xsl:attribute name="tag">
6942 <xsl:value-of select="$tag"/>
6944 <xsl:attribute name="ind1">
6945 <xsl:value-of select="$ind1"/>
6947 <xsl:attribute name="ind2">
6948 <xsl:value-of select="$ind2"/>
6950 <xsl:copy-of select="$subfields"/>
6954 <xsl:template name="subfieldSelect">
6955 <xsl:param name="codes">abcdefghijklmnopqrstuvwxyz</xsl:param>
6956 <xsl:param name="delimeter">
6957 <xsl:text> </xsl:text>
6959 <xsl:variable name="str">
6960 <xsl:for-each select="marc:subfield">
6961 <xsl:if test="contains($codes, @code)">
6962 <xsl:value-of select="text()"/>
6963 <xsl:value-of select="$delimeter"/>
6967 <xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
6970 <xsl:template name="buildSpaces">
6971 <xsl:param name="spaces"/>
6972 <xsl:param name="char">
6973 <xsl:text> </xsl:text>
6975 <xsl:if test="$spaces>0">
6976 <xsl:value-of select="$char"/>
6977 <xsl:call-template name="buildSpaces">
6978 <xsl:with-param name="spaces" select="$spaces - 1"/>
6979 <xsl:with-param name="char" select="$char"/>
6980 </xsl:call-template>
6984 <xsl:template name="chopPunctuation">
6985 <xsl:param name="chopString"/>
6986 <xsl:param name="punctuation">
6987 <xsl:text>.:,;/ </xsl:text>
6989 <xsl:variable name="length" select="string-length($chopString)"/>
6991 <xsl:when test="$length=0"/>
6992 <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
6993 <xsl:call-template name="chopPunctuation">
6994 <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
6995 <xsl:with-param name="punctuation" select="$punctuation"/>
6996 </xsl:call-template>
6998 <xsl:when test="not($chopString)"/>
7000 <xsl:value-of select="$chopString"/>
7005 <xsl:template name="chopPunctuationFront">
7006 <xsl:param name="chopString"/>
7007 <xsl:variable name="length" select="string-length($chopString)"/>
7009 <xsl:when test="$length=0"/>
7010 <xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
7011 <xsl:call-template name="chopPunctuationFront">
7012 <xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"
7014 </xsl:call-template>
7016 <xsl:when test="not($chopString)"/>
7018 <xsl:value-of select="$chopString"/>
7023 <xsl:template name="chopPunctuationBack">
7024 <xsl:param name="chopString"/>
7025 <xsl:param name="punctuation">
7026 <xsl:text>.:,;/] </xsl:text>
7028 <xsl:variable name="length" select="string-length($chopString)"/>
7030 <xsl:when test="$length=0"/>
7031 <xsl:when test="contains($punctuation, substring($chopString,$length,1))">
7032 <xsl:call-template name="chopPunctuation">
7033 <xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
7034 <xsl:with-param name="punctuation" select="$punctuation"/>
7035 </xsl:call-template>
7037 <xsl:when test="not($chopString)"/>
7039 <xsl:value-of select="$chopString"/>
7044 <!-- nate added 12/14/2007 for lccn.loc.gov: url encode ampersand, etc. -->
7045 <xsl:template name="url-encode">
7047 <xsl:param name="str"/>
7049 <xsl:if test="$str">
7050 <xsl:variable name="first-char" select="substring($str,1,1)"/>
7052 <xsl:when test="contains($safe,$first-char)">
7053 <xsl:value-of select="$first-char"/>
7056 <xsl:variable name="codepoint">
7058 <xsl:when test="contains($ascii,$first-char)">
7060 select="string-length(substring-before($ascii,$first-char)) + 32"
7063 <xsl:when test="contains($latin1,$first-char)">
7065 select="string-length(substring-before($latin1,$first-char)) + 160"/>
7069 <xsl:message terminate="no">Warning: string contains a character
7070 that is out of range! Substituting "?".</xsl:message>
7071 <xsl:text>63</xsl:text>
7075 <xsl:variable name="hex-digit1"
7076 select="substring($hex,floor($codepoint div 16) + 1,1)"/>
7077 <xsl:variable name="hex-digit2" select="substring($hex,$codepoint mod 16 + 1,1)"/>
7078 <!-- <xsl:value-of select="concat('%',$hex-digit2)"/> -->
7079 <xsl:value-of select="concat('%',$hex-digit1,$hex-digit2)"/>
7082 <xsl:if test="string-length($str) > 1">
7083 <xsl:call-template name="url-encode">
7084 <xsl:with-param name="str" select="substring($str,2)"/>
7085 </xsl:call-template>
7089 </xsl:stylesheet>$$ WHERE name = 'mods33';
7092 INSERT INTO config.global_flag (name, value, enabled, label) VALUES
7094 'opac.browse.warnable_regexp_per_class',
7095 '{"title": "^(a|the|an)\\s"}',
7098 'opac.browse.warnable_regexp_per_class',
7099 'Map of search classes to regular expressions to warn user about leading articles.',
7105 'opac.browse.holdings_visibility_test_limit',
7109 'opac.browse.holdings_visibility_test_limit',
7110 'Don''t look for more than this number of records with holdings when displaying browse headings with visible record counts.',
7116 ALTER TABLE metabib.browse_entry DROP CONSTRAINT browse_entry_value_key;
7117 ALTER TABLE metabib.browse_entry ADD COLUMN sort_value TEXT;
7118 DELETE FROM metabib.browse_entry_def_map; -- Yeah.
7119 DELETE FROM metabib.browse_entry WHERE sort_value IS NULL;
7120 ALTER TABLE metabib.browse_entry ALTER COLUMN sort_value SET NOT NULL;
7121 ALTER TABLE metabib.browse_entry ADD UNIQUE (value, sort_value);
7122 DROP TRIGGER IF EXISTS mbe_sort_value ON metabib.browse_entry;
7124 CREATE INDEX browse_entry_sort_value_idx
7125 ON metabib.browse_entry USING BTREE (sort_value);
7127 -- NOTE If I understand ordered indices correctly, an index on sort_value DESC
7128 -- is not actually needed, even though we do have a query that does ORDER BY
7129 -- on this column in that direction. The previous index serves for both
7130 -- directions, and ordering in an index is only helpful for multi-column
7131 -- indices, I think. See http://www.postgresql.org/docs/9.1/static/indexes-ordering.html
7133 -- CREATE INDEX CONCURRENTLY browse_entry_sort_value_idx_desc
7134 -- ON metabib.browse_entry USING BTREE (sort_value DESC);
7136 CREATE TYPE metabib.flat_browse_entry_appearance AS (
7137 browse_entry BIGINT,
7141 sources INT, -- visible ones, that is
7142 row_number INT, -- internal use, sort of
7143 accurate BOOL -- Count in sources field is accurate? Not
7144 -- if we had more than a browse superpage
7145 -- of records to look at.
7149 CREATE OR REPLACE FUNCTION metabib.browse_pivot(
7152 ) RETURNS BIGINT AS $p$
7156 SELECT INTO id mbe.id FROM metabib.browse_entry mbe
7157 JOIN metabib.browse_entry_def_map mbedm ON (
7158 mbedm.entry = mbe.id AND
7159 mbedm.def = ANY(search_field)
7161 WHERE mbe.sort_value >= public.search_normalize(browse_term)
7162 ORDER BY mbe.sort_value, mbe.value LIMIT 1;
7166 $p$ LANGUAGE PLPGSQL;
7168 CREATE OR REPLACE FUNCTION metabib.staged_browse(
7171 context_locations INT[],
7173 browse_superpage_size INT,
7176 ) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
7178 core_cursor REFCURSOR;
7181 result_row metabib.flat_browse_entry_appearance%ROWTYPE;
7182 results_skipped INT := 0;
7183 results_returned INT := 0;
7187 superpage_of_records BIGINT[];
7190 OPEN core_cursor FOR EXECUTE core_query;
7193 FETCH core_cursor INTO core_record;
7194 EXIT WHEN NOT FOUND;
7196 result_row.sources := 0;
7198 full_end := ARRAY_LENGTH(core_record.records, 1);
7199 superpage_size := COALESCE(browse_superpage_size, full_end);
7201 slice_end := superpage_size;
7203 WHILE result_row.sources = 0 AND slice_start <= full_end LOOP
7204 superpage_of_records := core_record.records[slice_start:slice_end];
7206 'SELECT NULL::BIGINT AS id, ARRAY[r] AS records, ' ||
7207 '1::INT AS rel FROM (SELECT UNNEST(' ||
7208 quote_literal(superpage_of_records) || '::BIGINT[]) AS r) rr';
7210 -- We use search.query_parser_fts() for visibility testing.
7211 -- We're calling it once per browse-superpage worth of records
7212 -- out of the set of records related to a given mbe, until we've
7213 -- either exhausted that set of records or found at least 1
7216 SELECT INTO result_row.sources visible
7217 FROM search.query_parser_fts(
7218 context_org, NULL, qpfts_query, NULL,
7219 context_locations, 0, NULL, NULL, FALSE, staff, FALSE
7221 WHERE qpfts.rel IS NULL;
7223 slice_start := slice_start + superpage_size;
7224 slice_end := slice_end + superpage_size;
7227 -- Accurate? Well, probably.
7228 result_row.accurate := browse_superpage_size IS NULL OR
7229 browse_superpage_size >= full_end;
7231 IF result_row.sources > 0 THEN
7232 IF results_skipped < use_offset THEN
7233 results_skipped := results_skipped + 1;
7237 result_row.browse_entry := core_record.id;
7238 result_row.authorities := core_record.authorities;
7239 result_row.fields := core_record.fields;
7240 result_row.value := core_record.value;
7242 -- This is needed so our caller can flip it and reverse it.
7243 result_row.row_number := results_returned;
7245 RETURN NEXT result_row;
7247 results_returned := results_returned + 1;
7249 EXIT WHEN results_returned >= result_limit;
7253 $p$ LANGUAGE PLPGSQL;
7255 -- This is optimized to be fast for values of result_offset near zero.
7256 CREATE OR REPLACE FUNCTION metabib.browse(
7259 context_org INT DEFAULT NULL,
7260 context_loc_group INT DEFAULT NULL,
7261 staff BOOL DEFAULT FALSE,
7262 pivot_id BIGINT DEFAULT NULL,
7263 force_backward BOOL DEFAULT FALSE,
7264 result_limit INT DEFAULT 10,
7265 result_offset INT DEFAULT 0 -- Can be negative!
7266 ) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
7270 pivot_sort_value TEXT;
7271 pivot_sort_fallback TEXT;
7272 context_locations INT[];
7274 browse_superpage_size INT;
7275 results_skipped INT := 0;
7277 IF pivot_id IS NULL THEN
7278 pivot_id := metabib.browse_pivot(search_field, browse_term);
7281 SELECT INTO pivot_sort_value, pivot_sort_fallback
7282 sort_value, value FROM metabib.browse_entry WHERE id = pivot_id;
7284 IF pivot_sort_value IS NULL THEN
7288 IF context_loc_group IS NOT NULL THEN
7289 SELECT INTO context_locations ARRAY_AGG(location)
7290 FROM asset.copy_location_group_map
7291 WHERE lgroup = context_loc_group;
7294 SELECT INTO browse_superpage_size value -- NULL ok
7295 FROM config.global_flag
7296 WHERE enabled AND name = 'opac.browse.holdings_visibility_test_limit';
7303 (SELECT ARRAY_AGG(src) FROM (
7304 SELECT DISTINCT UNNEST(ARRAY_AGG(mbedm.source)) AS src
7306 (SELECT ARRAY_TO_STRING(ARRAY_AGG(authority), $$,$$) FROM (
7307 SELECT DISTINCT UNNEST(ARRAY_AGG(mbedm.authority)) AS authority
7308 ) au) AS authorities,
7309 (SELECT ARRAY_TO_STRING(ARRAY_AGG(field), $$,$$) FROM (
7310 SELECT DISTINCT UNNEST(ARRAY_AGG(mbedm.def)) AS field
7312 FROM metabib.browse_entry mbe
7313 JOIN metabib.browse_entry_def_map mbedm ON (
7314 mbedm.entry = mbe.id AND
7315 mbedm.def = ANY(' || quote_literal(search_field) || ')
7319 -- PostgreSQL is not magic. We can't actually pass a negative offset.
7320 IF result_offset >= 0 AND NOT force_backward THEN
7321 use_offset := result_offset;
7322 core_query := core_query ||
7323 ' mbe.sort_value >= ' || quote_literal(pivot_sort_value) ||
7324 ' GROUP BY 1,2,3 ORDER BY mbe.sort_value, mbe.value ';
7326 RETURN QUERY SELECT * FROM metabib.staged_browse(
7327 core_query, context_org, context_locations,
7328 staff, browse_superpage_size, result_limit, use_offset
7331 -- Part 1 of 2 to deliver what the user wants with a negative offset:
7332 core_query := core_query ||
7333 ' mbe.sort_value < ' || quote_literal(pivot_sort_value) ||
7334 ' GROUP BY 1,2,3 ORDER BY mbe.sort_value DESC, mbe.value DESC ';
7336 -- Part 2 of 2 to deliver what the user wants with a negative offset:
7337 RETURN QUERY SELECT * FROM (SELECT * FROM metabib.staged_browse(
7338 core_query, context_org, context_locations,
7339 staff, browse_superpage_size, result_limit, use_offset
7340 )) sb ORDER BY row_number DESC;
7344 $p$ LANGUAGE PLPGSQL;
7346 CREATE OR REPLACE FUNCTION metabib.browse(
7349 context_org INT DEFAULT NULL,
7350 context_loc_group INT DEFAULT NULL,
7351 staff BOOL DEFAULT FALSE,
7352 pivot_id BIGINT DEFAULT NULL,
7353 force_backward BOOL DEFAULT FALSE,
7354 result_limit INT DEFAULT 10,
7355 result_offset INT DEFAULT 0 -- Can be negative, implying backward!
7356 ) RETURNS SETOF metabib.flat_browse_entry_appearance AS $p$
7358 RETURN QUERY SELECT * FROM metabib.browse(
7359 (SELECT COALESCE(ARRAY_AGG(id), ARRAY[]::INT[])
7360 FROM config.metabib_field WHERE field_class = search_class),
7371 $p$ LANGUAGE PLPGSQL;
7373 UPDATE config.metabib_field
7375 xpath = $$//mods32:mods/mods32:relatedItem[@type="series"]/mods32:titleInfo[@type="nfi"]$$,
7376 browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
7379 field_class = 'series' AND name = 'seriestitle' ;
7381 UPDATE config.metabib_field
7383 xpath = $$//mods32:mods/mods32:titleInfo[mods32:title and not (@type)]$$,
7384 browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
7385 browse_xpath = NULL,
7388 field_class = 'title' AND name = 'proper' ;
7390 UPDATE config.metabib_field
7392 xpath = $$//mods32:mods/mods32:titleInfo[mods32:title and (@type='alternative-nfi')]$$,
7393 browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
7396 field_class = 'title' AND name = 'alternative' ;
7398 UPDATE config.metabib_field
7400 xpath = $$//mods32:mods/mods32:titleInfo[mods32:title and (@type='uniform-nfi')]$$,
7401 browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
7404 field_class = 'title' AND name = 'uniform' ;
7406 UPDATE config.metabib_field
7408 xpath = $$//mods32:mods/mods32:titleInfo[mods32:title and (@type='translated-nfi')]$$,
7409 browse_sort_xpath = $$*[local-name() != "nonSort"]$$,
7412 field_class = 'title' AND name = 'translated' ;
7414 -- This keeps extra terms like "creator" out of browse headings.
7415 UPDATE config.metabib_field
7416 SET browse_xpath = $$//*[local-name()='namePart']$$ -- vim */
7419 browse_xpath IS NULL AND
7420 field_class = 'author';
7424 \qecho This is a browse-only reingest of your bib records. It may take a while.
7425 \qecho You may cancel now without losing the effect of the rest of the
7426 \qecho upgrade script, and arrange the reingest later.
7428 SELECT metabib.reingest_metabib_field_entries(id, TRUE, FALSE, TRUE)
7429 FROM biblio.record_entry;