Schema Changes: 3.1.0
Upgrade: 3.0.6 → 3.1.0
This release applied 20 migration(s) to the database schema.
| ID | Type | Description |
|---|---|---|
data |
max duplicate holds coust |
|
schema |
record merge tracking |
|
schema |
lp1737016 afs code |
|
schema |
ingest multiple sources |
|
data |
multiple language search |
|
reingest |
multiple language search |
|
schema |
copy alerts |
|
data |
stock copy alert types |
|
data |
yaous for open circ exists fine handling |
|
data |
move legacy copy alerts |
|
data |
more copy alerts active by default |
|
data |
display field seed data |
|
schema |
highlight search |
|
data |
mods title punctuation change |
|
data |
virtual index defs |
|
data |
hold checkout ou |
|
schema |
webstaff.circ.itemsout notice count excludes courtesies |
|
data |
expand billing timestamps |
|
schema |
lp1758347 fix merge record assets |
|
data |
yaos circ holds default pickup lib |
Migration Details
1089 — max duplicate holds coust
Type: data
View SQL
-- Add the circ.holds.max_duplicate_holds org. unit setting type.
INSERT into config.org_unit_setting_type
( name, grp, label, description, datatype, fm_class )
VALUES
( 'circ.holds.max_duplicate_holds', 'holds',
oils_i18n_gettext(
'circ.holds.max_duplicate_holds',
'Maximum number of duplicate holds allowed.',
'coust', 'label'),
oils_i18n_gettext(
'circ.holds.max_duplicate_holds',
'Maximum number of duplicate title or metarecord holds allowed per patron.',
'coust', 'description'),
'integer', null );
1090 — record merge tracking
Type: schema
View SQL
ALTER TABLE biblio.record_entry
ADD COLUMN merge_date TIMESTAMP WITH TIME ZONE,
ADD COLUMN merged_to BIGINT REFERENCES biblio.record_entry(id);
CREATE OR REPLACE FUNCTION asset.merge_record_assets( target_record BIGINT, source_record BIGINT ) RETURNS INT AS $func$
DECLARE
moved_objects INT := 0;
source_cn asset.call_number%ROWTYPE;
target_cn asset.call_number%ROWTYPE;
metarec metabib.metarecord%ROWTYPE;
hold action.hold_request%ROWTYPE;
ser_rec serial.record_entry%ROWTYPE;
ser_sub serial.subscription%ROWTYPE;
acq_lineitem acq.lineitem%ROWTYPE;
acq_request acq.user_request%ROWTYPE;
booking booking.resource_type%ROWTYPE;
source_part biblio.monograph_part%ROWTYPE;
target_part biblio.monograph_part%ROWTYPE;
multi_home biblio.peer_bib_copy_map%ROWTYPE;
uri_count INT := 0;
counter INT := 0;
uri_datafield TEXT;
uri_text TEXT := '';
-- move any 856 entries on records that have at least one MARC-mapped URI entry
SELECT INTO uri_count COUNT(*)
FROM asset.uri_call_number_map m
JOIN asset.call_number cn ON (m.call_number = cn.id)
WHERE cn.record = source_record;
IF uri_count > 0 THEN
-- This returns more nodes than you might expect:
-- 7 instead of 1 for an 856 with $u $y $9
SELECT COUNT(*) INTO counter
FROM oils_xpath_table(
'id',
'marc',
'biblio.record_entry',
'//*[@tag="856"]',
'id=' || source_record
) as t(i int,c text);
FOR i IN 1 .. counter LOOP
SELECT '<datafield xmlns="http://www.loc.gov/MARC21/slim"' ||
' tag="856"' ||
' ind1="' || FIRST(ind1) || '"' ||
' ind2="' || FIRST(ind2) || '">' ||
STRING_AGG(
'<subfield code="' || subfield || '">' ||
regexp_replace(
regexp_replace(
regexp_replace(data,'&','&','g'),
'>', '>', 'g'
),
'<', '<', 'g'
) || '</subfield>', ''
) || '</datafield>' INTO uri_datafield
FROM oils_xpath_table(
'id',
'marc',
'biblio.record_entry',
'//*[@tag="856"][position()=' || i || ']/@ind1|' ||
'//*[@tag="856"][position()=' || i || ']/@ind2|' ||
'//*[@tag="856"][position()=' || i || ']/*/@code|' ||
'//*[@tag="856"][position()=' || i || ']/*[@code]',
'id=' || source_record
) as t(id int,ind1 text, ind2 text,subfield text,data text);
-- As most of the results will be NULL, protect against NULLifying
-- the valid content that we do generate
uri_text := uri_text || COALESCE(uri_datafield, '');
END LOOP;
IF uri_text <> '' THEN
UPDATE biblio.record_entry
SET marc = regexp_replace(marc,'(</[^>]*record>)', uri_text || E'\\1')
WHERE id = target_record;
END IF;
END IF;
-- Find and move metarecords to the target record
SELECT INTO metarec *
FROM metabib.metarecord
WHERE master_record = source_record;
IF FOUND THEN
UPDATE metabib.metarecord
SET master_record = target_record,
mods = NULL
WHERE id = metarec.id;
moved_objects := moved_objects + 1;
END IF;
-- Find call numbers attached to the source ...
FOR source_cn IN SELECT * FROM asset.call_number WHERE record = source_record LOOP
SELECT INTO target_cn *
FROM asset.call_number
WHERE label = source_cn.label
AND prefix = source_cn.prefix
AND suffix = source_cn.suffix
AND owning_lib = source_cn.owning_lib
AND record = target_record
AND NOT deleted;
-- ... and if there's a conflicting one on the target ...
IF FOUND THEN
-- ... move the copies to that, and ...
UPDATE asset.copy
SET call_number = target_cn.id
WHERE call_number = source_cn.id;
-- ... move V holds to the move-target call number
FOR hold IN SELECT * FROM action.hold_request WHERE target = source_cn.id AND hold_type = 'V' LOOP
UPDATE action.hold_request
SET target = target_cn.id
WHERE id = hold.id;
moved_objects := moved_objects + 1;
END LOOP;
UPDATE asset.call_number SET deleted = TRUE WHERE id = source_cn.id;
-- ... if not ...
ELSE
-- ... just move the call number to the target record
UPDATE asset.call_number
SET record = target_record
WHERE id = source_cn.id;
END IF;
moved_objects := moved_objects + 1;
END LOOP;
-- Find T holds targeting the source record ...
FOR hold IN SELECT * FROM action.hold_request WHERE target = source_record AND hold_type = 'T' LOOP
-- ... and move them to the target record
UPDATE action.hold_request
SET target = target_record
WHERE id = hold.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find serial records targeting the source record ...
FOR ser_rec IN SELECT * FROM serial.record_entry WHERE record = source_record LOOP
-- ... and move them to the target record
UPDATE serial.record_entry
SET record = target_record
WHERE id = ser_rec.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find serial subscriptions targeting the source record ...
FOR ser_sub IN SELECT * FROM serial.subscription WHERE record_entry = source_record LOOP
-- ... and move them to the target record
UPDATE serial.subscription
SET record_entry = target_record
WHERE id = ser_sub.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find booking resource types targeting the source record ...
FOR booking IN SELECT * FROM booking.resource_type WHERE record = source_record LOOP
-- ... and move them to the target record
UPDATE booking.resource_type
SET record = target_record
WHERE id = booking.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find acq lineitems targeting the source record ...
FOR acq_lineitem IN SELECT * FROM acq.lineitem WHERE eg_bib_id = source_record LOOP
-- ... and move them to the target record
UPDATE acq.lineitem
SET eg_bib_id = target_record
WHERE id = acq_lineitem.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find acq user purchase requests targeting the source record ...
FOR acq_request IN SELECT * FROM acq.user_request WHERE eg_bib = source_record LOOP
-- ... and move them to the target record
UPDATE acq.user_request
SET eg_bib = target_record
WHERE id = acq_request.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find parts attached to the source ...
FOR source_part IN SELECT * FROM biblio.monograph_part WHERE record = source_record LOOP
SELECT INTO target_part *
FROM biblio.monograph_part
WHERE label = source_part.label
AND record = target_record;
-- ... and if there's a conflicting one on the target ...
IF FOUND THEN
-- ... move the copy-part maps to that, and ...
UPDATE asset.copy_part_map
SET part = target_part.id
WHERE part = source_part.id;
-- ... move P holds to the move-target part
FOR hold IN SELECT * FROM action.hold_request WHERE target = source_part.id AND hold_type = 'P' LOOP
UPDATE action.hold_request
SET target = target_part.id
WHERE id = hold.id;
moved_objects := moved_objects + 1;
END LOOP;
-- ... if not ...
ELSE
-- ... just move the part to the target record
UPDATE biblio.monograph_part
SET record = target_record
WHERE id = source_part.id;
END IF;
moved_objects := moved_objects + 1;
END LOOP;
-- Find multi_home items attached to the source ...
FOR multi_home IN SELECT * FROM biblio.peer_bib_copy_map WHERE peer_record = source_record LOOP
-- ... and move them to the target record
UPDATE biblio.peer_bib_copy_map
SET peer_record = target_record
WHERE id = multi_home.id;
moved_objects := moved_objects + 1;
END LOOP;
-- And delete mappings where the item's home bib was merged with the peer bib
DELETE FROM biblio.peer_bib_copy_map WHERE peer_record = (
SELECT (SELECT record FROM asset.call_number WHERE id = call_number)
FROM asset.copy WHERE id = target_copy
);
-- Apply merge tracking
UPDATE biblio.record_entry
SET merge_date = NOW() WHERE id = target_record;
UPDATE biblio.record_entry
SET merge_date = NOW(), merged_to = target_record
WHERE id = source_record;
-- Finally, "delete" the source record
DELETE FROM biblio.record_entry WHERE id = source_record;
-- That's all, folks!
RETURN moved_objects;
END;
$func$ LANGUAGE plpgsql;
1091 — lp1737016 afs code
Type: schema
View SQL
ALTER TABLE acq.funding_source DROP CONSTRAINT funding_source_code_key;
ALTER TABLE acq.funding_source ALTER COLUMN code SET NOT NULL;
ALTER TABLE acq.funding_source ADD CONSTRAINT funding_source_code_once_per_owner UNIQUE (code,owner);
1092 — ingest multiple sources
Type: schema
View SQL
CREATE OR REPLACE FUNCTION metabib.reingest_record_attributes (rid BIGINT, pattr_list TEXT[] DEFAULT NULL, prmarc TEXT DEFAULT NULL, rdeleted BOOL DEFAULT TRUE) RETURNS VOID AS $func$
DECLARE
transformed_xml TEXT;
rmarc TEXT := prmarc;
tmp_val TEXT;
prev_xfrm TEXT;
normalizer RECORD;
xfrm config.xml_transform%ROWTYPE;
attr_vector INT[] := '{}'::INT[];
attr_vector_tmp INT[];
attr_list TEXT[] := pattr_list;
attr_value TEXT[];
norm_attr_value TEXT[];
tmp_xml TEXT;
tmp_array TEXT[];
attr_def config.record_attr_definition%ROWTYPE;
ccvm_row config.coded_value_map%ROWTYPE;
jump_past BOOL;
IF attr_list IS NULL OR rdeleted THEN -- need to do the full dance on INSERT or undelete
SELECT ARRAY_AGG(name) INTO attr_list FROM config.record_attr_definition
WHERE (
tag IS NOT NULL OR
fixed_field IS NOT NULL OR
xpath IS NOT NULL OR
phys_char_sf IS NOT NULL OR
composite
) AND (
filter OR sorter
);
END IF;
IF rmarc IS NULL THEN
SELECT marc INTO rmarc FROM biblio.record_entry WHERE id = rid;
END IF;
FOR attr_def IN SELECT * FROM config.record_attr_definition WHERE NOT composite AND name = ANY( attr_list ) ORDER BY format LOOP
jump_past := FALSE; -- This gets set when we are non-multi and have found something
attr_value := '{}'::TEXT[];
norm_attr_value := '{}'::TEXT[];
attr_vector_tmp := '{}'::INT[];
SELECT * INTO ccvm_row FROM config.coded_value_map c WHERE c.ctype = attr_def.name LIMIT 1;
IF attr_def.tag IS NOT NULL THEN -- tag (and optional subfield list) selection
SELECT ARRAY_AGG(value) INTO attr_value
FROM (SELECT * FROM metabib.full_rec ORDER BY tag, subfield) AS x
WHERE record = rid
AND tag LIKE attr_def.tag
AND CASE
WHEN attr_def.sf_list IS NOT NULL
THEN POSITION(subfield IN attr_def.sf_list) > 0
ELSE TRUE
END
GROUP BY tag
ORDER BY tag;
IF NOT attr_def.multi THEN
attr_value := ARRAY[ARRAY_TO_STRING(attr_value, COALESCE(attr_def.joiner,' '))];
jump_past := TRUE;
END IF;
END IF;
IF NOT jump_past AND attr_def.fixed_field IS NOT NULL THEN -- a named fixed field, see config.marc21_ff_pos_map.fixed_field
attr_value := attr_value || vandelay.marc21_extract_fixed_field_list(rmarc, attr_def.fixed_field);
IF NOT attr_def.multi THEN
attr_value := ARRAY[attr_value[1]];
jump_past := TRUE;
END IF;
END IF;
IF NOT jump_past AND attr_def.xpath IS NOT NULL THEN -- and xpath expression
SELECT INTO xfrm * FROM config.xml_transform WHERE name = attr_def.format;
-- See if we can skip the XSLT ... it's expensive
IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
-- Can't skip the transform
IF xfrm.xslt <> '---' THEN
transformed_xml := oils_xslt_process(rmarc,xfrm.xslt);
ELSE
transformed_xml := rmarc;
END IF;
prev_xfrm := xfrm.name;
END IF;
IF xfrm.name IS NULL THEN
-- just grab the marcxml (empty) transform
SELECT INTO xfrm * FROM config.xml_transform WHERE xslt = '---' LIMIT 1;
prev_xfrm := xfrm.name;
END IF;
FOR tmp_xml IN SELECT UNNEST(oils_xpath(attr_def.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]])) LOOP
tmp_val := oils_xpath_string(
'//*',
tmp_xml,
COALESCE(attr_def.joiner,' '),
ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
);
IF tmp_val IS NOT NULL AND BTRIM(tmp_val) <> '' THEN
attr_value := attr_value || tmp_val;
EXIT WHEN NOT attr_def.multi;
END IF;
END LOOP;
END IF;
IF NOT jump_past AND attr_def.phys_char_sf IS NOT NULL THEN -- a named Physical Characteristic, see config.marc21_physical_characteristic_*_map
SELECT ARRAY_AGG(m.value) INTO tmp_array
FROM vandelay.marc21_physical_characteristics(rmarc) v
LEFT JOIN config.marc21_physical_characteristic_value_map m ON (m.id = v.value)
WHERE v.subfield = attr_def.phys_char_sf AND (m.value IS NOT NULL AND BTRIM(m.value) <> '')
AND ( ccvm_row.id IS NULL OR ( ccvm_row.id IS NOT NULL AND v.id IS NOT NULL) );
attr_value := attr_value || tmp_array;
IF NOT attr_def.multi THEN
attr_value := ARRAY[attr_value[1]];
END IF;
END IF;
-- apply index normalizers to attr_value
FOR tmp_val IN SELECT value FROM UNNEST(attr_value) x(value) LOOP
FOR normalizer IN
SELECT n.func AS func,
n.param_count AS param_count,
m.params AS params
FROM config.index_normalizer n
JOIN config.record_attr_index_norm_map m ON (m.norm = n.id)
WHERE attr = attr_def.name
ORDER BY m.pos LOOP
EXECUTE 'SELECT ' || normalizer.func || '(' ||
COALESCE( quote_literal( tmp_val ), 'NULL' ) ||
CASE
WHEN normalizer.param_count > 0
THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
ELSE ''
END ||
')' INTO tmp_val;
END LOOP;
IF tmp_val IS NOT NULL AND tmp_val <> '' THEN
-- note that a string that contains only blanks
-- is a valid value for some attributes
norm_attr_value := norm_attr_value || tmp_val;
END IF;
END LOOP;
IF attr_def.filter THEN
-- Create unknown uncontrolled values and find the IDs of the values
IF ccvm_row.id IS NULL THEN
FOR tmp_val IN SELECT value FROM UNNEST(norm_attr_value) x(value) LOOP
IF tmp_val IS NOT NULL AND BTRIM(tmp_val) <> '' THEN
BEGIN -- use subtransaction to isolate unique constraint violations
INSERT INTO metabib.uncontrolled_record_attr_value ( attr, value ) VALUES ( attr_def.name, tmp_val );
EXCEPTION WHEN unique_violation THEN END;
END IF;
END LOOP;
SELECT ARRAY_AGG(id) INTO attr_vector_tmp FROM metabib.uncontrolled_record_attr_value WHERE attr = attr_def.name AND value = ANY( norm_attr_value );
ELSE
SELECT ARRAY_AGG(id) INTO attr_vector_tmp FROM config.coded_value_map WHERE ctype = attr_def.name AND code = ANY( norm_attr_value );
END IF;
-- Add the new value to the vector
attr_vector := attr_vector || attr_vector_tmp;
END IF;
IF attr_def.sorter THEN
DELETE FROM metabib.record_sorter WHERE source = rid AND attr = attr_def.name;
IF norm_attr_value[1] IS NOT NULL THEN
INSERT INTO metabib.record_sorter (source, attr, value) VALUES (rid, attr_def.name, norm_attr_value[1]);
END IF;
END IF;
END LOOP;
/* We may need to rewrite the vlist to contain
the intersection of new values for requested
attrs and old values for ignored attrs. To
do this, we take the old attr vlist and
subtract any values that are valid for the
requested attrs, and then add back the new
set of attr values. */
IF ARRAY_LENGTH(pattr_list, 1) > 0 THEN
SELECT vlist INTO attr_vector_tmp FROM metabib.record_attr_vector_list WHERE source = rid;
SELECT attr_vector_tmp - ARRAY_AGG(id::INT) INTO attr_vector_tmp FROM metabib.full_attr_id_map WHERE attr = ANY (pattr_list);
attr_vector := attr_vector || attr_vector_tmp;
END IF;
-- On to composite attributes, now that the record attrs have been pulled. Processed in name order, so later composite
-- attributes can depend on earlier ones.
PERFORM metabib.compile_composite_attr_cache_init();
FOR attr_def IN SELECT * FROM config.record_attr_definition WHERE composite AND name = ANY( attr_list ) ORDER BY name LOOP
FOR ccvm_row IN SELECT * FROM config.coded_value_map c WHERE c.ctype = attr_def.name ORDER BY value LOOP
tmp_val := metabib.compile_composite_attr( ccvm_row.id );
CONTINUE WHEN tmp_val IS NULL OR tmp_val = ''; -- nothing to do
IF attr_def.filter THEN
IF attr_vector @@ tmp_val::query_int THEN
attr_vector = attr_vector + intset(ccvm_row.id);
EXIT WHEN NOT attr_def.multi;
END IF;
END IF;
IF attr_def.sorter THEN
IF attr_vector @@ tmp_val THEN
DELETE FROM metabib.record_sorter WHERE source = rid AND attr = attr_def.name;
INSERT INTO metabib.record_sorter (source, attr, value) VALUES (rid, attr_def.name, ccvm_row.code);
END IF;
END IF;
END LOOP;
END LOOP;
IF ARRAY_LENGTH(attr_vector, 1) > 0 THEN
IF rdeleted THEN -- initial insert OR revivication
DELETE FROM metabib.record_attr_vector_list WHERE source = rid;
INSERT INTO metabib.record_attr_vector_list (source, vlist) VALUES (rid, attr_vector);
ELSE
UPDATE metabib.record_attr_vector_list SET vlist = attr_vector WHERE source = rid;
END IF;
END IF;
END;
$func$ LANGUAGE PLPGSQL;
1093 — multiple language search
Type: data
View SQL
UPDATE config.record_attr_definition SET tag = '041', sf_list = 'abdefgm' where name = 'item_lang';
1094 — multiple language search
Type: reingest
View SQL
SELECT metabib.reingest_record_attributes (record, '{item_lang}'::TEXT[])
FROM (SELECT DISTINCT record
FROM metabib.real_full_rec
WHERE tag = '041'
AND subfield IN ('a','b','d','e','f','g','m')
) x;
1095 — copy alerts
Type: schema
View SQL
CREATE OR REPLACE FUNCTION asset.copy_state (cid BIGINT) RETURNS TEXT AS $$
DECLARE
last_circ_stop TEXT;
the_copy asset.copy%ROWTYPE;
SELECT * INTO the_copy FROM asset.copy WHERE id = cid;
IF NOT FOUND THEN RETURN NULL; END IF;
IF the_copy.status = 3 THEN -- Lost
RETURN 'LOST';
ELSIF the_copy.status = 4 THEN -- Missing
RETURN 'MISSING';
ELSIF the_copy.status = 14 THEN -- Damaged
RETURN 'DAMAGED';
ELSIF the_copy.status = 17 THEN -- Lost and paid
RETURN 'LOST_AND_PAID';
END IF;
SELECT stop_fines INTO last_circ_stop
FROM action.circulation
WHERE target_copy = cid
ORDER BY xact_start DESC LIMIT 1;
IF FOUND THEN
IF last_circ_stop IN (
'CLAIMSNEVERCHECKEDOUT',
'CLAIMSRETURNED',
'LONGOVERDUE'
) THEN
RETURN last_circ_stop;
END IF;
END IF;
RETURN 'NORMAL';
END;
$$ LANGUAGE PLPGSQL;
CREATE TYPE config.copy_alert_type_state AS ENUM (
'NORMAL',
'LOST',
'LOST_AND_PAID',
'MISSING',
'DAMAGED',
'CLAIMSRETURNED',
'LONGOVERDUE',
'CLAIMSNEVERCHECKEDOUT'
);
CREATE TYPE config.copy_alert_type_event AS ENUM (
'CHECKIN',
'CHECKOUT'
);
CREATE TABLE config.copy_alert_type (
id serial primary key, -- reserve 1-100 for system
scope_org int not null references actor.org_unit (id) on delete cascade,
active bool not null default true,
name text not null unique,
state config.copy_alert_type_state,
event config.copy_alert_type_event,
in_renew bool,
invert_location bool not null default false,
at_circ bool,
at_owning bool,
next_status int[]
);
SELECT SETVAL('config.copy_alert_type_id_seq'::TEXT, 100);
CREATE OR REPLACE FUNCTION evergreen.asset_copy_alert_copy_inh_fkey() RETURNS TRIGGER AS $f$
PERFORM 1 FROM asset.copy WHERE id = NEW.copy;
IF NOT FOUND THEN
RAISE foreign_key_violation USING MESSAGE = FORMAT(
$$Referenced asset.copy id not found, copy:%s$$, NEW.copy
);
END IF;
RETURN NEW;
END;
$f$ LANGUAGE PLPGSQL VOLATILE COST 50;
CREATE TABLE actor.copy_alert_suppress (
id serial primary key,
org int not null references actor.org_unit (id) on delete cascade,
alert_type int not null references config.copy_alert_type (id) on delete cascade
);
CREATE TABLE asset.copy_alert (
id bigserial primary key,
alert_type int not null references config.copy_alert_type (id) on delete cascade,
copy bigint not null,
temp bool not null default false,
create_time timestamptz not null default now(),
create_staff bigint not null references actor.usr (id) on delete set null,
note text,
ack_time timestamptz,
ack_staff bigint references actor.usr (id) on delete set null
);
CREATE CONSTRAINT TRIGGER inherit_asset_copy_alert_copy_fkey
AFTER UPDATE OR INSERT ON asset.copy_alert
DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_copy_alert_copy_inh_fkey();
CREATE VIEW asset.active_copy_alert AS
SELECT *
FROM asset.copy_alert
WHERE ack_time IS NULL;
1096 — stock copy alert types
Type: data
View SQL
-- staff-usable alert types with no location awareness
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
VALUES (1, 1, TRUE, 'Normal checkout', 'NORMAL', 'CHECKOUT', FALSE);
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
VALUES (2, 1, TRUE, 'Normal checkin', 'NORMAL', 'CHECKIN', FALSE);
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
VALUES (3, 1, FALSE, 'Normal renewal', 'NORMAL', 'CHECKIN', TRUE);
-- copy alerts upon checkin or renewal of exceptional copy statuses are not active by
-- default; they're meant to be turned once a site is ready to fully
-- commit to using the webstaff client for circulation
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (4, 1, FALSE, 'Checkin of lost copy', 'LOST', 'CHECKIN');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (5, 1, FALSE, 'Checkin of missing copy', 'MISSING', 'CHECKIN');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (6, 1, FALSE, 'Checkin of lost-and-paid copy', 'LOST_AND_PAID', 'CHECKIN');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (7, 1, FALSE, 'Checkin of damaged copy', 'DAMAGED', 'CHECKIN');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (8, 1, FALSE, 'Checkin of claims-returned copy', 'CLAIMSRETURNED', 'CHECKIN');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (9, 1, FALSE, 'Checkin of long overdue copy', 'LONGOVERDUE', 'CHECKIN');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (10, 1, FALSE, 'Checkin of claims-never-checked-out copy', 'CLAIMSNEVERCHECKEDOUT', 'CHECKIN');
-- copy alerts upon checkout of exceptional copy statuses are not active by
-- default; they're meant to be turned once a site is ready to fully
-- commit to using the webstaff client for circulation
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (11, 1, FALSE, 'Checkout of lost copy', 'LOST', 'CHECKOUT');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (12, 1, FALSE, 'Checkout of missing copy', 'MISSING', 'CHECKOUT');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (13, 1, FALSE, 'Checkout of lost-and-paid copy', 'LOST_AND_PAID', 'CHECKOUT');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (14, 1, FALSE, 'Checkout of damaged copy', 'DAMAGED', 'CHECKOUT');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (15, 1, FALSE, 'Checkout of claims-returned copy', 'CLAIMSRETURNED', 'CHECKOUT');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (16, 1, FALSE, 'Checkout of long overdue copy', 'LONGOVERDUE', 'CHECKOUT');
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event)
VALUES (17, 1, FALSE, 'Checkout of claims-never-checked-out copy', 'CLAIMSNEVERCHECKEDOUT', 'CHECKOUT');
-- staff-usable alert types based on location
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew, at_circ)
VALUES (18, 1, FALSE, 'Normal checkout at circ lib', 'NORMAL', 'CHECKOUT', FALSE, TRUE);
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew, at_circ)
VALUES (19, 1, FALSE, 'Normal checkin at circ lib', 'NORMAL', 'CHECKIN', FALSE, TRUE);
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew, at_circ)
VALUES (20, 1, FALSE, 'Normal renewal at circ lib', 'NORMAL', 'CHECKIN', TRUE, TRUE);
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew, at_owning)
VALUES (21, 1, FALSE, 'Normal checkout at owning lib', 'NORMAL', 'CHECKOUT', FALSE, TRUE);
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew, at_owning)
VALUES (22, 1, FALSE, 'Normal checkin at owning lib', 'NORMAL', 'CHECKIN', FALSE, TRUE);
INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew, at_owning)
VALUES (23, 1, FALSE, 'Normal renewal at owning lib', 'NORMAL', 'CHECKIN', TRUE, TRUE);
1097 — yaous for open circ exists fine handling
Type: data
View SQL
INSERT INTO config.org_unit_setting_type
(name, grp, label, description, datatype)
VALUES
('circ.copy_alerts.forgive_fines_on_lost_checkin',
'circ',
oils_i18n_gettext('circ.copy_alerts.forgive_fines_on_lost_checkin',
'Forgive fines when checking out a lost item and copy alert is suppressed?',
'coust', 'label'),
oils_i18n_gettext('circ.copy_alerts.forgive_fines_on_lost_checkin',
'Controls whether fines are automatically forgiven when checking out an '||
'item that has been marked as lost, and the corresponding copy alert has been '||
'suppressed.',
'coust', 'description'),
'bool');
INSERT INTO config.org_unit_setting_type
(name, grp, label, description, datatype)
VALUES
('circ.copy_alerts.forgive_fines_on_long_overdue_checkin',
'circ',
oils_i18n_gettext('circ.copy_alerts.forgive_fines_on_long_overdue_checkin',
'Forgive fines when checking out a long-overdue item and copy alert is suppressed?',
'coust', 'label'),
oils_i18n_gettext('circ.copy_alerts.forgive_fines_on_lost_checkin',
'Controls whether fines are automatically forgiven when checking out an '||
'item that has been marked as lost, and the corresponding copy alert has been '||
'suppressed.',
'coust', 'description'),
'bool');
1098 — move legacy copy alerts
Type: data
View SQL
INSERT INTO asset.copy_alert (alert_type, copy, note, create_staff)
SELECT 1, id, alert_message, 1
FROM asset.copy
WHERE alert_message IS NOT NULL
AND alert_message <> '';
INSERT INTO asset.copy_alert (alert_type, copy, note, create_staff)
SELECT 2, id, alert_message, 1
FROM asset.copy
WHERE alert_message IS NOT NULL
AND alert_message <> '';
UPDATE asset.copy SET alert_message = NULL
WHERE alert_message IS NOT NULL;
1099 — more copy alerts active by default
Type: data
View SQL
UPDATE config.copy_alert_type
SET active = TRUE
WHERE id IN (4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17);
1100 — display field seed data
Type: data
View SQL
-- NEW config.metabib_field entries
UPDATE config.metabib_field SET display_xpath = facet_xpath, display_field = TRUE WHERE id = 33;
INSERT INTO config.metabib_field (id, field_class, name,
label, xpath, display_field, search_field, browse_field)
VALUES (
38, 'identifier', 'edition',
oils_i18n_gettext(38, 'Edition', 'cmf', 'label'),
$$//mods33:mods/mods33:originInfo//mods33:edition[1]$$,
TRUE, TRUE, FALSE
);
INSERT INTO config.metabib_field (id, field_class, name,
label, xpath, display_field, search_field, browse_field)
VALUES (
39, 'keyword', 'physical_description',
oils_i18n_gettext(39, 'Physical Descrption', 'cmf', 'label'),
$$(//mods33:mods/mods33:physicalDescription/mods33:form|//mods33:mods/mods33:physicalDescription/mods33:extent|//mods33:mods/mods33:physicalDescription/mods33:reformattingQuality|//mods33:mods/mods33:physicalDescription/mods33:internetMediaType|//mods33:mods/mods33:physicalDescription/mods33:digitalOrigin)$$,
TRUE, TRUE, FALSE
);
INSERT INTO config.metabib_field (id, field_class, name,
label, xpath, display_field, search_field, browse_field)
VALUES (
40, 'identifier', 'publisher',
oils_i18n_gettext(40, 'Publisher', 'cmf', 'label'),
$$//mods33:mods/mods33:originInfo//mods33:publisher[1]$$,
TRUE, TRUE, FALSE
);
INSERT INTO config.metabib_field (id, field_class, name,
label, xpath, display_field, search_field, browse_field)
VALUES (
41, 'keyword', 'abstract',
oils_i18n_gettext(41, 'Abstract', 'cmf', 'label'),
$$//mods33:mods/mods33:abstract$$,
TRUE, TRUE, FALSE
);
INSERT INTO config.metabib_field (id, field_class, name,
label, xpath, display_field, search_field, browse_field)
VALUES (
42, 'keyword', 'toc',
oils_i18n_gettext(42, 'Table of Contents', 'cmf', 'label'),
$$//mods33:tableOfContents$$,
TRUE, TRUE, FALSE
);
INSERT INTO config.metabib_field (id, field_class, name,
label, xpath, display_field, search_field, browse_field)
VALUES (
43, 'identifier', 'type_of_resource',
oils_i18n_gettext(43, 'Type of Resource', 'cmf', 'label'),
$$//mods33:mods/mods33:typeOfResource$$,
TRUE, FALSE, FALSE
);
INSERT INTO config.metabib_field (id, field_class, name,
label, xpath, display_field, search_field, browse_field)
VALUES (
44, 'identifier', 'pubdate',
oils_i18n_gettext(44, 'Publication Date', 'cmf', 'label'),
$$//mods33:mods/mods33:originInfo//mods33:dateIssued[@encoding="marc"]|//mods33:mods/mods33:originInfo//mods33:dateIssued[1]$$,
TRUE, FALSE, FALSE
);
INSERT INTO config.metabib_field (id, field_class, name,
label, xpath, display_field, search_field, browse_field)
VALUES (
46, 'keyword', 'bibliography',
oils_i18n_gettext(46, 'Bibliography', 'cmf', 'label'),
$$//mods33:note[@type='bibliography']$$,
TRUE, TRUE, FALSE
),(
47, 'keyword', 'thesis',
oils_i18n_gettext(47, 'Thesis', 'cmf', 'label'),
$$//mods33:note[@type='thesis']$$,
TRUE, TRUE, FALSE
),(
48, 'keyword', 'production_credits',
oils_i18n_gettext(48, 'Creation/Production Credits', 'cmf', 'label'),
$$//mods33:note[@type='creation/production credits']$$,
TRUE, TRUE, FALSE
),(
49, 'keyword', 'performers',
oils_i18n_gettext(49, 'Performers', 'cmf', 'label'),
$$//mods33:note[@type='performers']$$,
TRUE, TRUE, FALSE
),(
50, 'keyword', 'general_note',
oils_i18n_gettext(50, 'General Note', 'cmf', 'label'),
$$//mods33:note[not(@type)]$$,
TRUE, TRUE, FALSE
)
;
INSERT INTO config.metabib_field (id, field_class, name, format,
label, xpath, display_xpath, display_field, search_field, browse_field)
VALUES (
51, 'author', 'first_author', 'mods32',
oils_i18n_gettext(51, 'Author', 'cmf', 'label'),
$$//mods32:mods/mods32:name[mods32:role/mods32:roleTerm[text()='creator']][1]$$,
$$//*[local-name()='namePart']$$,
TRUE, TRUE, FALSE
);
INSERT INTO config.metabib_field (id, field_class, name, format,
label, xpath, display_xpath, display_field, search_field, browse_field)
VALUES (
52, 'identifier', 'origin_info', 'marcxml',
oils_i18n_gettext(52, 'Origin Info', 'cmf', 'label'),
$$//*[@tag='260']$$,
$$//*[local-name()='subfield' and contains('abc',@code)]$$,
TRUE, FALSE, FALSE
);
-- Modify existing config.metabib_field entries
UPDATE config.metabib_field SET display_field = TRUE WHERE id IN (
1, -- seriestitle
11, -- subject_geographic
12, -- subject_name
13, -- subject_temporal
14, -- subject_topic
19, -- ISSN
20, -- UPC
26 -- TCN
);
-- Map display field names to config.metabib_field entries
INSERT INTO config.display_field_map (name, field, multi) VALUES
('series_title', 1, TRUE),
('subject_geographic', 11, TRUE),
('subject_name', 12, TRUE),
('subject_temporal', 13, TRUE),
('subject_topic', 14, TRUE),
('issn', 19, TRUE),
('upc', 20, TRUE),
('tcn', 26, FALSE),
('edition', 38, FALSE),
('physical_description',39, TRUE),
('genre', 33, TRUE),
('bibliography', 46, TRUE),
('thesis', 47, TRUE),
('performers', 49, TRUE),
('production_credits', 48, TRUE),
('general_note', 50, TRUE),
('publisher', 52, FALSE),
('abstract', 41, FALSE),
('toc', 42, FALSE),
('type_of_resource', 43, FALSE),
('pubdate', 44, FALSE)
;
UPDATE config.display_field_map SET field = 51 WHERE name = 'author';
-- Add a column to wide-display-entry per well-known field
DROP VIEW IF EXISTS metabib.wide_display_entry;
CREATE VIEW metabib.wide_display_entry AS
SELECT
bre.id AS source,
COALESCE(mcde_title.value, 'null')::TEXT AS title,
COALESCE(mcde_author.value, 'null')::TEXT AS author,
COALESCE(mcde_subject_geographic.value, 'null')::TEXT AS subject_geographic,
COALESCE(mcde_subject_name.value, 'null')::TEXT AS subject_name,
COALESCE(mcde_subject_temporal.value, 'null')::TEXT AS subject_temporal,
COALESCE(mcde_subject_topic.value, 'null')::TEXT AS subject_topic,
COALESCE(mcde_creators.value, 'null')::TEXT AS creators,
COALESCE(mcde_isbn.value, 'null')::TEXT AS isbn,
COALESCE(mcde_issn.value, 'null')::TEXT AS issn,
COALESCE(mcde_upc.value, 'null')::TEXT AS upc,
COALESCE(mcde_tcn.value, 'null')::TEXT AS tcn,
COALESCE(mcde_edition.value, 'null')::TEXT AS edition,
COALESCE(mcde_physical_description.value, 'null')::TEXT AS physical_description,
COALESCE(mcde_publisher.value, 'null')::TEXT AS publisher,
COALESCE(mcde_series_title.value, 'null')::TEXT AS series_title,
COALESCE(mcde_abstract.value, 'null')::TEXT AS abstract,
COALESCE(mcde_toc.value, 'null')::TEXT AS toc,
COALESCE(mcde_pubdate.value, 'null')::TEXT AS pubdate,
COALESCE(mcde_type_of_resource.value, 'null')::TEXT AS type_of_resource
FROM biblio.record_entry bre
LEFT JOIN metabib.compressed_display_entry mcde_title
ON (bre.id = mcde_title.source AND mcde_title.name = 'title')
LEFT JOIN metabib.compressed_display_entry mcde_author
ON (bre.id = mcde_author.source AND mcde_author.name = 'author')
LEFT JOIN metabib.compressed_display_entry mcde_subject
ON (bre.id = mcde_subject.source AND mcde_subject.name = 'subject')
LEFT JOIN metabib.compressed_display_entry mcde_subject_geographic
ON (bre.id = mcde_subject_geographic.source
AND mcde_subject_geographic.name = 'subject_geographic')
LEFT JOIN metabib.compressed_display_entry mcde_subject_name
ON (bre.id = mcde_subject_name.source
AND mcde_subject_name.name = 'subject_name')
LEFT JOIN metabib.compressed_display_entry mcde_subject_temporal
ON (bre.id = mcde_subject_temporal.source
AND mcde_subject_temporal.name = 'subject_temporal')
LEFT JOIN metabib.compressed_display_entry mcde_subject_topic
ON (bre.id = mcde_subject_topic.source
AND mcde_subject_topic.name = 'subject_topic')
LEFT JOIN metabib.compressed_display_entry mcde_creators
ON (bre.id = mcde_creators.source AND mcde_creators.name = 'creators')
LEFT JOIN metabib.compressed_display_entry mcde_isbn
ON (bre.id = mcde_isbn.source AND mcde_isbn.name = 'isbn')
LEFT JOIN metabib.compressed_display_entry mcde_issn
ON (bre.id = mcde_issn.source AND mcde_issn.name = 'issn')
LEFT JOIN metabib.compressed_display_entry mcde_upc
ON (bre.id = mcde_upc.source AND mcde_upc.name = 'upc')
LEFT JOIN metabib.compressed_display_entry mcde_tcn
ON (bre.id = mcde_tcn.source AND mcde_tcn.name = 'tcn')
LEFT JOIN metabib.compressed_display_entry mcde_edition
ON (bre.id = mcde_edition.source AND mcde_edition.name = 'edition')
LEFT JOIN metabib.compressed_display_entry mcde_physical_description
ON (bre.id = mcde_physical_description.source
AND mcde_physical_description.name = 'physical_description')
LEFT JOIN metabib.compressed_display_entry mcde_publisher
ON (bre.id = mcde_publisher.source AND mcde_publisher.name = 'publisher')
LEFT JOIN metabib.compressed_display_entry mcde_series_title
ON (bre.id = mcde_series_title.source AND mcde_series_title.name = 'series_title')
LEFT JOIN metabib.compressed_display_entry mcde_abstract
ON (bre.id = mcde_abstract.source AND mcde_abstract.name = 'abstract')
LEFT JOIN metabib.compressed_display_entry mcde_toc
ON (bre.id = mcde_toc.source AND mcde_toc.name = 'toc')
LEFT JOIN metabib.compressed_display_entry mcde_pubdate
ON (bre.id = mcde_pubdate.source AND mcde_pubdate.name = 'pubdate')
LEFT JOIN metabib.compressed_display_entry mcde_type_of_resource
ON (bre.id = mcde_type_of_resource.source
AND mcde_type_of_resource.name = 'type_of_resource')
;
CREATE OR REPLACE VIEW reporter.old_super_simple_record AS
SELECT r.id,
r.fingerprint,
r.quality,
r.tcn_source,
r.tcn_value,
evergreen.oils_json_to_text(d.title) AS title,
evergreen.oils_json_to_text(d.author) AS author,
evergreen.oils_json_to_text(d.publisher) AS publisher,
evergreen.oils_json_to_text(d.pubdate) AS pubdate,
CASE WHEN d.isbn = 'null'
THEN NULL
ELSE (SELECT ARRAY(SELECT json_array_elements_text(d.isbn::JSON)))
END AS isbn,
CASE WHEN d.issn = 'null'
THEN NULL
ELSE (SELECT ARRAY(SELECT json_array_elements_text(d.issn::JSON)))
END AS issn
FROM biblio.record_entry r
JOIN metabib.wide_display_entry d ON (r.id = d.source);
1101 — highlight search
Type: schema
View SQL
ALTER TABLE config.metabib_field ALTER COLUMN xpath DROP NOT NULL;
CREATE TABLE config.metabib_field_virtual_map (
id SERIAL PRIMARY KEY,
real INT NOT NULL REFERENCES config.metabib_field (id),
virtual INT NOT NULL REFERENCES config.metabib_field (id),
weight INT NOT NULL DEFAULT 1
);
COMMENT ON TABLE config.metabib_field_virtual_map IS $$
Maps between real (physically extracted) index definitions
and virtual (target sync, no required extraction of its own)
index definitions.
The virtual side may not extract any data of its own, but
will collect data from all of the real fields. This reduces
extraction (ingest) overhead by eliminating duplcated extraction,
and allows for searching across novel combinations of fields, such
as names used as either subjects or authors. By preserving this
mapping rather than defining duplicate extractions, information
about the originating, "real" index definitions can be used
in interesting ways, such as highlighting in search results.
$$;
CREATE OR REPLACE VIEW metabib.combined_all_field_entry AS
SELECT * FROM metabib.combined_title_field_entry
UNION ALL
SELECT * FROM metabib.combined_author_field_entry
UNION ALL
SELECT * FROM metabib.combined_subject_field_entry
UNION ALL
SELECT * FROM metabib.combined_keyword_field_entry
UNION ALL
SELECT * FROM metabib.combined_identifier_field_entry
UNION ALL
SELECT * FROM metabib.combined_series_field_entry;
CREATE OR REPLACE FUNCTION biblio.extract_metabib_field_entry (
rid BIGINT,
default_joiner TEXT,
field_types TEXT[],
only_fields INT[]
) RETURNS SETOF metabib.field_entry_template AS $func$
DECLARE
bib biblio.record_entry%ROWTYPE;
idx config.metabib_field%ROWTYPE;
xfrm config.xml_transform%ROWTYPE;
prev_xfrm TEXT;
transformed_xml TEXT;
xml_node TEXT;
xml_node_list TEXT[];
facet_text TEXT;
display_text TEXT;
browse_text TEXT;
sort_value TEXT;
raw_text TEXT;
curr_text TEXT;
joiner TEXT := default_joiner; -- XXX will index defs supply a joiner?
authority_text TEXT;
authority_link BIGINT;
output_row metabib.field_entry_template%ROWTYPE;
process_idx BOOL;
-- Start out with no field-use bools set
output_row.browse_field = FALSE;
output_row.facet_field = FALSE;
output_row.display_field = FALSE;
output_row.search_field = FALSE;
-- Get the record
SELECT INTO bib * FROM biblio.record_entry WHERE id = rid;
-- Loop over the indexing entries
FOR idx IN SELECT * FROM config.metabib_field WHERE id = ANY (only_fields) ORDER BY format LOOP
CONTINUE WHEN idx.xpath IS NULL OR idx.xpath = ''; -- pure virtual field
process_idx := FALSE;
IF idx.display_field AND 'display' = ANY (field_types) THEN process_idx = TRUE; END IF;
IF idx.browse_field AND 'browse' = ANY (field_types) THEN process_idx = TRUE; END IF;
IF idx.search_field AND 'search' = ANY (field_types) THEN process_idx = TRUE; END IF;
IF idx.facet_field AND 'facet' = ANY (field_types) THEN process_idx = TRUE; END IF;
CONTINUE WHEN process_idx = FALSE; -- disabled for all types
joiner := COALESCE(idx.joiner, default_joiner);
SELECT INTO xfrm * from config.xml_transform WHERE name = idx.format;
-- See if we can skip the XSLT ... it's expensive
IF prev_xfrm IS NULL OR prev_xfrm <> xfrm.name THEN
-- Can't skip the transform
IF xfrm.xslt <> '---' THEN
transformed_xml := oils_xslt_process(bib.marc,xfrm.xslt);
ELSE
transformed_xml := bib.marc;
END IF;
prev_xfrm := xfrm.name;
END IF;
xml_node_list := oils_xpath( idx.xpath, transformed_xml, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
raw_text := NULL;
FOR xml_node IN SELECT x FROM unnest(xml_node_list) AS x LOOP
CONTINUE WHEN xml_node !~ E'^\\s*<';
-- XXX much of this should be moved into oils_xpath_string...
curr_text := ARRAY_TO_STRING(evergreen.array_remove_item_by_value(evergreen.array_remove_item_by_value(
oils_xpath( '//text()', -- get the content of all the nodes within the main selected node
REGEXP_REPLACE( xml_node, E'\\s+', ' ', 'g' ) -- Translate adjacent whitespace to a single space
), ' '), ''), -- throw away morally empty (bankrupt?) strings
joiner
);
CONTINUE WHEN curr_text IS NULL OR curr_text = '';
IF raw_text IS NOT NULL THEN
raw_text := raw_text || joiner;
END IF;
raw_text := COALESCE(raw_text,'') || curr_text;
-- autosuggest/metabib.browse_entry
IF idx.browse_field THEN
IF idx.browse_xpath IS NOT NULL AND idx.browse_xpath <> '' THEN
browse_text := oils_xpath_string( idx.browse_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
ELSE
browse_text := curr_text;
END IF;
IF idx.browse_sort_xpath IS NOT NULL AND
idx.browse_sort_xpath <> '' THEN
sort_value := oils_xpath_string(
idx.browse_sort_xpath, xml_node, joiner,
ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]]
);
ELSE
sort_value := browse_text;
END IF;
output_row.field_class = idx.field_class;
output_row.field = idx.id;
output_row.source = rid;
output_row.value = BTRIM(REGEXP_REPLACE(browse_text, E'\\s+', ' ', 'g'));
output_row.sort_value :=
public.naco_normalize(sort_value);
output_row.authority := NULL;
IF idx.authority_xpath IS NOT NULL AND idx.authority_xpath <> '' THEN
authority_text := oils_xpath_string(
idx.authority_xpath, xml_node, joiner,
ARRAY[
ARRAY[xfrm.prefix, xfrm.namespace_uri],
ARRAY['xlink','http://www.w3.org/1999/xlink']
]
);
IF authority_text ~ '^\d+$' THEN
authority_link := authority_text::BIGINT;
PERFORM * FROM authority.record_entry WHERE id = authority_link;
IF FOUND THEN
output_row.authority := authority_link;
END IF;
END IF;
END IF;
output_row.browse_field = TRUE;
-- Returning browse rows with search_field = true for search+browse
-- configs allows us to retain granularity of being able to search
-- browse fields with "starts with" type operators (for example, for
-- titles of songs in music albums)
IF idx.search_field THEN
output_row.search_field = TRUE;
END IF;
RETURN NEXT output_row;
output_row.browse_field = FALSE;
output_row.search_field = FALSE;
output_row.sort_value := NULL;
END IF;
-- insert raw node text for faceting
IF idx.facet_field THEN
IF idx.facet_xpath IS NOT NULL AND idx.facet_xpath <> '' THEN
facet_text := oils_xpath_string( idx.facet_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
ELSE
facet_text := curr_text;
END IF;
output_row.field_class = idx.field_class;
output_row.field = -1 * idx.id;
output_row.source = rid;
output_row.value = BTRIM(REGEXP_REPLACE(facet_text, E'\\s+', ' ', 'g'));
output_row.facet_field = TRUE;
RETURN NEXT output_row;
output_row.facet_field = FALSE;
END IF;
-- insert raw node text for display
IF idx.display_field THEN
IF idx.display_xpath IS NOT NULL AND idx.display_xpath <> '' THEN
display_text := oils_xpath_string( idx.display_xpath, xml_node, joiner, ARRAY[ARRAY[xfrm.prefix, xfrm.namespace_uri]] );
ELSE
display_text := curr_text;
END IF;
output_row.field_class = idx.field_class;
output_row.field = -1 * idx.id;
output_row.source = rid;
output_row.value = BTRIM(REGEXP_REPLACE(display_text, E'\\s+', ' ', 'g'));
output_row.display_field = TRUE;
RETURN NEXT output_row;
output_row.display_field = FALSE;
END IF;
END LOOP;
CONTINUE WHEN raw_text IS NULL OR raw_text = '';
-- insert combined node text for searching
IF idx.search_field THEN
output_row.field_class = idx.field_class;
output_row.field = idx.id;
output_row.source = rid;
output_row.value = BTRIM(REGEXP_REPLACE(raw_text, E'\\s+', ' ', 'g'));
output_row.search_field = TRUE;
RETURN NEXT output_row;
output_row.search_field = FALSE;
END IF;
END LOOP;
END;
$func$ LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION metabib.update_combined_index_vectors(bib_id BIGINT) RETURNS VOID AS $func$
DECLARE
rdata TSVECTOR;
vclass TEXT;
vfield INT;
rfields INT[];
DELETE FROM metabib.combined_keyword_field_entry WHERE record = bib_id;
INSERT INTO metabib.combined_keyword_field_entry(record, metabib_field, index_vector)
SELECT bib_id, field, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.keyword_field_entry WHERE source = bib_id GROUP BY field;
INSERT INTO metabib.combined_keyword_field_entry(record, metabib_field, index_vector)
SELECT bib_id, NULL, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.keyword_field_entry WHERE source = bib_id;
DELETE FROM metabib.combined_title_field_entry WHERE record = bib_id;
INSERT INTO metabib.combined_title_field_entry(record, metabib_field, index_vector)
SELECT bib_id, field, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.title_field_entry WHERE source = bib_id GROUP BY field;
INSERT INTO metabib.combined_title_field_entry(record, metabib_field, index_vector)
SELECT bib_id, NULL, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.title_field_entry WHERE source = bib_id;
DELETE FROM metabib.combined_author_field_entry WHERE record = bib_id;
INSERT INTO metabib.combined_author_field_entry(record, metabib_field, index_vector)
SELECT bib_id, field, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.author_field_entry WHERE source = bib_id GROUP BY field;
INSERT INTO metabib.combined_author_field_entry(record, metabib_field, index_vector)
SELECT bib_id, NULL, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.author_field_entry WHERE source = bib_id;
DELETE FROM metabib.combined_subject_field_entry WHERE record = bib_id;
INSERT INTO metabib.combined_subject_field_entry(record, metabib_field, index_vector)
SELECT bib_id, field, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.subject_field_entry WHERE source = bib_id GROUP BY field;
INSERT INTO metabib.combined_subject_field_entry(record, metabib_field, index_vector)
SELECT bib_id, NULL, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.subject_field_entry WHERE source = bib_id;
DELETE FROM metabib.combined_series_field_entry WHERE record = bib_id;
INSERT INTO metabib.combined_series_field_entry(record, metabib_field, index_vector)
SELECT bib_id, field, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.series_field_entry WHERE source = bib_id GROUP BY field;
INSERT INTO metabib.combined_series_field_entry(record, metabib_field, index_vector)
SELECT bib_id, NULL, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.series_field_entry WHERE source = bib_id;
DELETE FROM metabib.combined_identifier_field_entry WHERE record = bib_id;
INSERT INTO metabib.combined_identifier_field_entry(record, metabib_field, index_vector)
SELECT bib_id, field, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.identifier_field_entry WHERE source = bib_id GROUP BY field;
INSERT INTO metabib.combined_identifier_field_entry(record, metabib_field, index_vector)
SELECT bib_id, NULL, strip(COALESCE(string_agg(index_vector::TEXT,' '),'')::tsvector)
FROM metabib.identifier_field_entry WHERE source = bib_id;
-- For each virtual def, gather the data from the combined real field
-- entries and append it to the virtual combined entry.
FOR vfield, rfields IN SELECT virtual, ARRAY_AGG(real) FROM config.metabib_field_virtual_map GROUP BY virtual LOOP
SELECT field_class INTO vclass
FROM config.metabib_field
WHERE id = vfield;
SELECT string_agg(index_vector::TEXT,' ')::tsvector INTO rdata
FROM metabib.combined_all_field_entry
WHERE record = bib_id
AND metabib_field = ANY (rfields);
BEGIN -- I cannot wait for INSERT ON CONFLICT ... 9.5, though
EXECUTE $$
INSERT INTO metabib.combined_$$ || vclass || $$_field_entry
(record, metabib_field, index_vector) VALUES ($1, $2, $3)
$$ USING bib_id, vfield, rdata;
EXCEPTION WHEN unique_violation THEN
EXECUTE $$
UPDATE metabib.combined_$$ || vclass || $$_field_entry
SET index_vector = index_vector || $3
WHERE record = $1
AND metabib_field = $2
$$ USING bib_id, vfield, rdata;
WHEN OTHERS THEN
-- ignore and move on
END;
END LOOP;
END;
$func$ LANGUAGE PLPGSQL;
CREATE OR REPLACE VIEW search.best_tsconfig AS
SELECT m.id AS id,
COALESCE(f.ts_config, c.ts_config, 'simple') AS ts_config
FROM config.metabib_field m
LEFT JOIN config.metabib_class_ts_map c ON (c.field_class = m.field_class AND c.index_weight = 'C')
LEFT JOIN config.metabib_field_ts_map f ON (f.metabib_field = m.id AND f.index_weight = 'C');
CREATE TYPE search.highlight_result AS ( id BIGINT, source BIGINT, field INT, value TEXT, highlight TEXT );
CREATE OR REPLACE FUNCTION search.highlight_display_fields_impl(
rid BIGINT,
tsq TEXT,
field_list INT[] DEFAULT '{}'::INT[],
css_class TEXT DEFAULT 'oils_SH',
hl_all BOOL DEFAULT TRUE,
minwords INT DEFAULT 5,
maxwords INT DEFAULT 25,
shortwords INT DEFAULT 0,
maxfrags INT DEFAULT 0,
delimiter TEXT DEFAULT ' ... '
) RETURNS SETOF search.highlight_result AS $f$
DECLARE
opts TEXT := '';
v_css_class TEXT := css_class;
v_delimiter TEXT := delimiter;
v_field_list INT[] := field_list;
hl_query TEXT;
IF v_delimiter LIKE $$%'%$$ OR v_delimiter LIKE '%"%' THEN --"
v_delimiter := ' ... ';
END IF;
IF NOT hl_all THEN
opts := opts || 'MinWords=' || minwords;
opts := opts || ', MaxWords=' || maxwords;
opts := opts || ', ShortWords=' || shortwords;
opts := opts || ', MaxFragments=' || maxfrags;
opts := opts || ', FragmentDelimiter="' || delimiter || '"';
ELSE
opts := opts || 'HighlightAll=TRUE';
END IF;
IF v_css_class LIKE $$%'%$$ OR v_css_class LIKE '%"%' THEN -- "
v_css_class := 'oils_SH';
END IF;
opts := opts || $$, StopSel=</b>, StartSel="<b class='$$ || v_css_class; -- "
IF v_field_list = '{}'::INT[] THEN
SELECT ARRAY_AGG(id) INTO v_field_list FROM config.metabib_field WHERE display_field;
END IF;
hl_query := $$
SELECT de.id,
de.source,
de.field,
de.value AS value,
ts_headline(
ts_config::REGCONFIG,
evergreen.escape_for_html(de.value),
$$ || quote_literal(tsq) || $$,
$1 || ' ' || mf.field_class || ' ' || mf.name || $xx$'>"$xx$ -- "'
) AS highlight
FROM metabib.display_entry de
JOIN config.metabib_field mf ON (mf.id = de.field)
JOIN search.best_tsconfig t ON (t.id = de.field)
WHERE de.source = $2
AND field = ANY ($3)
ORDER BY de.id;$$;
RETURN QUERY EXECUTE hl_query USING opts, rid, v_field_list;
END;
$f$ LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION evergreen.escape_for_html (TEXT) RETURNS TEXT AS $$
SELECT regexp_replace(
regexp_replace(
regexp_replace(
$1,
'&',
'&',
'g'
),
'<',
'<',
'g'
),
'>',
'>',
'g'
);
$$ LANGUAGE SQL IMMUTABLE LEAKPROOF STRICT COST 10;
CREATE OR REPLACE FUNCTION search.highlight_display_fields(
rid BIGINT,
tsq_map TEXT, -- { '(a | b) & c' => '1,2,3,4', ...}
css_class TEXT DEFAULT 'oils_SH',
hl_all BOOL DEFAULT TRUE,
minwords INT DEFAULT 5,
maxwords INT DEFAULT 25,
shortwords INT DEFAULT 0,
maxfrags INT DEFAULT 0,
delimiter TEXT DEFAULT ' ... '
) RETURNS SETOF search.highlight_result AS $f$
DECLARE
tsq_hstore HSTORE;
tsq TEXT;
fields TEXT;
afields INT[];
seen INT[];
IF (tsq_map ILIKE 'hstore%') THEN
EXECUTE 'SELECT ' || tsq_map INTO tsq_hstore;
ELSE
tsq_hstore := tsq_map::HSTORE;
END IF;
FOR tsq, fields IN SELECT key, value FROM each(tsq_hstore::HSTORE) LOOP
SELECT ARRAY_AGG(unnest::INT) INTO afields
FROM unnest(regexp_split_to_array(fields,','));
seen := seen || afields;
RETURN QUERY
SELECT * FROM search.highlight_display_fields_impl(
rid, tsq, afields, css_class, hl_all,minwords,
maxwords, shortwords, maxfrags, delimiter
);
END LOOP;
RETURN QUERY
SELECT id,
source,
field,
value,
value AS highlight
FROM metabib.display_entry
WHERE source = rid
AND NOT (field = ANY (seen));
END;
$f$ LANGUAGE PLPGSQL ROWS 10;
CREATE OR REPLACE FUNCTION metabib.remap_metarecord_for_bib(
bib_id bigint,
fp text,
bib_is_deleted boolean DEFAULT false,
retain_deleted boolean DEFAULT false
) RETURNS bigint AS $function$
DECLARE
new_mapping BOOL := TRUE;
source_count INT;
old_mr BIGINT;
tmp_mr metabib.metarecord%ROWTYPE;
deleted_mrs BIGINT[];
-- We need to make sure we're not a deleted master record of an MR
IF bib_is_deleted THEN
IF NOT retain_deleted THEN -- Go away for any MR that we're master of, unless retained
DELETE FROM metabib.metarecord_source_map WHERE source = bib_id;
END IF;
FOR old_mr IN SELECT id FROM metabib.metarecord WHERE master_record = bib_id LOOP
-- Now, are there any more sources on this MR?
SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = old_mr;
IF source_count = 0 AND NOT retain_deleted THEN -- No other records
deleted_mrs := ARRAY_APPEND(deleted_mrs, old_mr); -- Just in case...
DELETE FROM metabib.metarecord WHERE id = old_mr;
ELSE -- indeed there are. Update it with a null cache and recalcualated master record
UPDATE metabib.metarecord
SET mods = NULL,
master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
WHERE id = old_mr;
END IF;
END LOOP;
ELSE -- insert or update
FOR tmp_mr IN SELECT m.* FROM metabib.metarecord m JOIN metabib.metarecord_source_map s ON (s.metarecord = m.id) WHERE s.source = bib_id LOOP
-- Find the first fingerprint-matching
IF old_mr IS NULL AND fp = tmp_mr.fingerprint THEN
old_mr := tmp_mr.id;
new_mapping := FALSE;
ELSE -- Our fingerprint changed ... maybe remove the old MR
DELETE FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id AND source = bib_id; -- remove the old source mapping
SELECT COUNT(*) INTO source_count FROM metabib.metarecord_source_map WHERE metarecord = tmp_mr.id;
IF source_count = 0 THEN -- No other records
deleted_mrs := ARRAY_APPEND(deleted_mrs, tmp_mr.id);
DELETE FROM metabib.metarecord WHERE id = tmp_mr.id;
END IF;
END IF;
END LOOP;
-- we found no suitable, preexisting MR based on old source maps
IF old_mr IS NULL THEN
SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp; -- is there one for our current fingerprint?
IF old_mr IS NULL THEN -- nope, create one and grab its id
INSERT INTO metabib.metarecord ( fingerprint, master_record ) VALUES ( fp, bib_id );
SELECT id INTO old_mr FROM metabib.metarecord WHERE fingerprint = fp;
ELSE -- indeed there is. update it with a null cache and recalcualated master record
UPDATE metabib.metarecord
SET mods = NULL,
master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
WHERE id = old_mr;
END IF;
ELSE -- there was one we already attached to, update its mods cache and master_record
UPDATE metabib.metarecord
SET mods = NULL,
master_record = ( SELECT id FROM biblio.record_entry WHERE fingerprint = fp AND NOT deleted ORDER BY quality DESC LIMIT 1)
WHERE id = old_mr;
END IF;
IF new_mapping THEN
INSERT INTO metabib.metarecord_source_map (metarecord, source) VALUES (old_mr, bib_id); -- new source mapping
END IF;
END IF;
IF ARRAY_UPPER(deleted_mrs,1) > 0 THEN
UPDATE action.hold_request SET target = old_mr WHERE target IN ( SELECT unnest(deleted_mrs) ) AND hold_type = 'M'; -- if we had to delete any MRs above, make sure their holds are moved
END IF;
RETURN old_mr;
END;
$function$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION evergreen.marc_to (marc text, xfrm text) RETURNS TEXT AS $$
SELECT evergreen.xml_pretty_print(xslt_process($1,xslt)::XML)::TEXT FROM config.xml_transform WHERE name = $2;
$$ LANGUAGE SQL;
1102 — mods title punctuation change
Type: data
View SQL
update config.xml_transform set xslt = $XXXX$<?xml version="1.0" encoding="UTF-8"?>
<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">
<xsl:output encoding="UTF-8" indent="yes" method="xml"/>
<!--
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
Revision 1.13 - Changed order of output under cartographics to reflect schema 2006/11/28 tmee
Revision 1.12 - Updated to reflect MODS 3.2 Mapping 2006/10/11 tmee
Revision 1.11 - The attribute objectPart moved from <languageTerm> to <language>
2006/04/08 jrad
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
Revision 1.9 subfield $y was added to field 242 2004/09/02 10:57 jrad
Revision 1.8 Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
Revision 1.7 2004/03/25 08:29 jrad
Revision 1.6 various validation fixes 2004/02/20 ntra
Revision 1.5 2003/10/02 16:18:58 ntra
MODS2 to MODS3 updates, language unstacking and
de-duping, chopPunctuation expanded
Revision 1.3 2003/04/03 00:07:19 ntra
Revision 1.3 Additional Changes not related to MODS Version 2.0 by ntra
Revision 1.2 2003/03/24 19:37:42 ckeith
Added Log Comment
-->
<xsl:template match="/">
<xsl:choose>
<xsl:when test="//marc:collection">
<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">
<xsl:for-each select="//marc:collection/marc:record">
<mods version="3.2">
<xsl:call-template name="marcRecord"/>
</mods>
</xsl:for-each>
</modsCollection>
</xsl:when>
<xsl:otherwise>
<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">
<xsl:for-each select="//marc:record">
<xsl:call-template name="marcRecord"/>
</xsl:for-each>
</mods>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="marcRecord">
<xsl:variable name="leader" select="marc:leader"/>
<xsl:variable name="leader6" select="substring($leader,7,1)"/>
<xsl:variable name="leader7" select="substring($leader,8,1)"/>
<xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
<xsl:variable name="typeOf008">
<xsl:choose>
<xsl:when test="$leader6='a'">
<xsl:choose>
<xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
<xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test="$leader6='t'">BK</xsl:when>
<xsl:when test="$leader6='p'">MM</xsl:when>
<xsl:when test="$leader6='m'">CF</xsl:when>
<xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
<xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
<xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'">MU</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:for-each select="marc:datafield[@tag='245']">
<titleInfo>
<xsl:variable name="title">
<xsl:choose>
<xsl:when test="marc:subfield[@code='b']">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">b</xsl:with-param>
<xsl:with-param name="beforeCodes">afgk</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abfgk</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="titleChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="$title"/>
</xsl:with-param>
<xsl:with-param name="punctuation">
<xsl:text>,;/ </xsl:text>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="@ind2>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,@ind2)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,@ind2+1)"/>
</title>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop"/>
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="marc:subfield[@code='b']">
<subTitle>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">b</xsl:with-param>
<xsl:with-param name="anyCodes">b</xsl:with-param>
<xsl:with-param name="afterCodes">afgk</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</subTitle>
</xsl:if>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<!-- A form of title that ignores non-filing characters; useful
for not converting "L'Oreal" into "L' Oreal" at index time -->
<titleNonfiling>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abfgk</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"></xsl:call-template>
</titleNonfiling>
<!-- hybrid of titleInfo and titleNonfiling which will give us a preformatted string (for punctuation)
but also keep the nonSort stuff in a separate field (for sorting) -->
<titleBrowse>
<xsl:variable name="titleBrowseChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abfgk</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="@ind2>0">
<nonSort>
<xsl:value-of select="substring($titleBrowseChop,1,@ind2)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleBrowseChop,@ind2+1)"/>
</title>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleBrowseChop"/>
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="part"></xsl:call-template>
</titleBrowse>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='210']">
<titleInfo type="abbreviated">
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">a</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="subtitle"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='242']">
<xsl:variable name="titleChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<!-- 1/04 removed $h, b -->
<xsl:with-param name="codes">a</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<titleInfo type="translated">
<!--09/01/04 Added subfield $y-->
<xsl:for-each select="marc:subfield[@code='y']">
<xsl:attribute name="lang">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>
<title>
<xsl:value-of select="$titleChop" />
</title>
<!-- 1/04 fix -->
<xsl:call-template name="subtitle"/>
<xsl:call-template name="part"/>
</titleInfo>
<titleInfo type="translated-nfi">
<xsl:for-each select="marc:subfield[@code='y']">
<xsl:attribute name="lang">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>
<xsl:choose>
<xsl:when test="@ind2>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,@ind2)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,@ind2+1)"/>
</title>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop" />
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="subtitle"/>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='246']">
<titleInfo type="alternative">
<xsl:for-each select="marc:subfield[@code='i']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<!-- 1/04 removed $h, $b -->
<xsl:with-param name="codes">af</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="subtitle"/>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='130']|marc:datafield[@tag='240']|marc:datafield[@tag='730'][@ind2!='2']">
<xsl:variable name="nfi">
<xsl:choose>
<xsl:when test="@tag='240'">
<xsl:value-of select="@ind2"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@ind1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="titleChop">
<xsl:call-template name="uri" />
<xsl:variable name="str">
<xsl:for-each select="marc:subfield">
<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'])))">
<xsl:value-of select="text()"/>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<titleInfo type="uniform">
<title>
<xsl:value-of select="$titleChop"/>
</title>
<xsl:call-template name="part"/>
</titleInfo>
<titleInfo type="uniform-nfi">
<xsl:choose>
<xsl:when test="$nfi>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,$nfi)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,$nfi+1)"/>
</title>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop"/>
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='740'][@ind2!='2']">
<xsl:variable name="titleChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ah</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<titleInfo type="alternative">
<title>
<xsl:value-of select="$titleChop" />
</title>
<xsl:call-template name="part"/>
</titleInfo>
<titleInfo type="alternative-nfi">
<xsl:choose>
<xsl:when test="@ind1>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,@ind1)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,@ind1+1)"/>
</title>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop" />
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='100']">
<name type="personal">
<xsl:call-template name="uri" />
<xsl:call-template name="nameABCDQ"/>
<xsl:call-template name="affiliation"/>
<role>
<roleTerm authority="marcrelator" type="text">creator</roleTerm>
</role>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='110']">
<name type="corporate">
<xsl:call-template name="uri" />
<xsl:call-template name="nameABCDN"/>
<role>
<roleTerm authority="marcrelator" type="text">creator</roleTerm>
</role>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='111']">
<name type="conference">
<xsl:call-template name="uri" />
<xsl:call-template name="nameACDEQ"/>
<role>
<roleTerm authority="marcrelator" type="text">creator</roleTerm>
</role>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='700'][not(marc:subfield[@code='t'])]">
<name type="personal">
<xsl:call-template name="uri" />
<xsl:call-template name="nameABCDQ"/>
<xsl:call-template name="affiliation"/>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='710'][not(marc:subfield[@code='t'])]">
<name type="corporate">
<xsl:call-template name="uri" />
<xsl:call-template name="nameABCDN"/>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='711'][not(marc:subfield[@code='t'])]">
<name type="conference">
<xsl:call-template name="uri" />
<xsl:call-template name="nameACDEQ"/>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='720'][not(marc:subfield[@code='t'])]">
<name>
<xsl:if test="@ind1=1">
<xsl:attribute name="type">
<xsl:text>personal</xsl:text>
</xsl:attribute>
</xsl:if>
<namePart>
<xsl:value-of select="marc:subfield[@code='a']"/>
</namePart>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<typeOfResource>
<xsl:if test="$leader7='c'">
<xsl:attribute name="collection">yes</xsl:attribute>
</xsl:if>
<xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
<xsl:attribute name="manuscript">yes</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
<xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
<xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
<xsl:when test="$leader6='i'">sound recording-nonmusical</xsl:when>
<xsl:when test="$leader6='j'">sound recording-musical</xsl:when>
<xsl:when test="$leader6='k'">still image</xsl:when>
<xsl:when test="$leader6='g'">moving image</xsl:when>
<xsl:when test="$leader6='r'">three dimensional object</xsl:when>
<xsl:when test="$leader6='m'">software, multimedia</xsl:when>
<xsl:when test="$leader6='p'">mixed material</xsl:when>
</xsl:choose>
</typeOfResource>
<xsl:if test="substring($controlField008,26,1)='d'">
<genre authority="marc">globe</genre>
</xsl:if>
<xsl:if test="marc:controlfield[@tag='007'][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
<genre authority="marc">remote sensing image</genre>
</xsl:if>
<xsl:if test="$typeOf008='MP'">
<xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"></xsl:variable>
<xsl:choose>
<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']">
<genre authority="marc">map</genre>
</xsl:when>
<xsl:when test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
<genre authority="marc">atlas</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='SE'">
<xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"></xsl:variable>
<xsl:choose>
<xsl:when test="$controlField008-21='d'">
<genre authority="marc">database</genre>
</xsl:when>
<xsl:when test="$controlField008-21='l'">
<genre authority="marc">loose-leaf</genre>
</xsl:when>
<xsl:when test="$controlField008-21='m'">
<genre authority="marc">series</genre>
</xsl:when>
<xsl:when test="$controlField008-21='n'">
<genre authority="marc">newspaper</genre>
</xsl:when>
<xsl:when test="$controlField008-21='p'">
<genre authority="marc">periodical</genre>
</xsl:when>
<xsl:when test="$controlField008-21='w'">
<genre authority="marc">web site</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
<xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"></xsl:variable>
<xsl:choose>
<xsl:when test="contains($controlField008-24,'a')">
<genre authority="marc">abstract or summary</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'b')">
<genre authority="marc">bibliography</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'c')">
<genre authority="marc">catalog</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'d')">
<genre authority="marc">dictionary</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'e')">
<genre authority="marc">encyclopedia</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'f')">
<genre authority="marc">handbook</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'g')">
<genre authority="marc">legal article</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'i')">
<genre authority="marc">index</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'k')">
<genre authority="marc">discography</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'l')">
<genre authority="marc">legislation</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'m')">
<genre authority="marc">theses</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'n')">
<genre authority="marc">survey of literature</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'o')">
<genre authority="marc">review</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'p')">
<genre authority="marc">programmed text</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'q')">
<genre authority="marc">filmography</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'r')">
<genre authority="marc">directory</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'s')">
<genre authority="marc">statistics</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'t')">
<genre authority="marc">technical report</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'v')">
<genre authority="marc">legal case and case notes</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'w')">
<genre authority="marc">law report or digest</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'z')">
<genre authority="marc">treaty</genre>
</xsl:when>
</xsl:choose>
<xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"></xsl:variable>
<xsl:choose>
<xsl:when test="$controlField008-29='1'">
<genre authority="marc">conference publication</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='CF'">
<xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"></xsl:variable>
<xsl:choose>
<xsl:when test="$controlField008-26='a'">
<genre authority="marc">numeric data</genre>
</xsl:when>
<xsl:when test="$controlField008-26='e'">
<genre authority="marc">database</genre>
</xsl:when>
<xsl:when test="$controlField008-26='f'">
<genre authority="marc">font</genre>
</xsl:when>
<xsl:when test="$controlField008-26='g'">
<genre authority="marc">game</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='BK'">
<xsl:if test="substring($controlField008,25,1)='j'">
<genre authority="marc">patent</genre>
</xsl:if>
<xsl:if test="substring($controlField008,31,1)='1'">
<genre authority="marc">festschrift</genre>
</xsl:if>
<xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"></xsl:variable>
<xsl:if test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
<genre authority="marc">biography</genre>
</xsl:if>
<xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"></xsl:variable>
<xsl:choose>
<xsl:when test="$controlField008-33='e'">
<genre authority="marc">essay</genre>
</xsl:when>
<xsl:when test="$controlField008-33='d'">
<genre authority="marc">drama</genre>
</xsl:when>
<xsl:when test="$controlField008-33='c'">
<genre authority="marc">comic strip</genre>
</xsl:when>
<xsl:when test="$controlField008-33='l'">
<genre authority="marc">fiction</genre>
</xsl:when>
<xsl:when test="$controlField008-33='h'">
<genre authority="marc">humor, satire</genre>
</xsl:when>
<xsl:when test="$controlField008-33='i'">
<genre authority="marc">letter</genre>
</xsl:when>
<xsl:when test="$controlField008-33='f'">
<genre authority="marc">novel</genre>
</xsl:when>
<xsl:when test="$controlField008-33='j'">
<genre authority="marc">short story</genre>
</xsl:when>
<xsl:when test="$controlField008-33='s'">
<genre authority="marc">speech</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='MU'">
<xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"></xsl:variable>
<xsl:if test="contains($controlField008-30-31,'b')">
<genre authority="marc">biography</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'c')">
<genre authority="marc">conference publication</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'d')">
<genre authority="marc">drama</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'e')">
<genre authority="marc">essay</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'f')">
<genre authority="marc">fiction</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'o')">
<genre authority="marc">folktale</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'h')">
<genre authority="marc">history</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'k')">
<genre authority="marc">humor, satire</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'m')">
<genre authority="marc">memoir</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'p')">
<genre authority="marc">poetry</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'r')">
<genre authority="marc">rehearsal</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'g')">
<genre authority="marc">reporting</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'s')">
<genre authority="marc">sound</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'l')">
<genre authority="marc">speech</genre>
</xsl:if>
</xsl:if>
<xsl:if test="$typeOf008='VM'">
<xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"></xsl:variable>
<xsl:choose>
<xsl:when test="$controlField008-33='a'">
<genre authority="marc">art original</genre>
</xsl:when>
<xsl:when test="$controlField008-33='b'">
<genre authority="marc">kit</genre>
</xsl:when>
<xsl:when test="$controlField008-33='c'">
<genre authority="marc">art reproduction</genre>
</xsl:when>
<xsl:when test="$controlField008-33='d'">
<genre authority="marc">diorama</genre>
</xsl:when>
<xsl:when test="$controlField008-33='f'">
<genre authority="marc">filmstrip</genre>
</xsl:when>
<xsl:when test="$controlField008-33='g'">
<genre authority="marc">legal article</genre>
</xsl:when>
<xsl:when test="$controlField008-33='i'">
<genre authority="marc">picture</genre>
</xsl:when>
<xsl:when test="$controlField008-33='k'">
<genre authority="marc">graphic</genre>
</xsl:when>
<xsl:when test="$controlField008-33='l'">
<genre authority="marc">technical drawing</genre>
</xsl:when>
<xsl:when test="$controlField008-33='m'">
<genre authority="marc">motion picture</genre>
</xsl:when>
<xsl:when test="$controlField008-33='n'">
<genre authority="marc">chart</genre>
</xsl:when>
<xsl:when test="$controlField008-33='o'">
<genre authority="marc">flash card</genre>
</xsl:when>
<xsl:when test="$controlField008-33='p'">
<genre authority="marc">microscope slide</genre>
</xsl:when>
<xsl:when test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
<genre authority="marc">model</genre>
</xsl:when>
<xsl:when test="$controlField008-33='r'">
<genre authority="marc">realia</genre>
</xsl:when>
<xsl:when test="$controlField008-33='s'">
<genre authority="marc">slide</genre>
</xsl:when>
<xsl:when test="$controlField008-33='t'">
<genre authority="marc">transparency</genre>
</xsl:when>
<xsl:when test="$controlField008-33='v'">
<genre authority="marc">videorecording</genre>
</xsl:when>
<xsl:when test="$controlField008-33='w'">
<genre authority="marc">toy</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=655]">
<genre authority="marc">
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code='2']"/>
</xsl:attribute>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abvxyz</xsl:with-param>
<xsl:with-param name="delimeter">-</xsl:with-param>
</xsl:call-template>
</genre>
</xsl:for-each>
<originInfo>
<xsl:variable name="MARCpublicationCode" select="normalize-space(substring($controlField008,16,3))"></xsl:variable>
<xsl:if test="translate($MARCpublicationCode,'|','')">
<place>
<placeTerm>
<xsl:attribute name="type">code</xsl:attribute>
<xsl:attribute name="authority">marccountry</xsl:attribute>
<xsl:value-of select="$MARCpublicationCode"/>
</placeTerm>
</place>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
<place>
<placeTerm>
<xsl:attribute name="type">code</xsl:attribute>
<xsl:attribute name="authority">iso3166</xsl:attribute>
<xsl:value-of select="."/>
</placeTerm>
</place>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
<place>
<placeTerm>
<xsl:attribute name="type">text</xsl:attribute>
<xsl:call-template name="chopPunctuationFront">
<xsl:with-param name="chopString">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</placeTerm>
</place>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='m']">
<dateValid point="start">
<xsl:value-of select="."/>
</dateValid>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='n']">
<dateValid point="end">
<xsl:value-of select="."/>
</dateValid>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='j']">
<dateModified>
<xsl:value-of select="."/>
</dateModified>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
<xsl:choose>
<xsl:when test="@code='b'">
<publisher>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
<xsl:with-param name="punctuation">
<xsl:text>:,;/ </xsl:text>
</xsl:with-param>
</xsl:call-template>
</publisher>
</xsl:when>
<xsl:when test="@code='c'">
<dateIssued>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</dateIssued>
</xsl:when>
<xsl:when test="@code='g'">
<dateCreated>
<xsl:value-of select="."/>
</dateCreated>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<xsl:variable name="dataField260c">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="marc:datafield[@tag=260]/marc:subfield[@code='c']"></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="controlField008-7-10" select="normalize-space(substring($controlField008, 8, 4))"></xsl:variable>
<xsl:variable name="controlField008-11-14" select="normalize-space(substring($controlField008, 12, 4))"></xsl:variable>
<xsl:variable name="controlField008-6" select="normalize-space(substring($controlField008, 7, 1))"></xsl:variable>
<xsl:if test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
<xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
<dateIssued encoding="marc">
<xsl:value-of select="$controlField008-7-10"/>
</dateIssued>
</xsl:if>
</xsl:if>
<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'">
<xsl:if test="$controlField008-7-10">
<dateIssued encoding="marc" point="start">
<xsl:value-of select="$controlField008-7-10"/>
</dateIssued>
</xsl:if>
</xsl:if>
<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'">
<xsl:if test="$controlField008-11-14">
<dateIssued encoding="marc" point="end">
<xsl:value-of select="$controlField008-11-14"/>
</dateIssued>
</xsl:if>
</xsl:if>
<xsl:if test="$controlField008-6='q'">
<xsl:if test="$controlField008-7-10">
<dateIssued encoding="marc" point="start" qualifier="questionable">
<xsl:value-of select="$controlField008-7-10"/>
</dateIssued>
</xsl:if>
</xsl:if>
<xsl:if test="$controlField008-6='q'">
<xsl:if test="$controlField008-11-14">
<dateIssued encoding="marc" point="end" qualifier="questionable">
<xsl:value-of select="$controlField008-11-14"/>
</dateIssued>
</xsl:if>
</xsl:if>
<xsl:if test="$controlField008-6='t'">
<xsl:if test="$controlField008-11-14">
<copyrightDate encoding="marc">
<xsl:value-of select="$controlField008-11-14"/>
</copyrightDate>
</xsl:if>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
<dateCaptured encoding="iso8601">
<xsl:value-of select="."/>
</dateCaptured>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
<dateCaptured encoding="iso8601" point="start">
<xsl:value-of select="."/>
</dateCaptured>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
<dateCaptured encoding="iso8601" point="end">
<xsl:value-of select="."/>
</dateCaptured>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
<edition>
<xsl:value-of select="."/>
</edition>
</xsl:for-each>
<xsl:for-each select="marc:leader">
<issuance>
<xsl:choose>
<xsl:when test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">monographic</xsl:when>
<xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">continuing</xsl:when>
</xsl:choose>
</issuance>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
<frequency>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</frequency>
</xsl:for-each>
</originInfo>
<xsl:variable name="controlField008-35-37" select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"></xsl:variable>
<xsl:if test="$controlField008-35-37">
<language>
<languageTerm authority="iso639-2b" type="code">
<xsl:value-of select="substring($controlField008,36,3)"/>
</languageTerm>
</language>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=041]">
<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']">
<xsl:variable name="langCodes" select="."/>
<xsl:choose>
<xsl:when test="../marc:subfield[@code='2']='rfc3066'">
<!-- not stacked but could be repeated -->
<xsl:call-template name="rfcLanguages">
<xsl:with-param name="nodeNum">
<xsl:value-of select="1"/>
</xsl:with-param>
<xsl:with-param name="usedLanguages">
<xsl:text></xsl:text>
</xsl:with-param>
<xsl:with-param name="controlField008-35-37">
<xsl:value-of select="$controlField008-35-37"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- iso -->
<xsl:variable name="allLanguages">
<xsl:copy-of select="$langCodes"></xsl:copy-of>
</xsl:variable>
<xsl:variable name="currentLanguage">
<xsl:value-of select="substring($allLanguages,1,3)"></xsl:value-of>
</xsl:variable>
<xsl:call-template name="isoLanguage">
<xsl:with-param name="currentLanguage">
<xsl:value-of select="substring($allLanguages,1,3)"></xsl:value-of>
</xsl:with-param>
<xsl:with-param name="remainingLanguages">
<xsl:value-of select="substring($allLanguages,4,string-length($allLanguages)-3)"></xsl:value-of>
</xsl:with-param>
<xsl:with-param name="usedLanguages">
<xsl:if test="$controlField008-35-37">
<xsl:value-of select="$controlField008-35-37"></xsl:value-of>
</xsl:if>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
<xsl:variable name="physicalDescription">
<!--3.2 change tmee 007/11 -->
<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a']">
<digitalOrigin>reformatted digital</digitalOrigin>
</xsl:if>
<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='b']">
<digitalOrigin>digitized microfilm</digitalOrigin>
</xsl:if>
<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='d']">
<digitalOrigin>digitized other analog</digitalOrigin>
</xsl:if>
<xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"></xsl:variable>
<xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"></xsl:variable>
<xsl:variable name="check008-23">
<xsl:if test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
<xsl:value-of select="true()"></xsl:value-of>
</xsl:if>
</xsl:variable>
<xsl:variable name="check008-29">
<xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
<xsl:value-of select="true()"></xsl:value-of>
</xsl:if>
</xsl:variable>
<xsl:choose>
<xsl:when test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
<form authority="marcform">braille</form>
</xsl:when>
<xsl:when test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
<form authority="marcform">print</form>
</xsl:when>
<xsl:when test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
<form authority="marcform">electronic</form>
</xsl:when>
<xsl:when test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
<form authority="marcform">microfiche</form>
</xsl:when>
<xsl:when test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
<form authority="marcform">microfilm</form>
</xsl:when>
</xsl:choose>
<!-- 1/04 fix -->
<xsl:if test="marc:datafield[@tag=130]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=130]/marc:subfield[@code='h']"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=240]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=240]/marc:subfield[@code='h']"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=242]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=242]/marc:subfield[@code='h']"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='h']"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=246]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=246]/marc:subfield[@code='h']"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=730]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=730]/marc:subfield[@code='h']"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
<form>
<xsl:value-of select="."></xsl:value-of>
</form>
</xsl:for-each>
<xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
<xsl:choose>
<xsl:when test="substring(text(),14,1)='a'">
<reformattingQuality>access</reformattingQuality>
</xsl:when>
<xsl:when test="substring(text(),14,1)='p'">
<reformattingQuality>preservation</reformattingQuality>
</xsl:when>
<xsl:when test="substring(text(),14,1)='r'">
<reformattingQuality>replacement</reformattingQuality>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<!--3.2 change tmee 007/01 -->
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='b']">
<form authority="smd">chip cartridge</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='c']">
<form authority="smd">computer optical disc cartridge</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='j']">
<form authority="smd">magnetic disc</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='m']">
<form authority="smd">magneto-optical disc</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='o']">
<form authority="smd">optical disc</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='r']">
<form authority="smd">remote</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='a']">
<form authority="smd">tape cartridge</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='f']">
<form authority="smd">tape cassette</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='h']">
<form authority="smd">tape reel</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='a']">
<form authority="smd">celestial globe</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='e']">
<form authority="smd">earth moon globe</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='b']">
<form authority="smd">planetary or lunar globe</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='c']">
<form authority="smd">terrestrial globe</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='o'][substring(text(),2,1)='o']">
<form authority="smd">kit</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
<form authority="smd">atlas</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='g']">
<form authority="smd">diagram</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
<form authority="smd">map</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
<form authority="smd">model</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='k']">
<form authority="smd">profile</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
<form authority="smd">remote-sensing image</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='s']">
<form authority="smd">section</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='y']">
<form authority="smd">view</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='a']">
<form authority="smd">aperture card</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='e']">
<form authority="smd">microfiche</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='f']">
<form authority="smd">microfiche cassette</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='b']">
<form authority="smd">microfilm cartridge</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='c']">
<form authority="smd">microfilm cassette</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='d']">
<form authority="smd">microfilm reel</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='g']">
<form authority="smd">microopaque</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='c']">
<form authority="smd">film cartridge</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='f']">
<form authority="smd">film cassette</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='r']">
<form authority="smd">film reel</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='n']">
<form authority="smd">chart</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='c']">
<form authority="smd">collage</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='d']">
<form authority="smd">drawing</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='o']">
<form authority="smd">flash card</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='e']">
<form authority="smd">painting</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='f']">
<form authority="smd">photomechanical print</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='g']">
<form authority="smd">photonegative</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='h']">
<form authority="smd">photoprint</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='i']">
<form authority="smd">picture</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='j']">
<form authority="smd">print</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='l']">
<form authority="smd">technical drawing</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='q'][substring(text(),2,1)='q']">
<form authority="smd">notated music</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='d']">
<form authority="smd">filmslip</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='c']">
<form authority="smd">filmstrip cartridge</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='o']">
<form authority="smd">filmstrip roll</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='f']">
<form authority="smd">other filmstrip type</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='s']">
<form authority="smd">slide</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='t']">
<form authority="smd">transparency</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='r'][substring(text(),2,1)='r']">
<form authority="smd">remote-sensing image</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='e']">
<form authority="smd">cylinder</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='q']">
<form authority="smd">roll</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='g']">
<form authority="smd">sound cartridge</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='s']">
<form authority="smd">sound cassette</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='d']">
<form authority="smd">sound disc</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='t']">
<form authority="smd">sound-tape reel</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='i']">
<form authority="smd">sound-track film</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='w']">
<form authority="smd">wire recording</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='c']">
<form authority="smd">braille</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='b']">
<form authority="smd">combination</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='a']">
<form authority="smd">moon</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='d']">
<form authority="smd">tactile, with no writing system</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='c']">
<form authority="smd">braille</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='b']">
<form authority="smd">large print</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='a']">
<form authority="smd">regular print</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='d']">
<form authority="smd">text in looseleaf binder</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='c']">
<form authority="smd">videocartridge</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='f']">
<form authority="smd">videocassette</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='d']">
<form authority="smd">videodisc</form>
</xsl:if>
<xsl:if test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='r']">
<form authority="smd">videoreel</form>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)>1]">
<internetMediaType>
<xsl:value-of select="."></xsl:value-of>
</internetMediaType>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=300]">
<extent>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abce</xsl:with-param>
</xsl:call-template>
</extent>
</xsl:for-each>
</xsl:variable>
<xsl:if test="string-length(normalize-space($physicalDescription))">
<physicalDescription>
<xsl:copy-of select="$physicalDescription"></xsl:copy-of>
</physicalDescription>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=520]">
<abstract>
<xsl:call-template name="uri"></xsl:call-template>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</abstract>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=505]">
<tableOfContents>
<xsl:call-template name="uri"></xsl:call-template>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">agrt</xsl:with-param>
</xsl:call-template>
</tableOfContents>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=521]">
<targetAudience>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</targetAudience>
</xsl:for-each>
<xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
<xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"></xsl:variable>
<xsl:choose>
<!-- 01/04 fix -->
<xsl:when test="$controlField008-22='d'">
<targetAudience authority="marctarget">adolescent</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='e'">
<targetAudience authority="marctarget">adult</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='g'">
<targetAudience authority="marctarget">general</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
<targetAudience authority="marctarget">juvenile</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='a'">
<targetAudience authority="marctarget">preschool</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='f'">
<targetAudience authority="marctarget">specialized</targetAudience>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
<note type="statement of responsibility">
<xsl:value-of select="."></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=500]">
<note>
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
<xsl:call-template name="uri"></xsl:call-template>
</note>
</xsl:for-each>
<!--3.2 change tmee additional note fields-->
<xsl:for-each select="marc:datafield[@tag=502]">
<note type="thesis">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=504]">
<note type="bibliography">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=508]">
<note type="creation/production credits">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=506]">
<note type="restrictions">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=510]">
<note type="citation/reference">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=511]">
<note type="performers">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=518]">
<note type="venue">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=530]">
<note type="additional physical form">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=533]">
<note type="reproduction">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=534]">
<note type="original version">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=538]">
<note type="system details">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=583]">
<note type="action">
<xsl:call-template name="uri"></xsl:call-template>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=501 or @tag=507 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]">
<note>
<xsl:call-template name="uri"></xsl:call-template>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
<subject>
<cartographics>
<coordinates>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">defg</xsl:with-param>
</xsl:call-template>
</coordinates>
</cartographics>
</subject>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=043]">
<subject>
<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
<geographicCode>
<xsl:attribute name="authority">
<xsl:if test="@code='a'">
<xsl:text>marcgac</xsl:text>
</xsl:if>
<xsl:if test="@code='b'">
<xsl:value-of select="following-sibling::marc:subfield[@code=2]"></xsl:value-of>
</xsl:if>
<xsl:if test="@code='c'">
<xsl:text>iso3166</xsl:text>
</xsl:if>
</xsl:attribute>
<xsl:value-of select="self::marc:subfield"></xsl:value-of>
</geographicCode>
</xsl:for-each>
</subject>
</xsl:for-each>
<!-- tmee 2006/11/27 -->
<xsl:for-each select="marc:datafield[@tag=255]">
<subject>
<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
<cartographics>
<xsl:if test="@code='a'">
<scale>
<xsl:value-of select="."></xsl:value-of>
</scale>
</xsl:if>
<xsl:if test="@code='b'">
<projection>
<xsl:value-of select="."></xsl:value-of>
</projection>
</xsl:if>
<xsl:if test="@code='c'">
<coordinates>
<xsl:value-of select="."></xsl:value-of>
</coordinates>
</xsl:if>
</cartographics>
</xsl:for-each>
</subject>
</xsl:for-each>
<xsl:apply-templates select="marc:datafield[653 >= @tag and @tag >= 600]"></xsl:apply-templates>
<xsl:apply-templates select="marc:datafield[@tag=656]"></xsl:apply-templates>
<xsl:for-each select="marc:datafield[@tag=752]">
<subject>
<hierarchicalGeographic>
<xsl:for-each select="marc:subfield[@code='a']">
<country>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</country>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<state>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</state>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='c']">
<county>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</county>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='d']">
<city>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</city>
</xsl:for-each>
</hierarchicalGeographic>
</subject>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=045][marc:subfield[@code='b']]">
<subject>
<xsl:choose>
<xsl:when test="@ind1=2">
<temporal encoding="iso8601" point="start">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='b'][1]"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</temporal>
<temporal encoding="iso8601" point="end">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='b'][2]"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</temporal>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="marc:subfield[@code='b']">
<temporal encoding="iso8601">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</temporal>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</subject>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=050]">
<xsl:for-each select="marc:subfield[@code='b']">
<classification authority="lcc">
<xsl:if test="../marc:subfield[@code='3']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="../marc:subfield[@code='3']"></xsl:value-of>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"></xsl:value-of>
<xsl:text> </xsl:text>
<xsl:value-of select="text()"></xsl:value-of>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
<classification authority="lcc">
<xsl:if test="../marc:subfield[@code='3']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="../marc:subfield[@code='3']"></xsl:value-of>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="text()"></xsl:value-of>
</classification>
</xsl:for-each>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=082]">
<classification authority="ddc">
<xsl:if test="marc:subfield[@code='2']">
<xsl:attribute name="edition">
<xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
</xsl:attribute>
</xsl:if>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=080]">
<classification authority="udc">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abx</xsl:with-param>
</xsl:call-template>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=060]">
<classification authority="nlm">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
<classification authority="sudocs">
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
<classification authority="candoc">
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=086]">
<classification>
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
</xsl:attribute>
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=084]">
<classification>
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
</xsl:attribute>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=440]">
<relatedItem type="series">
<xsl:variable name="titleChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">av</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<titleInfo>
<title>
<xsl:value-of select="$titleChop" />
</title>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<titleInfo type="nfi">
<xsl:choose>
<xsl:when test="@ind2>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,@ind2)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,@ind2+1)"/>
</title>
<xsl:call-template name="part"/>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop" />
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">av</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=510]">
<relatedItem type="isReferencedBy">
<note>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcx3</xsl:with-param>
</xsl:call-template>
</note>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=534]">
<relatedItem type="original">
<xsl:call-template name="relatedTitle"></xsl:call-template>
<xsl:call-template name="relatedName"></xsl:call-template>
<xsl:if test="marc:subfield[@code='b' or @code='c']">
<originInfo>
<xsl:for-each select="marc:subfield[@code='c']">
<publisher>
<xsl:value-of select="."></xsl:value-of>
</publisher>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<edition>
<xsl:value-of select="."></xsl:value-of>
</edition>
</xsl:for-each>
</originInfo>
</xsl:if>
<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
<xsl:for-each select="marc:subfield[@code='z']">
<identifier type="isbn">
<xsl:value-of select="."></xsl:value-of>
</identifier>
</xsl:for-each>
<xsl:call-template name="relatedNote"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<name type="personal">
<namePart>
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">aq</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">g</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="termsOfAddress"></xsl:call-template>
<xsl:call-template name="nameDate"></xsl:call-template>
<xsl:call-template name="role"></xsl:call-template>
</name>
<xsl:call-template name="relatedForm"></xsl:call-template>
<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">dg</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="relatedPartNumName"></xsl:call-template>
</titleInfo>
<name type="corporate">
<xsl:for-each select="marc:subfield[@code='a']">
<namePart>
<xsl:value-of select="."></xsl:value-of>
</namePart>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<namePart>
<xsl:value-of select="."></xsl:value-of>
</namePart>
</xsl:for-each>
<xsl:variable name="tempNamePart">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">c</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">dgn</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:if test="normalize-space($tempNamePart)">
<namePart>
<xsl:value-of select="$tempNamePart"></xsl:value-of>
</namePart>
</xsl:if>
<xsl:call-template name="role"></xsl:call-template>
</name>
<xsl:call-template name="relatedForm"></xsl:call-template>
<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="relatedPartNumName"></xsl:call-template>
</titleInfo>
<name type="conference">
<namePart>
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">aqdc</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">gn</xsl:with-param>
</xsl:call-template>
</namePart>
</name>
<xsl:call-template name="relatedForm"></xsl:call-template>
<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<xsl:call-template name="relatedForm"></xsl:call-template>
<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"></xsl:call-template>
<xsl:variable name="titleChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<titleInfo>
<title>
<xsl:value-of select="$titleChop" />
</title>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<titleInfo type="nfi">
<xsl:choose>
<xsl:when test="@ind1>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,@ind1)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,@ind1+1)"/>
</title>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop" />
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<xsl:call-template name="relatedForm"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
<relatedItem type="series">
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
<relatedItem>
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=775]">
<relatedItem type="otherVersion">
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
<relatedItem type="constituent">
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
<relatedItem type="host">
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=776]">
<relatedItem type="otherFormat">
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=780]">
<relatedItem type="preceding">
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=785]">
<relatedItem type="succeeding">
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=786]">
<relatedItem type="original">
<xsl:call-template name="relatedItem76X-78X"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=800]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<name type="personal">
<namePart>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">aq</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="termsOfAddress"></xsl:call-template>
<xsl:call-template name="nameDate"></xsl:call-template>
<xsl:call-template name="role"></xsl:call-template>
</name>
<xsl:call-template name="relatedForm"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=810]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">dg</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="relatedPartNumName"></xsl:call-template>
</titleInfo>
<name type="corporate">
<xsl:for-each select="marc:subfield[@code='a']">
<namePart>
<xsl:value-of select="."></xsl:value-of>
</namePart>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<namePart>
<xsl:value-of select="."></xsl:value-of>
</namePart>
</xsl:for-each>
<namePart>
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">c</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">dgn</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="role"></xsl:call-template>
</name>
<xsl:call-template name="relatedForm"></xsl:call-template>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=811]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="relatedPartNumName"/>
</titleInfo>
<name type="conference">
<namePart>
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">aqdc</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">gn</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="role"/>
</name>
<xsl:call-template name="relatedForm"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='830']">
<relatedItem type="series">
<xsl:variable name="titleChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<titleInfo>
<title>
<xsl:value-of select="$titleChop" />
</title>
<xsl:call-template name="part"/>
</titleInfo>
<titleInfo type="nfi">
<xsl:choose>
<xsl:when test="@ind2>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,@ind2)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,@ind2+1)"/>
</title>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop" />
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="part"/>
</titleInfo>
<xsl:call-template name="relatedForm"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='856'][@ind2='2']/marc:subfield[@code='q']">
<relatedItem>
<internetMediaType>
<xsl:value-of select="."/>
</internetMediaType>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='020']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">isbn</xsl:with-param>
</xsl:call-template>
<xsl:if test="marc:subfield[@code='a']">
<identifier type="isbn">
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='024'][@ind1='0']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">isrc</xsl:with-param>
</xsl:call-template>
<xsl:if test="marc:subfield[@code='a']">
<identifier type="isrc">
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='024'][@ind1='2']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">ismn</xsl:with-param>
</xsl:call-template>
<xsl:if test="marc:subfield[@code='a']">
<identifier type="ismn">
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='024'][@ind1='4']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">sici</xsl:with-param>
</xsl:call-template>
<identifier type="sici">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='022']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">issn</xsl:with-param>
</xsl:call-template>
<identifier type="issn">
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='010']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">lccn</xsl:with-param>
</xsl:call-template>
<identifier type="lccn">
<xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='028']">
<identifier>
<xsl:attribute name="type">
<xsl:choose>
<xsl:when test="@ind1='0'">issue number</xsl:when>
<xsl:when test="@ind1='1'">matrix number</xsl:when>
<xsl:when test="@ind1='2'">music plate</xsl:when>
<xsl:when test="@ind1='3'">music publisher</xsl:when>
<xsl:when test="@ind1='4'">videorecording identifier</xsl:when>
</xsl:choose>
</xsl:attribute>
<!--<xsl:call-template name="isInvalid"/>--> <!-- no $z in 028 -->
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">
<xsl:choose>
<xsl:when test="@ind1='0'">ba</xsl:when>
<xsl:otherwise>ab</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='037']">
<identifier type="stock number">
<!--<xsl:call-template name="isInvalid"/>--> <!-- no $z in 037 -->
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='856'][marc:subfield[@code='u']]">
<identifier>
<xsl:attribute name="type">
<xsl:choose>
<xsl:when test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi')">doi</xsl:when>
<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>
<xsl:otherwise>uri</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:choose>
<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') ">
<xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"></xsl:value-of>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="marc:subfield[@code='u']"></xsl:value-of>
</xsl:otherwise>
</xsl:choose>
</identifier>
<xsl:if test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl')">
<identifier type="hdl">
<xsl:if test="marc:subfield[@code='y' or @code='3' or @code='z']">
<xsl:attribute name="displayLabel">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">y3z</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"></xsl:value-of>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
<identifier type="upc">
<xsl:call-template name="isInvalid"/>
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:for-each>
<!-- 1/04 fix added $y -->
<xsl:for-each select="marc:datafield[@tag=856][marc:subfield[@code='u']]">
<location>
<url>
<xsl:if test="marc:subfield[@code='y' or @code='3']">
<xsl:attribute name="displayLabel">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">y3</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:if test="marc:subfield[@code='z' ]">
<xsl:attribute name="note">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">z</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="marc:subfield[@code='u']"></xsl:value-of>
</url>
</location>
</xsl:for-each>
<!-- 3.2 change tmee 856z -->
<xsl:for-each select="marc:datafield[@tag=852]">
<location>
<physicalLocation>
<xsl:call-template name="displayLabel"></xsl:call-template>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abje</xsl:with-param>
</xsl:call-template>
</physicalLocation>
</location>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=506]">
<accessCondition type="restrictionOnAccess">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcd35</xsl:with-param>
</xsl:call-template>
</accessCondition>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=540]">
<accessCondition type="useAndReproduction">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcde35</xsl:with-param>
</xsl:call-template>
</accessCondition>
</xsl:for-each>
<recordInfo>
<xsl:for-each select="marc:datafield[@tag=040]">
<recordContentSource authority="marcorg">
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
</recordContentSource>
</xsl:for-each>
<xsl:for-each select="marc:controlfield[@tag=008]">
<recordCreationDate encoding="marc">
<xsl:value-of select="substring(.,1,6)"></xsl:value-of>
</recordCreationDate>
</xsl:for-each>
<xsl:for-each select="marc:controlfield[@tag=005]">
<recordChangeDate encoding="iso8601">
<xsl:value-of select="."></xsl:value-of>
</recordChangeDate>
</xsl:for-each>
<xsl:for-each select="marc:controlfield[@tag=001]">
<recordIdentifier>
<xsl:if test="../marc:controlfield[@tag=003]">
<xsl:attribute name="source">
<xsl:value-of select="../marc:controlfield[@tag=003]"></xsl:value-of>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="."></xsl:value-of>
</recordIdentifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
<languageOfCataloging>
<languageTerm authority="iso639-2b" type="code">
<xsl:value-of select="."></xsl:value-of>
</languageTerm>
</languageOfCataloging>
</xsl:for-each>
</recordInfo>
</xsl:template>
<xsl:template name="displayForm">
<xsl:for-each select="marc:subfield[@code='c']">
<displayForm>
<xsl:value-of select="."></xsl:value-of>
</displayForm>
</xsl:for-each>
</xsl:template>
<xsl:template name="affiliation">
<xsl:for-each select="marc:subfield[@code='u']">
<affiliation>
<xsl:value-of select="."></xsl:value-of>
</affiliation>
</xsl:for-each>
</xsl:template>
<xsl:template name="uri">
<xsl:for-each select="marc:subfield[@code='u']">
<xsl:attribute name="xlink:href">
<xsl:value-of select="."></xsl:value-of>
</xsl:attribute>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='0']">
<xsl:choose>
<xsl:when test="contains(text(), ')')">
<xsl:attribute name="xlink:href">
<xsl:value-of select="substring-after(text(), ')')"></xsl:value-of>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="xlink:href">
<xsl:value-of select="."></xsl:value-of>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template name="role">
<xsl:for-each select="marc:subfield[@code='e']">
<role>
<roleTerm type="text">
<xsl:value-of select="."></xsl:value-of>
</roleTerm>
</role>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='4']">
<role>
<roleTerm authority="marcrelator" type="code">
<xsl:value-of select="."></xsl:value-of>
</roleTerm>
</role>
</xsl:for-each>
</xsl:template>
<xsl:template name="part">
<xsl:variable name="partNumber">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">n</xsl:with-param>
<xsl:with-param name="anyCodes">n</xsl:with-param>
<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="partName">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">p</xsl:with-param>
<xsl:with-param name="anyCodes">p</xsl:with-param>
<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:if test="string-length(normalize-space($partNumber))">
<partNumber>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="$partNumber"></xsl:with-param>
</xsl:call-template>
</partNumber>
</xsl:if>
<xsl:if test="string-length(normalize-space($partName))">
<partName>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="$partName"></xsl:with-param>
</xsl:call-template>
</partName>
</xsl:if>
</xsl:template>
<xsl:template name="relatedPart">
<xsl:if test="@tag=773">
<xsl:for-each select="marc:subfield[@code='g']">
<part>
<text>
<xsl:value-of select="."></xsl:value-of>
</text>
</part>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='q']">
<part>
<xsl:call-template name="parsePart"></xsl:call-template>
</part>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="relatedPartNumName">
<xsl:variable name="partNumber">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">g</xsl:with-param>
<xsl:with-param name="anyCodes">g</xsl:with-param>
<xsl:with-param name="afterCodes">pst</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="partName">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">p</xsl:with-param>
<xsl:with-param name="anyCodes">p</xsl:with-param>
<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:if test="string-length(normalize-space($partNumber))">
<partNumber>
<xsl:value-of select="$partNumber"></xsl:value-of>
</partNumber>
</xsl:if>
<xsl:if test="string-length(normalize-space($partName))">
<partName>
<xsl:value-of select="$partName"></xsl:value-of>
</partName>
</xsl:if>
</xsl:template>
<xsl:template name="relatedName">
<xsl:for-each select="marc:subfield[@code='a']">
<name>
<namePart>
<xsl:value-of select="."></xsl:value-of>
</namePart>
</name>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedForm">
<xsl:for-each select="marc:subfield[@code='h']">
<physicalDescription>
<form>
<xsl:value-of select="."></xsl:value-of>
</form>
</physicalDescription>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedExtent">
<xsl:for-each select="marc:subfield[@code='h']">
<physicalDescription>
<extent>
<xsl:value-of select="."></xsl:value-of>
</extent>
</physicalDescription>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedNote">
<xsl:for-each select="marc:subfield[@code='n']">
<note>
<xsl:value-of select="."></xsl:value-of>
</note>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedSubject">
<xsl:for-each select="marc:subfield[@code='j']">
<subject>
<temporal encoding="iso8601">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</temporal>
</subject>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedIdentifierISSN">
<xsl:for-each select="marc:subfield[@code='x']">
<identifier type="issn">
<xsl:value-of select="."></xsl:value-of>
</identifier>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedIdentifierLocal">
<xsl:for-each select="marc:subfield[@code='w']">
<identifier type="local">
<xsl:value-of select="."></xsl:value-of>
</identifier>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedIdentifier">
<xsl:for-each select="marc:subfield[@code='o']">
<identifier>
<xsl:value-of select="."></xsl:value-of>
</identifier>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedItem76X-78X">
<xsl:call-template name="displayLabel"></xsl:call-template>
<xsl:call-template name="relatedTitle76X-78X"></xsl:call-template>
<xsl:call-template name="relatedName"></xsl:call-template>
<xsl:call-template name="relatedOriginInfo"></xsl:call-template>
<xsl:call-template name="relatedLanguage"></xsl:call-template>
<xsl:call-template name="relatedExtent"></xsl:call-template>
<xsl:call-template name="relatedNote"></xsl:call-template>
<xsl:call-template name="relatedSubject"></xsl:call-template>
<xsl:call-template name="relatedIdentifier"></xsl:call-template>
<xsl:call-template name="relatedIdentifierISSN"></xsl:call-template>
<xsl:call-template name="relatedIdentifierLocal"></xsl:call-template>
<xsl:call-template name="relatedPart"></xsl:call-template>
</xsl:template>
<xsl:template name="subjectGeographicZ">
<geographic>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</geographic>
</xsl:template>
<xsl:template name="subjectTemporalY">
<temporal>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</temporal>
</xsl:template>
<xsl:template name="subjectTopic">
<topic>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</topic>
</xsl:template>
<!-- 3.2 change tmee 6xx $v genre -->
<xsl:template name="subjectGenre">
<genre>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</genre>
</xsl:template>
<xsl:template name="nameABCDN">
<xsl:for-each select="marc:subfield[@code='a']">
<namePart>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<namePart>
<xsl:value-of select="."></xsl:value-of>
</namePart>
</xsl:for-each>
<xsl:if test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
<namePart>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">cdn</xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:if>
</xsl:template>
<xsl:template name="nameABCDQ">
<namePart>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">aq</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name="punctuation">
<xsl:text>:,;/ </xsl:text>
</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="termsOfAddress"></xsl:call-template>
<xsl:call-template name="nameDate"></xsl:call-template>
</xsl:template>
<xsl:template name="nameACDEQ">
<namePart>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">acdeq</xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:template>
<xsl:template name="constituentOrRelatedType">
<xsl:if test="@ind2=2">
<xsl:attribute name="type">constituent</xsl:attribute>
</xsl:if>
</xsl:template>
<xsl:template name="relatedTitle">
<xsl:for-each select="marc:subfield[@code='t']">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="."></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</title>
</titleInfo>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedTitle76X-78X">
<xsl:for-each select="marc:subfield[@code='t']">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="."></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
<xsl:call-template name="relatedPartNumName"></xsl:call-template>
</xsl:if>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='p']">
<titleInfo type="abbreviated">
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="."></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
<xsl:call-template name="relatedPartNumName"></xsl:call-template>
</xsl:if>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='s']">
<titleInfo type="uniform">
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="."></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
<xsl:call-template name="relatedPartNumName"></xsl:call-template>
</xsl:if>
</titleInfo>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedOriginInfo">
<xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
<originInfo>
<xsl:if test="@tag=775">
<xsl:for-each select="marc:subfield[@code='f']">
<place>
<placeTerm>
<xsl:attribute name="type">code</xsl:attribute>
<xsl:attribute name="authority">marcgac</xsl:attribute>
<xsl:value-of select="."></xsl:value-of>
</placeTerm>
</place>
</xsl:for-each>
</xsl:if>
<xsl:for-each select="marc:subfield[@code='d']">
<publisher>
<xsl:value-of select="."></xsl:value-of>
</publisher>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<edition>
<xsl:value-of select="."></xsl:value-of>
</edition>
</xsl:for-each>
</originInfo>
</xsl:if>
</xsl:template>
<xsl:template name="relatedLanguage">
<xsl:for-each select="marc:subfield[@code='e']">
<xsl:call-template name="getLanguage">
<xsl:with-param name="langString">
<xsl:value-of select="."></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="nameDate">
<xsl:for-each select="marc:subfield[@code='d']">
<namePart type="date">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:for-each>
</xsl:template>
<xsl:template name="subjectAuthority">
<xsl:if test="@ind2!=4">
<xsl:if test="@ind2!=' '">
<xsl:if test="@ind2!=8">
<xsl:if test="@ind2!=9">
<xsl:attribute name="authority">
<xsl:choose>
<xsl:when test="@ind2=0">lcsh</xsl:when>
<xsl:when test="@ind2=1">lcshac</xsl:when>
<xsl:when test="@ind2=2">mesh</xsl:when>
<!-- 1/04 fix -->
<xsl:when test="@ind2=3">nal</xsl:when>
<xsl:when test="@ind2=5">csh</xsl:when>
<xsl:when test="@ind2=6">rvm</xsl:when>
<xsl:when test="@ind2=7">
<xsl:value-of select="marc:subfield[@code='2']"></xsl:value-of>
</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template name="subjectAnyOrder">
<xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
<xsl:choose>
<xsl:when test="@code='v'">
<xsl:call-template name="subjectGenre"></xsl:call-template>
</xsl:when>
<xsl:when test="@code='x'">
<xsl:call-template name="subjectTopic"></xsl:call-template>
</xsl:when>
<xsl:when test="@code='y'">
<xsl:call-template name="subjectTemporalY"></xsl:call-template>
</xsl:when>
<xsl:when test="@code='z'">
<xsl:call-template name="subjectGeographicZ"></xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template name="specialSubfieldSelect">
<xsl:param name="anyCodes"></xsl:param>
<xsl:param name="axis"></xsl:param>
<xsl:param name="beforeCodes"></xsl:param>
<xsl:param name="afterCodes"></xsl:param>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield">
<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])">
<xsl:value-of select="text()"></xsl:value-of>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"></xsl:value-of>
</xsl:template>
<!-- 3.2 change tmee 6xx $v genre -->
<xsl:template match="marc:datafield[@tag=600]">
<subject>
<xsl:call-template name="subjectAuthority"></xsl:call-template>
<name type="personal">
<xsl:call-template name="uri" />
<namePart>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">aq</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="termsOfAddress"></xsl:call-template>
<xsl:call-template name="nameDate"></xsl:call-template>
<xsl:call-template name="affiliation"></xsl:call-template>
<xsl:call-template name="role"></xsl:call-template>
</name>
<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=610]">
<subject>
<xsl:call-template name="subjectAuthority"></xsl:call-template>
<name type="corporate">
<xsl:call-template name="uri" />
<xsl:for-each select="marc:subfield[@code='a']">
<namePart>
<xsl:value-of select="."></xsl:value-of>
</namePart>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<namePart>
<xsl:value-of select="."></xsl:value-of>
</namePart>
</xsl:for-each>
<xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
<namePart>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">cdnp</xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:if>
<xsl:call-template name="role"></xsl:call-template>
</name>
<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=611]">
<subject>
<xsl:call-template name="subjectAuthority"></xsl:call-template>
<name type="conference">
<xsl:call-template name="uri" />
<namePart>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcdeqnp</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:for-each select="marc:subfield[@code='4']">
<role>
<roleTerm authority="marcrelator" type="code">
<xsl:value-of select="."></xsl:value-of>
</roleTerm>
</role>
</xsl:for-each>
</name>
<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=630]">
<subject>
<xsl:call-template name="subjectAuthority"></xsl:call-template>
<xsl:variable name="titleChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">adfhklor</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<titleInfo>
<title>
<xsl:value-of select="$titleChop" />
</title>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<titleInfo type="nfi">
<xsl:choose>
<xsl:when test="@ind1>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,@ind1)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,@ind1+1)"/>
</title>
<xsl:call-template name="part"/>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop" />
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="part"></xsl:call-template>
</titleInfo>
<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=650]">
<subject>
<xsl:call-template name="subjectAuthority"></xsl:call-template>
<topic>
<xsl:call-template name="uri" />
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcd</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</topic>
<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=651]">
<subject>
<xsl:call-template name="subjectAuthority"></xsl:call-template>
<xsl:for-each select="marc:subfield[@code='a']">
<geographic>
<xsl:call-template name="uri" />
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."></xsl:with-param>
</xsl:call-template>
</geographic>
</xsl:for-each>
<xsl:call-template name="subjectAnyOrder"></xsl:call-template>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=653]">
<subject>
<xsl:for-each select="marc:subfield[@code='a']">
<topic>
<xsl:call-template name="uri" />
<xsl:value-of select="."></xsl:value-of>
</topic>
</xsl:for-each>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=656]">
<subject>
<xsl:if test="marc:subfield[@code=2]">
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code=2]"></xsl:value-of>
</xsl:attribute>
</xsl:if>
<occupation>
<xsl:call-template name="uri" />
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='a']"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</occupation>
</subject>
</xsl:template>
<xsl:template name="termsOfAddress">
<xsl:if test="marc:subfield[@code='b' or @code='c']">
<namePart type="termsOfAddress">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">bc</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:if>
</xsl:template>
<xsl:template name="displayLabel">
<xsl:if test="marc:subfield[@code='i']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="marc:subfield[@code='i']"></xsl:value-of>
</xsl:attribute>
</xsl:if>
<xsl:if test="marc:subfield[@code='3']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="marc:subfield[@code='3']"></xsl:value-of>
</xsl:attribute>
</xsl:if>
</xsl:template>
<xsl:template name="isInvalid">
<xsl:param name="type"/>
<xsl:if test="marc:subfield[@code='z'] or marc:subfield[@code='y']">
<identifier>
<xsl:attribute name="type">
<xsl:value-of select="$type"/>
</xsl:attribute>
<xsl:attribute name="invalid">
<xsl:text>yes</xsl:text>
</xsl:attribute>
<xsl:if test="marc:subfield[@code='z']">
<xsl:value-of select="marc:subfield[@code='z']"/>
</xsl:if>
<xsl:if test="marc:subfield[@code='y']">
<xsl:value-of select="marc:subfield[@code='y']"/>
</xsl:if>
</identifier>
</xsl:if>
</xsl:template>
<xsl:template name="subtitle">
<xsl:if test="marc:subfield[@code='b']">
<subTitle>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='b']"/>
<!--<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">b</xsl:with-param>
</xsl:call-template>-->
</xsl:with-param>
</xsl:call-template>
</subTitle>
</xsl:if>
</xsl:template>
<xsl:template name="script">
<xsl:param name="scriptCode"></xsl:param>
<xsl:attribute name="script">
<xsl:choose>
<xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
<xsl:when test="$scriptCode='(B'">Latin</xsl:when>
<xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
<xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
<xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
<xsl:when test="$scriptCode='(S'">Greek</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:template>
<xsl:template name="parsePart">
<!-- assumes 773$q= 1:2:3<4
with up to 3 levels and one optional start page
-->
<xsl:variable name="level1">
<xsl:choose>
<xsl:when test="contains(text(),':')">
<!-- 1:2 -->
<xsl:value-of select="substring-before(text(),':')"></xsl:value-of>
</xsl:when>
<xsl:when test="not(contains(text(),':'))">
<!-- 1 or 1<3 -->
<xsl:if test="contains(text(),'<')">
<!-- 1<3 -->
<xsl:value-of select="substring-before(text(),'<')"></xsl:value-of>
</xsl:if>
<xsl:if test="not(contains(text(),'<'))">
<!-- 1 -->
<xsl:value-of select="text()"></xsl:value-of>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sici2">
<xsl:choose>
<xsl:when test="starts-with(substring-after(text(),$level1),':')">
<xsl:value-of select="substring(substring-after(text(),$level1),2)"></xsl:value-of>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-after(text(),$level1)"></xsl:value-of>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="level2">
<xsl:choose>
<xsl:when test="contains($sici2,':')">
<!-- 2:3<4 -->
<xsl:value-of select="substring-before($sici2,':')"></xsl:value-of>
</xsl:when>
<xsl:when test="contains($sici2,'<')">
<!-- 1: 2<4 -->
<xsl:value-of select="substring-before($sici2,'<')"></xsl:value-of>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$sici2"></xsl:value-of>
<!-- 1:2 -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sici3">
<xsl:choose>
<xsl:when test="starts-with(substring-after($sici2,$level2),':')">
<xsl:value-of select="substring(substring-after($sici2,$level2),2)"></xsl:value-of>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-after($sici2,$level2)"></xsl:value-of>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="level3">
<xsl:choose>
<xsl:when test="contains($sici3,'<')">
<!-- 2<4 -->
<xsl:value-of select="substring-before($sici3,'<')"></xsl:value-of>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$sici3"></xsl:value-of>
<!-- 3 -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="page">
<xsl:if test="contains(text(),'<')">
<xsl:value-of select="substring-after(text(),'<')"></xsl:value-of>
</xsl:if>
</xsl:variable>
<xsl:if test="$level1">
<detail level="1">
<number>
<xsl:value-of select="$level1"></xsl:value-of>
</number>
</detail>
</xsl:if>
<xsl:if test="$level2">
<detail level="2">
<number>
<xsl:value-of select="$level2"></xsl:value-of>
</number>
</detail>
</xsl:if>
<xsl:if test="$level3">
<detail level="3">
<number>
<xsl:value-of select="$level3"></xsl:value-of>
</number>
</detail>
</xsl:if>
<xsl:if test="$page">
<extent unit="page">
<start>
<xsl:value-of select="$page"></xsl:value-of>
</start>
</extent>
</xsl:if>
</xsl:template>
<xsl:template name="getLanguage">
<xsl:param name="langString"></xsl:param>
<xsl:param name="controlField008-35-37"></xsl:param>
<xsl:variable name="length" select="string-length($langString)"></xsl:variable>
<xsl:choose>
<xsl:when test="$length=0"></xsl:when>
<xsl:when test="$controlField008-35-37=substring($langString,1,3)">
<xsl:call-template name="getLanguage">
<xsl:with-param name="langString" select="substring($langString,4,$length)"></xsl:with-param>
<xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"></xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<language>
<languageTerm authority="iso639-2b" type="code">
<xsl:value-of select="substring($langString,1,3)"></xsl:value-of>
</languageTerm>
</language>
<xsl:call-template name="getLanguage">
<xsl:with-param name="langString" select="substring($langString,4,$length)"></xsl:with-param>
<xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"></xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="isoLanguage">
<xsl:param name="currentLanguage"></xsl:param>
<xsl:param name="usedLanguages"></xsl:param>
<xsl:param name="remainingLanguages"></xsl:param>
<xsl:choose>
<xsl:when test="string-length($currentLanguage)=0"></xsl:when>
<xsl:when test="not(contains($usedLanguages, $currentLanguage))">
<language>
<xsl:if test="@code!='a'">
<xsl:attribute name="objectPart">
<xsl:choose>
<xsl:when test="@code='b'">summary or subtitle</xsl:when>
<xsl:when test="@code='d'">sung or spoken text</xsl:when>
<xsl:when test="@code='e'">libretto</xsl:when>
<xsl:when test="@code='f'">table of contents</xsl:when>
<xsl:when test="@code='g'">accompanying material</xsl:when>
<xsl:when test="@code='h'">translation</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<languageTerm authority="iso639-2b" type="code">
<xsl:value-of select="$currentLanguage"></xsl:value-of>
</languageTerm>
</language>
<xsl:call-template name="isoLanguage">
<xsl:with-param name="currentLanguage">
<xsl:value-of select="substring($remainingLanguages,1,3)"></xsl:value-of>
</xsl:with-param>
<xsl:with-param name="usedLanguages">
<xsl:value-of select="concat($usedLanguages,$currentLanguage)"></xsl:value-of>
</xsl:with-param>
<xsl:with-param name="remainingLanguages">
<xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="isoLanguage">
<xsl:with-param name="currentLanguage">
<xsl:value-of select="substring($remainingLanguages,1,3)"></xsl:value-of>
</xsl:with-param>
<xsl:with-param name="usedLanguages">
<xsl:value-of select="concat($usedLanguages,$currentLanguage)"></xsl:value-of>
</xsl:with-param>
<xsl:with-param name="remainingLanguages">
<xsl:value-of select="substring($remainingLanguages,4,string-length($remainingLanguages))"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="chopBrackets">
<xsl:param name="chopString"></xsl:param>
<xsl:variable name="string">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="$chopString"></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:if test="substring($string, 1,1)='['">
<xsl:value-of select="substring($string,2, string-length($string)-2)"></xsl:value-of>
</xsl:if>
<xsl:if test="substring($string, 1,1)!='['">
<xsl:value-of select="$string"></xsl:value-of>
</xsl:if>
</xsl:template>
<xsl:template name="rfcLanguages">
<xsl:param name="nodeNum"></xsl:param>
<xsl:param name="usedLanguages"></xsl:param>
<xsl:param name="controlField008-35-37"></xsl:param>
<xsl:variable name="currentLanguage" select="."></xsl:variable>
<xsl:choose>
<xsl:when test="not($currentLanguage)"></xsl:when>
<xsl:when test="$currentLanguage!=$controlField008-35-37 and $currentLanguage!='rfc3066'">
<xsl:if test="not(contains($usedLanguages,$currentLanguage))">
<language>
<xsl:if test="@code!='a'">
<xsl:attribute name="objectPart">
<xsl:choose>
<xsl:when test="@code='b'">summary or subtitle</xsl:when>
<xsl:when test="@code='d'">sung or spoken text</xsl:when>
<xsl:when test="@code='e'">libretto</xsl:when>
<xsl:when test="@code='f'">table of contents</xsl:when>
<xsl:when test="@code='g'">accompanying material</xsl:when>
<xsl:when test="@code='h'">translation</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<languageTerm authority="rfc3066" type="code">
<xsl:value-of select="$currentLanguage"/>
</languageTerm>
</language>
</xsl:if>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="datafield">
<xsl:param name="tag"/>
<xsl:param name="ind1"><xsl:text> </xsl:text></xsl:param>
<xsl:param name="ind2"><xsl:text> </xsl:text></xsl:param>
<xsl:param name="subfields"/>
<xsl:element name="marc:datafield">
<xsl:attribute name="tag">
<xsl:value-of select="$tag"/>
</xsl:attribute>
<xsl:attribute name="ind1">
<xsl:value-of select="$ind1"/>
</xsl:attribute>
<xsl:attribute name="ind2">
<xsl:value-of select="$ind2"/>
</xsl:attribute>
<xsl:copy-of select="$subfields"/>
</xsl:element>
</xsl:template>
<xsl:template name="subfieldSelect">
<xsl:param name="codes"/>
<xsl:param name="delimeter"><xsl:text> </xsl:text></xsl:param>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield">
<xsl:if test="contains($codes, @code)">
<xsl:value-of select="text()"/><xsl:value-of select="$delimeter"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
</xsl:template>
<xsl:template name="buildSpaces">
<xsl:param name="spaces"/>
<xsl:param name="char"><xsl:text> </xsl:text></xsl:param>
<xsl:if test="$spaces>0">
<xsl:value-of select="$char"/>
<xsl:call-template name="buildSpaces">
<xsl:with-param name="spaces" select="$spaces - 1"/>
<xsl:with-param name="char" select="$char"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="chopPunctuation">
<xsl:param name="chopString"/>
<xsl:param name="punctuation"><xsl:text>.:,;/ </xsl:text></xsl:param>
<xsl:variable name="length" select="string-length($chopString)"/>
<xsl:choose>
<xsl:when test="$length=0"/>
<xsl:when test="contains($punctuation, substring($chopString,$length,1))">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
<xsl:with-param name="punctuation" select="$punctuation"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="not($chopString)"/>
<xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="chopPunctuationFront">
<xsl:param name="chopString"/>
<xsl:variable name="length" select="string-length($chopString)"/>
<xsl:choose>
<xsl:when test="$length=0"/>
<xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
<xsl:call-template name="chopPunctuationFront">
<xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="not($chopString)"/>
<xsl:otherwise><xsl:value-of select="$chopString"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>$XXXX$ where name = $$mods32$$;
update config.xml_transform set xslt = $XXXX$<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">
<xsl:output encoding="UTF-8" indent="yes" method="xml"/>
<xsl:variable name="ascii">
<xsl:text> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:text>
</xsl:variable>
<xsl:variable name="latin1">
<xsl:text> ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</xsl:text>
</xsl:variable>
<!-- Characters that usually don't need to be escaped -->
<xsl:variable name="safe">
<xsl:text>!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~</xsl:text>
</xsl:variable>
<xsl:variable name="hex">0123456789ABCDEF</xsl:variable>
<!-- Evergreen specific: revert Revision 1.23, so we can have those authority xlink attributes back. -->
<!--MARC21slim2MODS3-3.xsl
Revision 1.27 - Mapped 648 to <subject> 2009/03/13 tmee
Revision 1.26 - Added subfield $s mapping for 130/240/730 2008/10/16 tmee
Revision 1.25 - Mapped 040e to <descriptiveStandard> and Leader/18 to <descriptive standard>aacr2 2008/09/18 tmee
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
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
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
Revision 1.21 - Mapped 856 ind2=1 or ind2=2 to <relatedItem><location><url> 2008/07/03 tmee
Revision 1.20 - Added genre w/@auth="contents of 2" and type= "musical composition" 2008/07/01 tmee
Revision 1.19 - Added genre offprint for 008/24+ BK code 2 2008/07/01 tmee
Revision 1.18 - Added xlink/uri for subfield 0 for 130/240/730, 100/700, 110/710, 111/711 2008/06/26 tmee
Revision 1.17 - Added mapping of 662 2008/05/14 tmee
Revision 1.16 - Changed @authority from "marc" to "marcgt" for 007 and 008 codes mapped to a term in <genre> 2007/07/10 tmee
Revision 1.15 - For field 630, moved call to part template outside title element 2007/07/10 tmee
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
Revision 1.13 - Changed order of output under cartographics to reflect schema 2006/11/28 tmee
Revision 1.12 - Updated to reflect MODS 3.2 Mapping 2006/10/11 tmee
Revision 1.11 - The attribute objectPart moved from <languageTerm> to <language> 2006/04/08 jrad
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
Revision 1.9 - Subfield $y was added to field 242 2004/09/02 10:57 jrad
Revision 1.8 - Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
Revision 1.7 - 2004/03/25 08:29 jrad
Revision 1.6 - Various validation fixes 2004/02/20 ntra
Revision 1.5 - MODS2 to MODS3 updates, language unstacking and de-duping, chopPunctuation expanded 2003/10/02 16:18:58 ntra
Revision 1.3 - Additional Changes not related to MODS Version 2.0 by ntra
Revision 1.2 - Added Log Comment 2003/03/24 19:37:42 ckeith
-->
<xsl:template match="/">
<xsl:choose>
<xsl:when test="//marc:collection">
<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">
<xsl:for-each select="//marc:collection/marc:record">
<mods version="3.3">
<xsl:call-template name="marcRecord"/>
</mods>
</xsl:for-each>
</modsCollection>
</xsl:when>
<xsl:otherwise>
<mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3"
xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
<xsl:for-each select="//marc:record">
<xsl:call-template name="marcRecord"/>
</xsl:for-each>
</mods>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="marcRecord">
<xsl:variable name="leader" select="marc:leader"/>
<xsl:variable name="leader6" select="substring($leader,7,1)"/>
<xsl:variable name="leader7" select="substring($leader,8,1)"/>
<xsl:variable name="controlField008" select="marc:controlfield[@tag='008']"/>
<xsl:variable name="typeOf008">
<xsl:choose>
<xsl:when test="$leader6='a'">
<xsl:choose>
<xsl:when
test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'">BK</xsl:when>
<xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'">SE</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:when test="$leader6='t'">BK</xsl:when>
<xsl:when test="$leader6='p'">MM</xsl:when>
<xsl:when test="$leader6='m'">CF</xsl:when>
<xsl:when test="$leader6='e' or $leader6='f'">MP</xsl:when>
<xsl:when test="$leader6='g' or $leader6='k' or $leader6='o' or $leader6='r'">VM</xsl:when>
<xsl:when test="$leader6='c' or $leader6='d' or $leader6='i' or $leader6='j'"
>MU</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:for-each select="marc:datafield[@tag='245']">
<titleInfo>
<xsl:variable name="title">
<xsl:choose>
<xsl:when test="marc:subfield[@code='b']">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">b</xsl:with-param>
<xsl:with-param name="beforeCodes">afgk</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abfgk</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="titleChop">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="$title"/>
</xsl:with-param>
<xsl:with-param name="punctuation">
<xsl:text>,;/ </xsl:text>
</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="@ind2>0">
<nonSort>
<xsl:value-of select="substring($titleChop,1,@ind2)"/>
</nonSort>
<title>
<xsl:value-of select="substring($titleChop,@ind2+1)"/>
</title>
</xsl:when>
<xsl:otherwise>
<title>
<xsl:value-of select="$titleChop"/>
</title>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="marc:subfield[@code='b']">
<subTitle>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">b</xsl:with-param>
<xsl:with-param name="anyCodes">b</xsl:with-param>
<xsl:with-param name="afterCodes">afgk</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</subTitle>
</xsl:if>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='210']">
<titleInfo type="abbreviated">
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">a</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="subtitle"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='242']">
<titleInfo type="translated">
<!--09/01/04 Added subfield $y-->
<xsl:for-each select="marc:subfield[@code='y']">
<xsl:attribute name="lang">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='i']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<!-- 1/04 removed $h, b -->
<xsl:with-param name="codes">a</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<!-- 1/04 fix -->
<xsl:call-template name="subtitle"/>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='246']">
<titleInfo type="alternative">
<xsl:for-each select="marc:subfield[@code='i']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="text()"/>
</xsl:attribute>
</xsl:for-each>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<!-- 1/04 removed $h, $b -->
<xsl:with-param name="codes">af</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="subtitle"/>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each
select="marc:datafield[@tag='130']|marc:datafield[@tag='240']|marc:datafield[@tag='730'][@ind2!='2']">
<titleInfo type="uniform">
<title>
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield">
<xsl:if
test="(contains('adfklmors',@code) and (not(../marc:subfield[@code='n' or @code='p']) or (following-sibling::marc:subfield[@code='n' or @code='p'])))">
<xsl:value-of select="text()"/>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='740'][@ind2!='2']">
<titleInfo type="alternative">
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ah</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='100']">
<name type="personal">
<xsl:call-template name="uri"/>
<xsl:call-template name="nameABCDQ"/>
<xsl:call-template name="affiliation"/>
<role>
<roleTerm authority="marcrelator" type="text">creator</roleTerm>
</role>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='110']">
<name type="corporate">
<xsl:call-template name="uri"/>
<xsl:call-template name="nameABCDN"/>
<role>
<roleTerm authority="marcrelator" type="text">creator</roleTerm>
</role>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='111']">
<name type="conference">
<xsl:call-template name="uri"/>
<xsl:call-template name="nameACDEQ"/>
<role>
<roleTerm authority="marcrelator" type="text">creator</roleTerm>
</role>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='700'][not(marc:subfield[@code='t'])]">
<name type="personal">
<xsl:call-template name="uri"/>
<xsl:call-template name="nameABCDQ"/>
<xsl:call-template name="affiliation"/>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='710'][not(marc:subfield[@code='t'])]">
<name type="corporate">
<xsl:call-template name="uri"/>
<xsl:call-template name="nameABCDN"/>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='711'][not(marc:subfield[@code='t'])]">
<name type="conference">
<xsl:call-template name="uri"/>
<xsl:call-template name="nameACDEQ"/>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='720'][not(marc:subfield[@code='t'])]">
<name>
<xsl:if test="@ind1=1">
<xsl:attribute name="type">
<xsl:text>personal</xsl:text>
</xsl:attribute>
</xsl:if>
<namePart>
<xsl:value-of select="marc:subfield[@code='a']"/>
</namePart>
<xsl:call-template name="role"/>
</name>
</xsl:for-each>
<typeOfResource>
<xsl:if test="$leader7='c'">
<xsl:attribute name="collection">yes</xsl:attribute>
</xsl:if>
<xsl:if test="$leader6='d' or $leader6='f' or $leader6='p' or $leader6='t'">
<xsl:attribute name="manuscript">yes</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="$leader6='a' or $leader6='t'">text</xsl:when>
<xsl:when test="$leader6='e' or $leader6='f'">cartographic</xsl:when>
<xsl:when test="$leader6='c' or $leader6='d'">notated music</xsl:when>
<xsl:when test="$leader6='i'">sound recording-nonmusical</xsl:when>
<xsl:when test="$leader6='j'">sound recording-musical</xsl:when>
<xsl:when test="$leader6='k'">still image</xsl:when>
<xsl:when test="$leader6='g'">moving image</xsl:when>
<xsl:when test="$leader6='r'">three dimensional object</xsl:when>
<xsl:when test="$leader6='m'">software, multimedia</xsl:when>
<xsl:when test="$leader6='p'">mixed material</xsl:when>
</xsl:choose>
</typeOfResource>
<xsl:if test="substring($controlField008,26,1)='d'">
<genre authority="marcgt">globe</genre>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag='007'][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
<genre authority="marcgt">remote-sensing image</genre>
</xsl:if>
<xsl:if test="$typeOf008='MP'">
<xsl:variable name="controlField008-25" select="substring($controlField008,26,1)"/>
<xsl:choose>
<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']">
<genre authority="marcgt">map</genre>
</xsl:when>
<xsl:when
test="$controlField008-25='e' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
<genre authority="marcgt">atlas</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='SE'">
<xsl:variable name="controlField008-21" select="substring($controlField008,22,1)"/>
<xsl:choose>
<xsl:when test="$controlField008-21='d'">
<genre authority="marcgt">database</genre>
</xsl:when>
<xsl:when test="$controlField008-21='l'">
<genre authority="marcgt">loose-leaf</genre>
</xsl:when>
<xsl:when test="$controlField008-21='m'">
<genre authority="marcgt">series</genre>
</xsl:when>
<xsl:when test="$controlField008-21='n'">
<genre authority="marcgt">newspaper</genre>
</xsl:when>
<xsl:when test="$controlField008-21='p'">
<genre authority="marcgt">periodical</genre>
</xsl:when>
<xsl:when test="$controlField008-21='w'">
<genre authority="marcgt">web site</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='BK' or $typeOf008='SE'">
<xsl:variable name="controlField008-24" select="substring($controlField008,25,4)"/>
<xsl:choose>
<xsl:when test="contains($controlField008-24,'a')">
<genre authority="marcgt">abstract or summary</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'b')">
<genre authority="marcgt">bibliography</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'c')">
<genre authority="marcgt">catalog</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'d')">
<genre authority="marcgt">dictionary</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'e')">
<genre authority="marcgt">encyclopedia</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'f')">
<genre authority="marcgt">handbook</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'g')">
<genre authority="marcgt">legal article</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'i')">
<genre authority="marcgt">index</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'k')">
<genre authority="marcgt">discography</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'l')">
<genre authority="marcgt">legislation</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'m')">
<genre authority="marcgt">theses</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'n')">
<genre authority="marcgt">survey of literature</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'o')">
<genre authority="marcgt">review</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'p')">
<genre authority="marcgt">programmed text</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'q')">
<genre authority="marcgt">filmography</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'r')">
<genre authority="marcgt">directory</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'s')">
<genre authority="marcgt">statistics</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'t')">
<genre authority="marcgt">technical report</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'v')">
<genre authority="marcgt">legal case and case notes</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'w')">
<genre authority="marcgt">law report or digest</genre>
</xsl:when>
<xsl:when test="contains($controlField008-24,'z')">
<genre authority="marcgt">treaty</genre>
</xsl:when>
</xsl:choose>
<xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
<xsl:choose>
<xsl:when test="$controlField008-29='1'">
<genre authority="marcgt">conference publication</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='CF'">
<xsl:variable name="controlField008-26" select="substring($controlField008,27,1)"/>
<xsl:choose>
<xsl:when test="$controlField008-26='a'">
<genre authority="marcgt">numeric data</genre>
</xsl:when>
<xsl:when test="$controlField008-26='e'">
<genre authority="marcgt">database</genre>
</xsl:when>
<xsl:when test="$controlField008-26='f'">
<genre authority="marcgt">font</genre>
</xsl:when>
<xsl:when test="$controlField008-26='g'">
<genre authority="marcgt">game</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='BK'">
<xsl:if test="substring($controlField008,25,1)='j'">
<genre authority="marcgt">patent</genre>
</xsl:if>
<xsl:if test="substring($controlField008,25,1)='2'">
<genre authority="marcgt">offprint</genre>
</xsl:if>
<xsl:if test="substring($controlField008,31,1)='1'">
<genre authority="marcgt">festschrift</genre>
</xsl:if>
<xsl:variable name="controlField008-34" select="substring($controlField008,35,1)"/>
<xsl:if
test="$controlField008-34='a' or $controlField008-34='b' or $controlField008-34='c' or $controlField008-34='d'">
<genre authority="marcgt">biography</genre>
</xsl:if>
<xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
<xsl:choose>
<xsl:when test="$controlField008-33='e'">
<genre authority="marcgt">essay</genre>
</xsl:when>
<xsl:when test="$controlField008-33='d'">
<genre authority="marcgt">drama</genre>
</xsl:when>
<xsl:when test="$controlField008-33='c'">
<genre authority="marcgt">comic strip</genre>
</xsl:when>
<xsl:when test="$controlField008-33='l'">
<genre authority="marcgt">fiction</genre>
</xsl:when>
<xsl:when test="$controlField008-33='h'">
<genre authority="marcgt">humor, satire</genre>
</xsl:when>
<xsl:when test="$controlField008-33='i'">
<genre authority="marcgt">letter</genre>
</xsl:when>
<xsl:when test="$controlField008-33='f'">
<genre authority="marcgt">novel</genre>
</xsl:when>
<xsl:when test="$controlField008-33='j'">
<genre authority="marcgt">short story</genre>
</xsl:when>
<xsl:when test="$controlField008-33='s'">
<genre authority="marcgt">speech</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:if test="$typeOf008='MU'">
<xsl:variable name="controlField008-30-31" select="substring($controlField008,31,2)"/>
<xsl:if test="contains($controlField008-30-31,'b')">
<genre authority="marcgt">biography</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'c')">
<genre authority="marcgt">conference publication</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'d')">
<genre authority="marcgt">drama</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'e')">
<genre authority="marcgt">essay</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'f')">
<genre authority="marcgt">fiction</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'o')">
<genre authority="marcgt">folktale</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'h')">
<genre authority="marcgt">history</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'k')">
<genre authority="marcgt">humor, satire</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'m')">
<genre authority="marcgt">memoir</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'p')">
<genre authority="marcgt">poetry</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'r')">
<genre authority="marcgt">rehearsal</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'g')">
<genre authority="marcgt">reporting</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'s')">
<genre authority="marcgt">sound</genre>
</xsl:if>
<xsl:if test="contains($controlField008-30-31,'l')">
<genre authority="marcgt">speech</genre>
</xsl:if>
</xsl:if>
<xsl:if test="$typeOf008='VM'">
<xsl:variable name="controlField008-33" select="substring($controlField008,34,1)"/>
<xsl:choose>
<xsl:when test="$controlField008-33='a'">
<genre authority="marcgt">art original</genre>
</xsl:when>
<xsl:when test="$controlField008-33='b'">
<genre authority="marcgt">kit</genre>
</xsl:when>
<xsl:when test="$controlField008-33='c'">
<genre authority="marcgt">art reproduction</genre>
</xsl:when>
<xsl:when test="$controlField008-33='d'">
<genre authority="marcgt">diorama</genre>
</xsl:when>
<xsl:when test="$controlField008-33='f'">
<genre authority="marcgt">filmstrip</genre>
</xsl:when>
<xsl:when test="$controlField008-33='g'">
<genre authority="marcgt">legal article</genre>
</xsl:when>
<xsl:when test="$controlField008-33='i'">
<genre authority="marcgt">picture</genre>
</xsl:when>
<xsl:when test="$controlField008-33='k'">
<genre authority="marcgt">graphic</genre>
</xsl:when>
<xsl:when test="$controlField008-33='l'">
<genre authority="marcgt">technical drawing</genre>
</xsl:when>
<xsl:when test="$controlField008-33='m'">
<genre authority="marcgt">motion picture</genre>
</xsl:when>
<xsl:when test="$controlField008-33='n'">
<genre authority="marcgt">chart</genre>
</xsl:when>
<xsl:when test="$controlField008-33='o'">
<genre authority="marcgt">flash card</genre>
</xsl:when>
<xsl:when test="$controlField008-33='p'">
<genre authority="marcgt">microscope slide</genre>
</xsl:when>
<xsl:when
test="$controlField008-33='q' or marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
<genre authority="marcgt">model</genre>
</xsl:when>
<xsl:when test="$controlField008-33='r'">
<genre authority="marcgt">realia</genre>
</xsl:when>
<xsl:when test="$controlField008-33='s'">
<genre authority="marcgt">slide</genre>
</xsl:when>
<xsl:when test="$controlField008-33='t'">
<genre authority="marcgt">transparency</genre>
</xsl:when>
<xsl:when test="$controlField008-33='v'">
<genre authority="marcgt">videorecording</genre>
</xsl:when>
<xsl:when test="$controlField008-33='w'">
<genre authority="marcgt">toy</genre>
</xsl:when>
</xsl:choose>
</xsl:if>
<!-- 1.20 047 genre tmee-->
<xsl:for-each select="marc:datafield[@tag=047]">
<genre authority="marcgt">
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code='2']"/>
</xsl:attribute>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcdef</xsl:with-param>
<xsl:with-param name="delimeter">-</xsl:with-param>
</xsl:call-template>
</genre>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=655]">
<genre authority="marcgt">
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code='2']"/>
</xsl:attribute>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abvxyz</xsl:with-param>
<xsl:with-param name="delimeter">-</xsl:with-param>
</xsl:call-template>
</genre>
</xsl:for-each>
<originInfo>
<xsl:variable name="MARCpublicationCode"
select="normalize-space(substring($controlField008,16,3))"/>
<xsl:if test="translate($MARCpublicationCode,'|','')">
<place>
<placeTerm>
<xsl:attribute name="type">code</xsl:attribute>
<xsl:attribute name="authority">marccountry</xsl:attribute>
<xsl:value-of select="$MARCpublicationCode"/>
</placeTerm>
</place>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=044]/marc:subfield[@code='c']">
<place>
<placeTerm>
<xsl:attribute name="type">code</xsl:attribute>
<xsl:attribute name="authority">iso3166</xsl:attribute>
<xsl:value-of select="."/>
</placeTerm>
</place>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=260]/marc:subfield[@code='a']">
<place>
<placeTerm>
<xsl:attribute name="type">text</xsl:attribute>
<xsl:call-template name="chopPunctuationFront">
<xsl:with-param name="chopString">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</placeTerm>
</place>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='m']">
<dateValid point="start">
<xsl:value-of select="."/>
</dateValid>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='n']">
<dateValid point="end">
<xsl:value-of select="."/>
</dateValid>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=046]/marc:subfield[@code='j']">
<dateModified>
<xsl:value-of select="."/>
</dateModified>
</xsl:for-each>
<xsl:for-each
select="marc:datafield[@tag=260]/marc:subfield[@code='b' or @code='c' or @code='g']">
<xsl:choose>
<xsl:when test="@code='b'">
<publisher>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
<xsl:with-param name="punctuation">
<xsl:text>:,;/ </xsl:text>
</xsl:with-param>
</xsl:call-template>
</publisher>
</xsl:when>
<xsl:when test="@code='c'">
<dateIssued>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</dateIssued>
</xsl:when>
<xsl:when test="@code='g'">
<dateCreated>
<xsl:value-of select="."/>
</dateCreated>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<xsl:variable name="dataField260c">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString"
select="marc:datafield[@tag=260]/marc:subfield[@code='c']"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="controlField008-7-10"
select="normalize-space(substring($controlField008, 8, 4))"/>
<xsl:variable name="controlField008-11-14"
select="normalize-space(substring($controlField008, 12, 4))"/>
<xsl:variable name="controlField008-6"
select="normalize-space(substring($controlField008, 7, 1))"/>
<xsl:if
test="$controlField008-6='e' or $controlField008-6='p' or $controlField008-6='r' or $controlField008-6='t' or $controlField008-6='s'">
<xsl:if test="$controlField008-7-10 and ($controlField008-7-10 != $dataField260c)">
<dateIssued encoding="marc">
<xsl:value-of select="$controlField008-7-10"/>
</dateIssued>
</xsl:if>
</xsl:if>
<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'">
<xsl:if test="$controlField008-7-10">
<dateIssued encoding="marc" point="start">
<xsl:value-of select="$controlField008-7-10"/>
</dateIssued>
</xsl:if>
</xsl:if>
<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'">
<xsl:if test="$controlField008-11-14">
<dateIssued encoding="marc" point="end">
<xsl:value-of select="$controlField008-11-14"/>
</dateIssued>
</xsl:if>
</xsl:if>
<xsl:if test="$controlField008-6='q'">
<xsl:if test="$controlField008-7-10">
<dateIssued encoding="marc" point="start" qualifier="questionable">
<xsl:value-of select="$controlField008-7-10"/>
</dateIssued>
</xsl:if>
</xsl:if>
<xsl:if test="$controlField008-6='q'">
<xsl:if test="$controlField008-11-14">
<dateIssued encoding="marc" point="end" qualifier="questionable">
<xsl:value-of select="$controlField008-11-14"/>
</dateIssued>
</xsl:if>
</xsl:if>
<xsl:if test="$controlField008-6='t'">
<xsl:if test="$controlField008-11-14">
<copyrightDate encoding="marc">
<xsl:value-of select="$controlField008-11-14"/>
</copyrightDate>
</xsl:if>
</xsl:if>
<xsl:for-each
select="marc:datafield[@tag=033][@ind1=0 or @ind1=1]/marc:subfield[@code='a']">
<dateCaptured encoding="iso8601">
<xsl:value-of select="."/>
</dateCaptured>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][1]">
<dateCaptured encoding="iso8601" point="start">
<xsl:value-of select="."/>
</dateCaptured>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=033][@ind1=2]/marc:subfield[@code='a'][2]">
<dateCaptured encoding="iso8601" point="end">
<xsl:value-of select="."/>
</dateCaptured>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=250]/marc:subfield[@code='a']">
<edition>
<xsl:value-of select="."/>
</edition>
</xsl:for-each>
<xsl:for-each select="marc:leader">
<issuance>
<xsl:choose>
<xsl:when
test="$leader7='a' or $leader7='c' or $leader7='d' or $leader7='m'"
>monographic</xsl:when>
<xsl:when test="$leader7='b' or $leader7='i' or $leader7='s'"
>continuing</xsl:when>
</xsl:choose>
</issuance>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=310]|marc:datafield[@tag=321]">
<frequency>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</frequency>
</xsl:for-each>
</originInfo>
<xsl:variable name="controlField008-35-37"
select="normalize-space(translate(substring($controlField008,36,3),'|#',''))"/>
<xsl:if test="$controlField008-35-37">
<language>
<languageTerm authority="iso639-2b" type="code">
<xsl:value-of select="substring($controlField008,36,3)"/>
</languageTerm>
</language>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=041]">
<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']">
<xsl:variable name="langCodes" select="."/>
<xsl:choose>
<xsl:when test="../marc:subfield[@code='2']='rfc3066'">
<!-- not stacked but could be repeated -->
<xsl:call-template name="rfcLanguages">
<xsl:with-param name="nodeNum">
<xsl:value-of select="1"/>
</xsl:with-param>
<xsl:with-param name="usedLanguages">
<xsl:text/>
</xsl:with-param>
<xsl:with-param name="controlField008-35-37">
<xsl:value-of select="$controlField008-35-37"/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- iso -->
<xsl:variable name="allLanguages">
<xsl:copy-of select="$langCodes"/>
</xsl:variable>
<xsl:variable name="currentLanguage">
<xsl:value-of select="substring($allLanguages,1,3)"/>
</xsl:variable>
<xsl:call-template name="isoLanguage">
<xsl:with-param name="currentLanguage">
<xsl:value-of select="substring($allLanguages,1,3)"/>
</xsl:with-param>
<xsl:with-param name="remainingLanguages">
<xsl:value-of
select="substring($allLanguages,4,string-length($allLanguages)-3)"
/>
</xsl:with-param>
<xsl:with-param name="usedLanguages">
<xsl:if test="$controlField008-35-37">
<xsl:value-of select="$controlField008-35-37"/>
</xsl:if>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
<xsl:variable name="physicalDescription">
<!--3.2 change tmee 007/11 -->
<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='a']">
<digitalOrigin>reformatted digital</digitalOrigin>
</xsl:if>
<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='b']">
<digitalOrigin>digitized microfilm</digitalOrigin>
</xsl:if>
<xsl:if test="$typeOf008='CF' and marc:controlfield[@tag=007][substring(.,12,1)='d']">
<digitalOrigin>digitized other analog</digitalOrigin>
</xsl:if>
<xsl:variable name="controlField008-23" select="substring($controlField008,24,1)"/>
<xsl:variable name="controlField008-29" select="substring($controlField008,30,1)"/>
<xsl:variable name="check008-23">
<xsl:if
test="$typeOf008='BK' or $typeOf008='MU' or $typeOf008='SE' or $typeOf008='MM'">
<xsl:value-of select="true()"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="check008-29">
<xsl:if test="$typeOf008='MP' or $typeOf008='VM'">
<xsl:value-of select="true()"/>
</xsl:if>
</xsl:variable>
<xsl:choose>
<xsl:when
test="($check008-23 and $controlField008-23='f') or ($check008-29 and $controlField008-29='f')">
<form authority="marcform">braille</form>
</xsl:when>
<xsl:when
test="($controlField008-23=' ' and ($leader6='c' or $leader6='d')) or (($typeOf008='BK' or $typeOf008='SE') and ($controlField008-23=' ' or $controlField008='r'))">
<form authority="marcform">print</form>
</xsl:when>
<xsl:when
test="$leader6 = 'm' or ($check008-23 and $controlField008-23='s') or ($check008-29 and $controlField008-29='s')">
<form authority="marcform">electronic</form>
</xsl:when>
<xsl:when
test="($check008-23 and $controlField008-23='b') or ($check008-29 and $controlField008-29='b')">
<form authority="marcform">microfiche</form>
</xsl:when>
<xsl:when
test="($check008-23 and $controlField008-23='a') or ($check008-29 and $controlField008-29='a')">
<form authority="marcform">microfilm</form>
</xsl:when>
</xsl:choose>
<!-- 1/04 fix -->
<xsl:if test="marc:datafield[@tag=130]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=130]/marc:subfield[@code='h']"
/>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=240]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=240]/marc:subfield[@code='h']"
/>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=242]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=242]/marc:subfield[@code='h']"
/>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='h']"
/>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=246]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=246]/marc:subfield[@code='h']"
/>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:if test="marc:datafield[@tag=730]/marc:subfield[@code='h']">
<form authority="gmd">
<xsl:call-template name="chopBrackets">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:datafield[@tag=730]/marc:subfield[@code='h']"
/>
</xsl:with-param>
</xsl:call-template>
</form>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=256]/marc:subfield[@code='a']">
<form>
<xsl:value-of select="."/>
</form>
</xsl:for-each>
<xsl:for-each select="marc:controlfield[@tag=007][substring(text(),1,1)='c']">
<xsl:choose>
<xsl:when test="substring(text(),14,1)='a'">
<reformattingQuality>access</reformattingQuality>
</xsl:when>
<xsl:when test="substring(text(),14,1)='p'">
<reformattingQuality>preservation</reformattingQuality>
</xsl:when>
<xsl:when test="substring(text(),14,1)='r'">
<reformattingQuality>replacement</reformattingQuality>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<!--3.2 change tmee 007/01 -->
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='b']">
<form authority="smd">chip cartridge</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='c']">
<form authority="smd">computer optical disc cartridge</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='j']">
<form authority="smd">magnetic disc</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='m']">
<form authority="smd">magneto-optical disc</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='o']">
<form authority="smd">optical disc</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='r']">
<form authority="smd">remote</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='a']">
<form authority="smd">tape cartridge</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='f']">
<form authority="smd">tape cassette</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='c'][substring(text(),2,1)='h']">
<form authority="smd">tape reel</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='a']">
<form authority="smd">celestial globe</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='e']">
<form authority="smd">earth moon globe</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='b']">
<form authority="smd">planetary or lunar globe</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='d'][substring(text(),2,1)='c']">
<form authority="smd">terrestrial globe</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='o'][substring(text(),2,1)='o']">
<form authority="smd">kit</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='d']">
<form authority="smd">atlas</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='g']">
<form authority="smd">diagram</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='j']">
<form authority="smd">map</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='q']">
<form authority="smd">model</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='k']">
<form authority="smd">profile</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='r']">
<form authority="smd">remote-sensing image</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='s']">
<form authority="smd">section</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='a'][substring(text(),2,1)='y']">
<form authority="smd">view</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='a']">
<form authority="smd">aperture card</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='e']">
<form authority="smd">microfiche</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='f']">
<form authority="smd">microfiche cassette</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='b']">
<form authority="smd">microfilm cartridge</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='c']">
<form authority="smd">microfilm cassette</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='d']">
<form authority="smd">microfilm reel</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='h'][substring(text(),2,1)='g']">
<form authority="smd">microopaque</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='c']">
<form authority="smd">film cartridge</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='f']">
<form authority="smd">film cassette</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='m'][substring(text(),2,1)='r']">
<form authority="smd">film reel</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='n']">
<form authority="smd">chart</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='c']">
<form authority="smd">collage</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='d']">
<form authority="smd">drawing</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='o']">
<form authority="smd">flash card</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='e']">
<form authority="smd">painting</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='f']">
<form authority="smd">photomechanical print</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='g']">
<form authority="smd">photonegative</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='h']">
<form authority="smd">photoprint</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='i']">
<form authority="smd">picture</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='j']">
<form authority="smd">print</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='k'][substring(text(),2,1)='l']">
<form authority="smd">technical drawing</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='q'][substring(text(),2,1)='q']">
<form authority="smd">notated music</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='d']">
<form authority="smd">filmslip</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='c']">
<form authority="smd">filmstrip cartridge</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='o']">
<form authority="smd">filmstrip roll</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='f']">
<form authority="smd">other filmstrip type</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='s']">
<form authority="smd">slide</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='g'][substring(text(),2,1)='t']">
<form authority="smd">transparency</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='r'][substring(text(),2,1)='r']">
<form authority="smd">remote-sensing image</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='e']">
<form authority="smd">cylinder</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='q']">
<form authority="smd">roll</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='g']">
<form authority="smd">sound cartridge</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='s']">
<form authority="smd">sound cassette</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='d']">
<form authority="smd">sound disc</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='t']">
<form authority="smd">sound-tape reel</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='i']">
<form authority="smd">sound-track film</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='s'][substring(text(),2,1)='w']">
<form authority="smd">wire recording</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='c']">
<form authority="smd">braille</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='b']">
<form authority="smd">combination</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='a']">
<form authority="smd">moon</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='f'][substring(text(),2,1)='d']">
<form authority="smd">tactile, with no writing system</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='c']">
<form authority="smd">braille</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='b']">
<form authority="smd">large print</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='a']">
<form authority="smd">regular print</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='t'][substring(text(),2,1)='d']">
<form authority="smd">text in looseleaf binder</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='c']">
<form authority="smd">videocartridge</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='f']">
<form authority="smd">videocassette</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='d']">
<form authority="smd">videodisc</form>
</xsl:if>
<xsl:if
test="marc:controlfield[@tag=007][substring(text(),1,1)='v'][substring(text(),2,1)='r']">
<form authority="smd">videoreel</form>
</xsl:if>
<xsl:for-each
select="marc:datafield[@tag=856]/marc:subfield[@code='q'][string-length(.)>1]">
<internetMediaType>
<xsl:value-of select="."/>
</internetMediaType>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=300]">
<extent>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abce</xsl:with-param>
</xsl:call-template>
</extent>
</xsl:for-each>
</xsl:variable>
<xsl:if test="string-length(normalize-space($physicalDescription))">
<physicalDescription>
<xsl:copy-of select="$physicalDescription"/>
</physicalDescription>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=520]">
<abstract>
<xsl:call-template name="uri"/>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</abstract>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=505]">
<tableOfContents>
<xsl:call-template name="uri"/>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">agrt</xsl:with-param>
</xsl:call-template>
</tableOfContents>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=521]">
<targetAudience>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</targetAudience>
</xsl:for-each>
<xsl:if test="$typeOf008='BK' or $typeOf008='CF' or $typeOf008='MU' or $typeOf008='VM'">
<xsl:variable name="controlField008-22" select="substring($controlField008,23,1)"/>
<xsl:choose>
<!-- 01/04 fix -->
<xsl:when test="$controlField008-22='d'">
<targetAudience authority="marctarget">adolescent</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='e'">
<targetAudience authority="marctarget">adult</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='g'">
<targetAudience authority="marctarget">general</targetAudience>
</xsl:when>
<xsl:when
test="$controlField008-22='b' or $controlField008-22='c' or $controlField008-22='j'">
<targetAudience authority="marctarget">juvenile</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='a'">
<targetAudience authority="marctarget">preschool</targetAudience>
</xsl:when>
<xsl:when test="$controlField008-22='f'">
<targetAudience authority="marctarget">specialized</targetAudience>
</xsl:when>
</xsl:choose>
</xsl:if>
<xsl:for-each select="marc:datafield[@tag=245]/marc:subfield[@code='c']">
<note type="statement of responsibility">
<xsl:value-of select="."/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=500]">
<note>
<xsl:value-of select="marc:subfield[@code='a']"/>
<xsl:call-template name="uri"/>
</note>
</xsl:for-each>
<!--3.2 change tmee additional note fields-->
<xsl:for-each select="marc:datafield[@tag=502]">
<note type="thesis">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=504]">
<note type="bibliography">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=508]">
<note type="creation/production credits">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=506]">
<note type="restrictions">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=510]">
<note type="citation/reference">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=511]">
<note type="performers">
<xsl:call-template name="uri"/>
<xsl:value-of select="marc:subfield[@code='a']"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=518]">
<note type="venue">
<xsl:call-template name="uri"/>
<xsl:value-of select="marc:subfield[@code='a']"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=530]">
<note type="additional physical form">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=533]">
<note type="reproduction">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=534]">
<note type="original version">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=538]">
<note type="system details">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=583]">
<note type="action">
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each
select="marc:datafield[@tag=501 or @tag=507 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]">
<note>
<xsl:call-template name="uri"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield[@code!='6' or @code!='8']">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</note>
</xsl:for-each>
<xsl:for-each
select="marc:datafield[@tag=034][marc:subfield[@code='d' or @code='e' or @code='f' or @code='g']]">
<subject>
<cartographics>
<coordinates>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">defg</xsl:with-param>
</xsl:call-template>
</coordinates>
</cartographics>
</subject>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=043]">
<subject>
<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
<geographicCode>
<xsl:attribute name="authority">
<xsl:if test="@code='a'">
<xsl:text>marcgac</xsl:text>
</xsl:if>
<xsl:if test="@code='b'">
<xsl:value-of select="following-sibling::marc:subfield[@code=2]"/>
</xsl:if>
<xsl:if test="@code='c'">
<xsl:text>iso3166</xsl:text>
</xsl:if>
</xsl:attribute>
<xsl:value-of select="self::marc:subfield"/>
</geographicCode>
</xsl:for-each>
</subject>
</xsl:for-each>
<!-- tmee 2006/11/27 -->
<xsl:for-each select="marc:datafield[@tag=255]">
<subject>
<xsl:for-each select="marc:subfield[@code='a' or @code='b' or @code='c']">
<cartographics>
<xsl:if test="@code='a'">
<scale>
<xsl:value-of select="."/>
</scale>
</xsl:if>
<xsl:if test="@code='b'">
<projection>
<xsl:value-of select="."/>
</projection>
</xsl:if>
<xsl:if test="@code='c'">
<coordinates>
<xsl:value-of select="."/>
</coordinates>
</xsl:if>
</cartographics>
</xsl:for-each>
</subject>
</xsl:for-each>
<xsl:apply-templates select="marc:datafield[653 >= @tag and @tag >= 600]"/>
<xsl:apply-templates select="marc:datafield[@tag=656]"/>
<xsl:for-each select="marc:datafield[@tag=752 or @tag=662]">
<subject>
<hierarchicalGeographic>
<xsl:for-each select="marc:subfield[@code='a']">
<country>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</country>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<state>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</state>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='c']">
<county>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</county>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='d']">
<city>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</city>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='e']">
<citySection>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</citySection>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='g']">
<region>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</region>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='h']">
<extraterrestrialArea>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</extraterrestrialArea>
</xsl:for-each>
</hierarchicalGeographic>
</subject>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=045][marc:subfield[@code='b']]">
<subject>
<xsl:choose>
<xsl:when test="@ind1=2">
<temporal encoding="iso8601" point="start">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='b'][1]"/>
</xsl:with-param>
</xsl:call-template>
</temporal>
<temporal encoding="iso8601" point="end">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='b'][2]"/>
</xsl:with-param>
</xsl:call-template>
</temporal>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="marc:subfield[@code='b']">
<temporal encoding="iso8601">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</temporal>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</subject>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=050]">
<xsl:for-each select="marc:subfield[@code='b']">
<classification authority="lcc">
<xsl:if test="../marc:subfield[@code='3']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="../marc:subfield[@code='3']"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="preceding-sibling::marc:subfield[@code='a'][1]"/>
<xsl:text> </xsl:text>
<xsl:value-of select="text()"/>
</classification>
</xsl:for-each>
<xsl:for-each
select="marc:subfield[@code='a'][not(following-sibling::marc:subfield[@code='b'])]">
<classification authority="lcc">
<xsl:if test="../marc:subfield[@code='3']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="../marc:subfield[@code='3']"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="text()"/>
</classification>
</xsl:for-each>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=082]">
<classification authority="ddc">
<xsl:if test="marc:subfield[@code='2']">
<xsl:attribute name="edition">
<xsl:value-of select="marc:subfield[@code='2']"/>
</xsl:attribute>
</xsl:if>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=080]">
<classification authority="udc">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abx</xsl:with-param>
</xsl:call-template>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=060]">
<classification authority="nlm">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=086][@ind1=0]">
<classification authority="sudocs">
<xsl:value-of select="marc:subfield[@code='a']"/>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=086][@ind1=1]">
<classification authority="candoc">
<xsl:value-of select="marc:subfield[@code='a']"/>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=086]">
<classification>
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code='2']"/>
</xsl:attribute>
<xsl:value-of select="marc:subfield[@code='a']"/>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=084]">
<classification>
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code='2']"/>
</xsl:attribute>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</classification>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=440]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">av</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=490][@ind1=0]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">av</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=510]">
<relatedItem type="isReferencedBy">
<note>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcx3</xsl:with-param>
</xsl:call-template>
</note>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=534]">
<relatedItem type="original">
<xsl:call-template name="relatedTitle"/>
<xsl:call-template name="relatedName"/>
<xsl:if test="marc:subfield[@code='b' or @code='c']">
<originInfo>
<xsl:for-each select="marc:subfield[@code='c']">
<publisher>
<xsl:value-of select="."/>
</publisher>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<edition>
<xsl:value-of select="."/>
</edition>
</xsl:for-each>
</originInfo>
</xsl:if>
<xsl:call-template name="relatedIdentifierISSN"/>
<xsl:for-each select="marc:subfield[@code='z']">
<identifier type="isbn">
<xsl:value-of select="."/>
</identifier>
</xsl:for-each>
<xsl:call-template name="relatedNote"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=700][marc:subfield[@code='t']]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"/>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
<name type="personal">
<namePart>
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">aq</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">g</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="termsOfAddress"/>
<xsl:call-template name="nameDate"/>
<xsl:call-template name="role"/>
</name>
<xsl:call-template name="relatedForm"/>
<xsl:call-template name="relatedIdentifierISSN"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=710][marc:subfield[@code='t']]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"/>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">dg</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="relatedPartNumName"/>
</titleInfo>
<name type="corporate">
<xsl:for-each select="marc:subfield[@code='a']">
<namePart>
<xsl:value-of select="."/>
</namePart>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<namePart>
<xsl:value-of select="."/>
</namePart>
</xsl:for-each>
<xsl:variable name="tempNamePart">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">c</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">dgn</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:if test="normalize-space($tempNamePart)">
<namePart>
<xsl:value-of select="$tempNamePart"/>
</namePart>
</xsl:if>
<xsl:call-template name="role"/>
</name>
<xsl:call-template name="relatedForm"/>
<xsl:call-template name="relatedIdentifierISSN"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=711][marc:subfield[@code='t']]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"/>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="relatedPartNumName"/>
</titleInfo>
<name type="conference">
<namePart>
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">aqdc</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">gn</xsl:with-param>
</xsl:call-template>
</namePart>
</name>
<xsl:call-template name="relatedForm"/>
<xsl:call-template name="relatedIdentifierISSN"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=730][@ind2=2]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"/>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
<xsl:call-template name="relatedForm"/>
<xsl:call-template name="relatedIdentifierISSN"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=740][@ind2=2]">
<relatedItem>
<xsl:call-template name="constituentOrRelatedType"/>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='a']"/>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
<xsl:call-template name="relatedForm"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=760]|marc:datafield[@tag=762]">
<relatedItem type="series">
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each
select="marc:datafield[@tag=765]|marc:datafield[@tag=767]|marc:datafield[@tag=777]|marc:datafield[@tag=787]">
<relatedItem>
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=775]">
<relatedItem type="otherVersion">
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=770]|marc:datafield[@tag=774]">
<relatedItem type="constituent">
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=772]|marc:datafield[@tag=773]">
<relatedItem type="host">
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=776]">
<relatedItem type="otherFormat">
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=780]">
<relatedItem type="preceding">
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=785]">
<relatedItem type="succeeding">
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=786]">
<relatedItem type="original">
<xsl:call-template name="relatedItem76X-78X"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=800]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
<name type="personal">
<namePart>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">aq</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="termsOfAddress"/>
<xsl:call-template name="nameDate"/>
<xsl:call-template name="role"/>
</name>
<xsl:call-template name="relatedForm"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=810]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklmorsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">dg</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="relatedPartNumName"/>
</titleInfo>
<name type="corporate">
<xsl:for-each select="marc:subfield[@code='a']">
<namePart>
<xsl:value-of select="."/>
</namePart>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<namePart>
<xsl:value-of select="."/>
</namePart>
</xsl:for-each>
<namePart>
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">c</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">dgn</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="role"/>
</name>
<xsl:call-template name="relatedForm"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=811]">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">tfklsv</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="afterCodes">g</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="relatedPartNumName"/>
</titleInfo>
<name type="conference">
<namePart>
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="anyCodes">aqdc</xsl:with-param>
<xsl:with-param name="axis">t</xsl:with-param>
<xsl:with-param name="beforeCodes">gn</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="role"/>
</name>
<xsl:call-template name="relatedForm"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='830']">
<relatedItem type="series">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">adfgklmorsv</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
<xsl:call-template name="relatedForm"/>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='856'][@ind2='2']/marc:subfield[@code='q']">
<relatedItem>
<internetMediaType>
<xsl:value-of select="."/>
</internetMediaType>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='020']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">isbn</xsl:with-param>
</xsl:call-template>
<xsl:if test="marc:subfield[@code='a']">
<identifier type="isbn">
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='024'][@ind1='0']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">isrc</xsl:with-param>
</xsl:call-template>
<xsl:if test="marc:subfield[@code='a']">
<identifier type="isrc">
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='024'][@ind1='2']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">ismn</xsl:with-param>
</xsl:call-template>
<xsl:if test="marc:subfield[@code='a']">
<identifier type="ismn">
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='024'][@ind1='4']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">sici</xsl:with-param>
</xsl:call-template>
<identifier type="sici">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='022']">
<xsl:if test="marc:subfield[@code='a']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">issn</xsl:with-param>
</xsl:call-template>
<identifier type="issn">
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:if>
<xsl:if test="marc:subfield[@code='l']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">issn-l</xsl:with-param>
</xsl:call-template>
<identifier type="issn-l">
<xsl:value-of select="marc:subfield[@code='l']"/>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='010']">
<xsl:call-template name="isInvalid">
<xsl:with-param name="type">lccn</xsl:with-param>
</xsl:call-template>
<identifier type="lccn">
<xsl:value-of select="normalize-space(marc:subfield[@code='a'])"/>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='028']">
<identifier>
<xsl:attribute name="type">
<xsl:choose>
<xsl:when test="@ind1='0'">issue number</xsl:when>
<xsl:when test="@ind1='1'">matrix number</xsl:when>
<xsl:when test="@ind1='2'">music plate</xsl:when>
<xsl:when test="@ind1='3'">music publisher</xsl:when>
<xsl:when test="@ind1='4'">videorecording identifier</xsl:when>
</xsl:choose>
</xsl:attribute>
<!--<xsl:call-template name="isInvalid"/>-->
<!-- no $z in 028 -->
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">
<xsl:choose>
<xsl:when test="@ind1='0'">ba</xsl:when>
<xsl:otherwise>ab</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='037']">
<identifier type="stock number">
<!--<xsl:call-template name="isInvalid"/>-->
<!-- no $z in 037 -->
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">ab</xsl:with-param>
</xsl:call-template>
</identifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag='856'][marc:subfield[@code='u']]">
<identifier>
<xsl:attribute name="type">
<xsl:choose>
<xsl:when
test="starts-with(marc:subfield[@code='u'],'urn:doi') or starts-with(marc:subfield[@code='u'],'doi')"
>doi</xsl:when>
<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>
<xsl:otherwise>uri</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:choose>
<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') ">
<xsl:value-of
select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"
/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="marc:subfield[@code='u']"/>
</xsl:otherwise>
</xsl:choose>
</identifier>
<xsl:if
test="starts-with(marc:subfield[@code='u'],'urn:hdl') or starts-with(marc:subfield[@code='u'],'hdl')">
<identifier type="hdl">
<xsl:if test="marc:subfield[@code='y' or @code='3' or @code='z']">
<xsl:attribute name="displayLabel">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">y3z</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:value-of
select="concat('hdl:',substring-after(marc:subfield[@code='u'],'http://hdl.loc.gov/'))"
/>
</identifier>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=024][@ind1=1]">
<identifier type="upc">
<xsl:call-template name="isInvalid"/>
<xsl:value-of select="marc:subfield[@code='a']"/>
</identifier>
</xsl:for-each>
<!-- 1/04 fix added $y -->
<!-- 1.21 tmee-->
<xsl:for-each select="marc:datafield[@tag=856][@ind2=1][marc:subfield[@code='u']]">
<relatedItem type="otherVersion">
<location>
<url>
<xsl:if test="marc:subfield[@code='y' or @code='3']">
<xsl:attribute name="displayLabel">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">y3</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:if test="marc:subfield[@code='z' ]">
<xsl:attribute name="note">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">z</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="marc:subfield[@code='u']"/>
</url>
</location>
</relatedItem>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=856][@ind2=2][marc:subfield[@code='u']]">
<relatedItem>
<location>
<url>
<xsl:if test="marc:subfield[@code='y' or @code='3']">
<xsl:attribute name="displayLabel">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">y3</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:if test="marc:subfield[@code='z' ]">
<xsl:attribute name="note">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">z</xsl:with-param>
</xsl:call-template>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="marc:subfield[@code='u']"/>
</url>
</location>
</relatedItem>
</xsl:for-each>
<!-- 3.2 change tmee 856z -->
<!-- 1.24 tmee -->
<xsl:for-each select="marc:datafield[@tag=852]">
<location>
<xsl:if test="marc:subfield[@code='a' or @code='b' or @code='e']">
<physicalLocation>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abe</xsl:with-param>
</xsl:call-template>
</physicalLocation>
</xsl:if>
<xsl:if test="marc:subfield[@code='u']">
<physicalLocation>
<xsl:call-template name="uri"/>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">u</xsl:with-param>
</xsl:call-template>
</physicalLocation>
</xsl:if>
<xsl:if
test="marc:subfield[@code='h' or @code='i' or @code='j' or @code='k' or @code='l' or @code='m' or @code='t']">
<shelfLocation>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">hijklmt</xsl:with-param>
</xsl:call-template>
</shelfLocation>
</xsl:if>
</location>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=506]">
<accessCondition type="restrictionOnAccess">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcd35</xsl:with-param>
</xsl:call-template>
</accessCondition>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=540]">
<accessCondition type="useAndReproduction">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcde35</xsl:with-param>
</xsl:call-template>
</accessCondition>
</xsl:for-each>
<recordInfo>
<!-- 1.25 tmee-->
<xsl:for-each select="marc:leader[substring($leader,19,1)='a']">
<descriptionStandard>aacr2</descriptionStandard>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=040]">
<xsl:if test="marc:subfield[@code='e']">
<descriptionStandard>
<xsl:value-of select="marc:subfield[@code='e']"/>
</descriptionStandard>
</xsl:if>
<recordContentSource authority="marcorg">
<xsl:value-of select="marc:subfield[@code='a']"/>
</recordContentSource>
</xsl:for-each>
<xsl:for-each select="marc:controlfield[@tag=008]">
<recordCreationDate encoding="marc">
<xsl:value-of select="substring(.,1,6)"/>
</recordCreationDate>
</xsl:for-each>
<xsl:for-each select="marc:controlfield[@tag=005]">
<recordChangeDate encoding="iso8601">
<xsl:value-of select="."/>
</recordChangeDate>
</xsl:for-each>
<xsl:for-each select="marc:controlfield[@tag=001]">
<recordIdentifier>
<xsl:if test="../marc:controlfield[@tag=003]">
<xsl:attribute name="source">
<xsl:value-of select="../marc:controlfield[@tag=003]"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="."/>
</recordIdentifier>
</xsl:for-each>
<xsl:for-each select="marc:datafield[@tag=040]/marc:subfield[@code='b']">
<languageOfCataloging>
<languageTerm authority="iso639-2b" type="code">
<xsl:value-of select="."/>
</languageTerm>
</languageOfCataloging>
</xsl:for-each>
</recordInfo>
</xsl:template>
<xsl:template name="displayForm">
<xsl:for-each select="marc:subfield[@code='c']">
<displayForm>
<xsl:value-of select="."/>
</displayForm>
</xsl:for-each>
</xsl:template>
<xsl:template name="affiliation">
<xsl:for-each select="marc:subfield[@code='u']">
<affiliation>
<xsl:value-of select="."/>
</affiliation>
</xsl:for-each>
</xsl:template>
<xsl:template name="uri">
<xsl:for-each select="marc:subfield[@code='u']">
<xsl:attribute name="xlink:href">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='0']">
<xsl:choose>
<xsl:when test="contains(text(), ')')">
<xsl:attribute name="xlink:href">
<xsl:value-of select="substring-after(text(), ')')"></xsl:value-of>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="xlink:href">
<xsl:value-of select="."></xsl:value-of>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template name="role">
<xsl:for-each select="marc:subfield[@code='e']">
<role>
<roleTerm type="text">
<xsl:value-of select="."/>
</roleTerm>
</role>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='4']">
<role>
<roleTerm authority="marcrelator" type="code">
<xsl:value-of select="."/>
</roleTerm>
</role>
</xsl:for-each>
</xsl:template>
<xsl:template name="part">
<xsl:variable name="partNumber">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">n</xsl:with-param>
<xsl:with-param name="anyCodes">n</xsl:with-param>
<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="partName">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">p</xsl:with-param>
<xsl:with-param name="anyCodes">p</xsl:with-param>
<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:if test="string-length(normalize-space($partNumber))">
<partNumber>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="$partNumber"/>
</xsl:call-template>
</partNumber>
</xsl:if>
<xsl:if test="string-length(normalize-space($partName))">
<partName>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="$partName"/>
</xsl:call-template>
</partName>
</xsl:if>
</xsl:template>
<xsl:template name="relatedPart">
<xsl:if test="@tag=773">
<xsl:for-each select="marc:subfield[@code='g']">
<part>
<text>
<xsl:value-of select="."/>
</text>
</part>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='q']">
<part>
<xsl:call-template name="parsePart"/>
</part>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="relatedPartNumName">
<xsl:variable name="partNumber">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">g</xsl:with-param>
<xsl:with-param name="anyCodes">g</xsl:with-param>
<xsl:with-param name="afterCodes">pst</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="partName">
<xsl:call-template name="specialSubfieldSelect">
<xsl:with-param name="axis">p</xsl:with-param>
<xsl:with-param name="anyCodes">p</xsl:with-param>
<xsl:with-param name="afterCodes">fgkdlmor</xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:if test="string-length(normalize-space($partNumber))">
<partNumber>
<xsl:value-of select="$partNumber"/>
</partNumber>
</xsl:if>
<xsl:if test="string-length(normalize-space($partName))">
<partName>
<xsl:value-of select="$partName"/>
</partName>
</xsl:if>
</xsl:template>
<xsl:template name="relatedName">
<xsl:for-each select="marc:subfield[@code='a']">
<name>
<namePart>
<xsl:value-of select="."/>
</namePart>
</name>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedForm">
<xsl:for-each select="marc:subfield[@code='h']">
<physicalDescription>
<form>
<xsl:value-of select="."/>
</form>
</physicalDescription>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedExtent">
<xsl:for-each select="marc:subfield[@code='h']">
<physicalDescription>
<extent>
<xsl:value-of select="."/>
</extent>
</physicalDescription>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedNote">
<xsl:for-each select="marc:subfield[@code='n']">
<note>
<xsl:value-of select="."/>
</note>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedSubject">
<xsl:for-each select="marc:subfield[@code='j']">
<subject>
<temporal encoding="iso8601">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</temporal>
</subject>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedIdentifierISSN">
<xsl:for-each select="marc:subfield[@code='x']">
<identifier type="issn">
<xsl:value-of select="."/>
</identifier>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedIdentifierLocal">
<xsl:for-each select="marc:subfield[@code='w']">
<identifier type="local">
<xsl:value-of select="."/>
</identifier>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedIdentifier">
<xsl:for-each select="marc:subfield[@code='o']">
<identifier>
<xsl:value-of select="."/>
</identifier>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedItem76X-78X">
<xsl:call-template name="displayLabel"/>
<xsl:call-template name="relatedTitle76X-78X"/>
<xsl:call-template name="relatedName"/>
<xsl:call-template name="relatedOriginInfo"/>
<xsl:call-template name="relatedLanguage"/>
<xsl:call-template name="relatedExtent"/>
<xsl:call-template name="relatedNote"/>
<xsl:call-template name="relatedSubject"/>
<xsl:call-template name="relatedIdentifier"/>
<xsl:call-template name="relatedIdentifierISSN"/>
<xsl:call-template name="relatedIdentifierLocal"/>
<xsl:call-template name="relatedPart"/>
</xsl:template>
<xsl:template name="subjectGeographicZ">
<geographic>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</geographic>
</xsl:template>
<xsl:template name="subjectTemporalY">
<temporal>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</temporal>
</xsl:template>
<xsl:template name="subjectTopic">
<topic>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</topic>
</xsl:template>
<!-- 3.2 change tmee 6xx $v genre -->
<xsl:template name="subjectGenre">
<genre>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</genre>
</xsl:template>
<xsl:template name="nameABCDN">
<xsl:for-each select="marc:subfield[@code='a']">
<namePart>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</namePart>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<namePart>
<xsl:value-of select="."/>
</namePart>
</xsl:for-each>
<xsl:if
test="marc:subfield[@code='c'] or marc:subfield[@code='d'] or marc:subfield[@code='n']">
<namePart>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">cdn</xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:if>
</xsl:template>
<xsl:template name="nameABCDQ">
<namePart>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">aq</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
<xsl:with-param name="punctuation">
<xsl:text>:,;/ </xsl:text>
</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="termsOfAddress"/>
<xsl:call-template name="nameDate"/>
</xsl:template>
<xsl:template name="nameACDEQ">
<namePart>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">acdeq</xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:template>
<xsl:template name="constituentOrRelatedType">
<xsl:if test="@ind2=2">
<xsl:attribute name="type">constituent</xsl:attribute>
</xsl:if>
</xsl:template>
<xsl:template name="relatedTitle">
<xsl:for-each select="marc:subfield[@code='t']">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</title>
</titleInfo>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedTitle76X-78X">
<xsl:for-each select="marc:subfield[@code='t']">
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
<xsl:call-template name="relatedPartNumName"/>
</xsl:if>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='p']">
<titleInfo type="abbreviated">
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
<xsl:call-template name="relatedPartNumName"/>
</xsl:if>
</titleInfo>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='s']">
<titleInfo type="uniform">
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:if test="marc:datafield[@tag!=773]and marc:subfield[@code='g']">
<xsl:call-template name="relatedPartNumName"/>
</xsl:if>
</titleInfo>
</xsl:for-each>
</xsl:template>
<xsl:template name="relatedOriginInfo">
<xsl:if test="marc:subfield[@code='b' or @code='d'] or marc:subfield[@code='f']">
<originInfo>
<xsl:if test="@tag=775">
<xsl:for-each select="marc:subfield[@code='f']">
<place>
<placeTerm>
<xsl:attribute name="type">code</xsl:attribute>
<xsl:attribute name="authority">marcgac</xsl:attribute>
<xsl:value-of select="."/>
</placeTerm>
</place>
</xsl:for-each>
</xsl:if>
<xsl:for-each select="marc:subfield[@code='d']">
<publisher>
<xsl:value-of select="."/>
</publisher>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<edition>
<xsl:value-of select="."/>
</edition>
</xsl:for-each>
</originInfo>
</xsl:if>
</xsl:template>
<xsl:template name="relatedLanguage">
<xsl:for-each select="marc:subfield[@code='e']">
<xsl:call-template name="getLanguage">
<xsl:with-param name="langString">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="nameDate">
<xsl:for-each select="marc:subfield[@code='d']">
<namePart type="date">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</namePart>
</xsl:for-each>
</xsl:template>
<xsl:template name="subjectAuthority">
<xsl:if test="@ind2!=4">
<xsl:if test="@ind2!=' '">
<xsl:if test="@ind2!=8">
<xsl:if test="@ind2!=9">
<xsl:attribute name="authority">
<xsl:choose>
<xsl:when test="@ind2=0">lcsh</xsl:when>
<xsl:when test="@ind2=1">lcshac</xsl:when>
<xsl:when test="@ind2=2">mesh</xsl:when>
<!-- 1/04 fix -->
<xsl:when test="@ind2=3">nal</xsl:when>
<xsl:when test="@ind2=5">csh</xsl:when>
<xsl:when test="@ind2=6">rvm</xsl:when>
<xsl:when test="@ind2=7">
<xsl:value-of select="marc:subfield[@code='2']"/>
</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:template>
<xsl:template name="subjectAnyOrder">
<xsl:for-each select="marc:subfield[@code='v' or @code='x' or @code='y' or @code='z']">
<xsl:choose>
<xsl:when test="@code='v'">
<xsl:call-template name="subjectGenre"/>
</xsl:when>
<xsl:when test="@code='x'">
<xsl:call-template name="subjectTopic"/>
</xsl:when>
<xsl:when test="@code='y'">
<xsl:call-template name="subjectTemporalY"/>
</xsl:when>
<xsl:when test="@code='z'">
<xsl:call-template name="subjectGeographicZ"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template name="specialSubfieldSelect">
<xsl:param name="anyCodes"/>
<xsl:param name="axis"/>
<xsl:param name="beforeCodes"/>
<xsl:param name="afterCodes"/>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield">
<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])">
<xsl:value-of select="text()"/>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-1)"/>
</xsl:template>
<!-- 3.2 change tmee 6xx $v genre -->
<xsl:template match="marc:datafield[@tag=600]">
<subject>
<xsl:call-template name="subjectAuthority"/>
<name type="personal">
<xsl:call-template name="termsOfAddress"/>
<namePart>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">aq</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:call-template name="nameDate"/>
<xsl:call-template name="affiliation"/>
<xsl:call-template name="role"/>
</name>
<xsl:call-template name="subjectAnyOrder"/>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=610]">
<subject>
<xsl:call-template name="subjectAuthority"/>
<name type="corporate">
<xsl:for-each select="marc:subfield[@code='a']">
<namePart>
<xsl:value-of select="."/>
</namePart>
</xsl:for-each>
<xsl:for-each select="marc:subfield[@code='b']">
<namePart>
<xsl:value-of select="."/>
</namePart>
</xsl:for-each>
<xsl:if test="marc:subfield[@code='c' or @code='d' or @code='n' or @code='p']">
<namePart>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">cdnp</xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:if>
<xsl:call-template name="role"/>
</name>
<xsl:call-template name="subjectAnyOrder"/>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=611]">
<subject>
<xsl:call-template name="subjectAuthority"/>
<name type="conference">
<namePart>
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcdeqnp</xsl:with-param>
</xsl:call-template>
</namePart>
<xsl:for-each select="marc:subfield[@code='4']">
<role>
<roleTerm authority="marcrelator" type="code">
<xsl:value-of select="."/>
</roleTerm>
</role>
</xsl:for-each>
</name>
<xsl:call-template name="subjectAnyOrder"/>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=630]">
<subject>
<xsl:call-template name="subjectAuthority"/>
<titleInfo>
<title>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">adfhklor</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</title>
<xsl:call-template name="part"/>
</titleInfo>
<xsl:call-template name="subjectAnyOrder"/>
</subject>
</xsl:template>
<!-- 1.27 648 tmee-->
<xsl:template match="marc:datafield[@tag=648]">
<subject>
<xsl:if test="marc:subfield[@code=2]">
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code=2]"/>
</xsl:attribute>
</xsl:if>
<xsl:call-template name="uri"/>
<xsl:call-template name="subjectAuthority"/>
<temporal>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcd</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</temporal>
<xsl:call-template name="subjectAnyOrder"/>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=650]">
<subject>
<xsl:call-template name="subjectAuthority"/>
<topic>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">abcd</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</topic>
<xsl:call-template name="subjectAnyOrder"/>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=651]">
<subject>
<xsl:call-template name="subjectAuthority"/>
<xsl:for-each select="marc:subfield[@code='a']">
<geographic>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="."/>
</xsl:call-template>
</geographic>
</xsl:for-each>
<xsl:call-template name="subjectAnyOrder"/>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=653]">
<subject>
<xsl:for-each select="marc:subfield[@code='a']">
<topic>
<xsl:value-of select="."/>
</topic>
</xsl:for-each>
</subject>
</xsl:template>
<xsl:template match="marc:datafield[@tag=656]">
<subject>
<xsl:if test="marc:subfield[@code=2]">
<xsl:attribute name="authority">
<xsl:value-of select="marc:subfield[@code=2]"/>
</xsl:attribute>
</xsl:if>
<occupation>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='a']"/>
</xsl:with-param>
</xsl:call-template>
</occupation>
</subject>
</xsl:template>
<xsl:template name="termsOfAddress">
<xsl:if test="marc:subfield[@code='b' or @code='c']">
<namePart type="termsOfAddress">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">bc</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</namePart>
</xsl:if>
</xsl:template>
<xsl:template name="displayLabel">
<xsl:if test="marc:subfield[@code='i']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="marc:subfield[@code='i']"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="marc:subfield[@code='3']">
<xsl:attribute name="displayLabel">
<xsl:value-of select="marc:subfield[@code='3']"/>
</xsl:attribute>
</xsl:if>
</xsl:template>
<xsl:template name="isInvalid">
<xsl:param name="type"/>
<xsl:if
test="marc:subfield[@code='z'] or marc:subfield[@code='y'] or marc:subfield[@code='m']">
<identifier>
<xsl:attribute name="type">
<xsl:value-of select="$type"/>
</xsl:attribute>
<xsl:attribute name="invalid">
<xsl:text>yes</xsl:text>
</xsl:attribute>
<xsl:if test="marc:subfield[@code='z']">
<xsl:value-of select="marc:subfield[@code='z']"/>
</xsl:if>
<xsl:if test="marc:subfield[@code='y']">
<xsl:value-of select="marc:subfield[@code='y']"/>
</xsl:if>
<xsl:if test="marc:subfield[@code='m']">
<xsl:value-of select="marc:subfield[@code='m']"/>
</xsl:if>
</identifier>
</xsl:if>
</xsl:template>
<xsl:template name="subtitle">
<xsl:if test="marc:subfield[@code='b']">
<subTitle>
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString">
<xsl:value-of select="marc:subfield[@code='b']"/>
<!--<xsl:call-template name="subfieldSelect">
<xsl:with-param name="codes">b</xsl:with-param>
</xsl:call-template>-->
</xsl:with-param>
</xsl:call-template>
</subTitle>
</xsl:if>
</xsl:template>
<xsl:template name="script">
<xsl:param name="scriptCode"/>
<xsl:attribute name="script">
<xsl:choose>
<xsl:when test="$scriptCode='(3'">Arabic</xsl:when>
<xsl:when test="$scriptCode='(B'">Latin</xsl:when>
<xsl:when test="$scriptCode='$1'">Chinese, Japanese, Korean</xsl:when>
<xsl:when test="$scriptCode='(N'">Cyrillic</xsl:when>
<xsl:when test="$scriptCode='(2'">Hebrew</xsl:when>
<xsl:when test="$scriptCode='(S'">Greek</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:template>
<xsl:template name="parsePart">
<!-- assumes 773$q= 1:2:3<4
with up to 3 levels and one optional start page
-->
<xsl:variable name="level1">
<xsl:choose>
<xsl:when test="contains(text(),':')">
<!-- 1:2 -->
<xsl:value-of select="substring-before(text(),':')"/>
</xsl:when>
<xsl:when test="not(contains(text(),':'))">
<!-- 1 or 1<3 -->
<xsl:if test="contains(text(),'<')">
<!-- 1<3 -->
<xsl:value-of select="substring-before(text(),'<')"/>
</xsl:if>
<xsl:if test="not(contains(text(),'<'))">
<!-- 1 -->
<xsl:value-of select="text()"/>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sici2">
<xsl:choose>
<xsl:when test="starts-with(substring-after(text(),$level1),':')">
<xsl:value-of select="substring(substring-after(text(),$level1),2)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-after(text(),$level1)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="level2">
<xsl:choose>
<xsl:when test="contains($sici2,':')">
<!-- 2:3<4 -->
<xsl:value-of select="substring-before($sici2,':')"/>
</xsl:when>
<xsl:when test="contains($sici2,'<')">
<!-- 1: 2<4 -->
<xsl:value-of select="substring-before($sici2,'<')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$sici2"/>
<!-- 1:2 -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="sici3">
<xsl:choose>
<xsl:when test="starts-with(substring-after($sici2,$level2),':')">
<xsl:value-of select="substring(substring-after($sici2,$level2),2)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-after($sici2,$level2)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="level3">
<xsl:choose>
<xsl:when test="contains($sici3,'<')">
<!-- 2<4 -->
<xsl:value-of select="substring-before($sici3,'<')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$sici3"/>
<!-- 3 -->
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="page">
<xsl:if test="contains(text(),'<')">
<xsl:value-of select="substring-after(text(),'<')"/>
</xsl:if>
</xsl:variable>
<xsl:if test="$level1">
<detail level="1">
<number>
<xsl:value-of select="$level1"/>
</number>
</detail>
</xsl:if>
<xsl:if test="$level2">
<detail level="2">
<number>
<xsl:value-of select="$level2"/>
</number>
</detail>
</xsl:if>
<xsl:if test="$level3">
<detail level="3">
<number>
<xsl:value-of select="$level3"/>
</number>
</detail>
</xsl:if>
<xsl:if test="$page">
<extent unit="page">
<start>
<xsl:value-of select="$page"/>
</start>
</extent>
</xsl:if>
</xsl:template>
<xsl:template name="getLanguage">
<xsl:param name="langString"/>
<xsl:param name="controlField008-35-37"/>
<xsl:variable name="length" select="string-length($langString)"/>
<xsl:choose>
<xsl:when test="$length=0"/>
<xsl:when test="$controlField008-35-37=substring($langString,1,3)">
<xsl:call-template name="getLanguage">
<xsl:with-param name="langString" select="substring($langString,4,$length)"/>
<xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<language>
<languageTerm authority="iso639-2b" type="code">
<xsl:value-of select="substring($langString,1,3)"/>
</languageTerm>
</language>
<xsl:call-template name="getLanguage">
<xsl:with-param name="langString" select="substring($langString,4,$length)"/>
<xsl:with-param name="controlField008-35-37" select="$controlField008-35-37"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="isoLanguage">
<xsl:param name="currentLanguage"/>
<xsl:param name="usedLanguages"/>
<xsl:param name="remainingLanguages"/>
<xsl:choose>
<xsl:when test="string-length($currentLanguage)=0"/>
<xsl:when test="not(contains($usedLanguages, $currentLanguage))">
<language>
<xsl:if test="@code!='a'">
<xsl:attribute name="objectPart">
<xsl:choose>
<xsl:when test="@code='b'">summary or subtitle</xsl:when>
<xsl:when test="@code='d'">sung or spoken text</xsl:when>
<xsl:when test="@code='e'">libretto</xsl:when>
<xsl:when test="@code='f'">table of contents</xsl:when>
<xsl:when test="@code='g'">accompanying material</xsl:when>
<xsl:when test="@code='h'">translation</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<languageTerm authority="iso639-2b" type="code">
<xsl:value-of select="$currentLanguage"/>
</languageTerm>
</language>
<xsl:call-template name="isoLanguage">
<xsl:with-param name="currentLanguage">
<xsl:value-of select="substring($remainingLanguages,1,3)"/>
</xsl:with-param>
<xsl:with-param name="usedLanguages">
<xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
</xsl:with-param>
<xsl:with-param name="remainingLanguages">
<xsl:value-of
select="substring($remainingLanguages,4,string-length($remainingLanguages))"
/>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="isoLanguage">
<xsl:with-param name="currentLanguage">
<xsl:value-of select="substring($remainingLanguages,1,3)"/>
</xsl:with-param>
<xsl:with-param name="usedLanguages">
<xsl:value-of select="concat($usedLanguages,$currentLanguage)"/>
</xsl:with-param>
<xsl:with-param name="remainingLanguages">
<xsl:value-of
select="substring($remainingLanguages,4,string-length($remainingLanguages))"
/>
</xsl:with-param>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="chopBrackets">
<xsl:param name="chopString"/>
<xsl:variable name="string">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="$chopString"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="substring($string, 1,1)='['">
<xsl:value-of select="substring($string,2, string-length($string)-2)"/>
</xsl:if>
<xsl:if test="substring($string, 1,1)!='['">
<xsl:value-of select="$string"/>
</xsl:if>
</xsl:template>
<xsl:template name="rfcLanguages">
<xsl:param name="nodeNum"/>
<xsl:param name="usedLanguages"/>
<xsl:param name="controlField008-35-37"/>
<xsl:variable name="currentLanguage" select="."/>
<xsl:choose>
<xsl:when test="not($currentLanguage)"/>
<xsl:when
test="$currentLanguage!=$controlField008-35-37 and $currentLanguage!='rfc3066'">
<xsl:if test="not(contains($usedLanguages,$currentLanguage))">
<language>
<xsl:if test="@code!='a'">
<xsl:attribute name="objectPart">
<xsl:choose>
<xsl:when test="@code='b'">summary or subtitle</xsl:when>
<xsl:when test="@code='d'">sung or spoken text</xsl:when>
<xsl:when test="@code='e'">libretto</xsl:when>
<xsl:when test="@code='f'">table of contents</xsl:when>
<xsl:when test="@code='g'">accompanying material</xsl:when>
<xsl:when test="@code='h'">translation</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:if>
<languageTerm authority="rfc3066" type="code">
<xsl:value-of select="$currentLanguage"/>
</languageTerm>
</language>
</xsl:if>
</xsl:when>
<xsl:otherwise> </xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="datafield">
<xsl:param name="tag"/>
<xsl:param name="ind1">
<xsl:text> </xsl:text>
</xsl:param>
<xsl:param name="ind2">
<xsl:text> </xsl:text>
</xsl:param>
<xsl:param name="subfields"/>
<xsl:element name="marc:datafield">
<xsl:attribute name="tag">
<xsl:value-of select="$tag"/>
</xsl:attribute>
<xsl:attribute name="ind1">
<xsl:value-of select="$ind1"/>
</xsl:attribute>
<xsl:attribute name="ind2">
<xsl:value-of select="$ind2"/>
</xsl:attribute>
<xsl:copy-of select="$subfields"/>
</xsl:element>
</xsl:template>
<xsl:template name="subfieldSelect">
<xsl:param name="codes">abcdefghijklmnopqrstuvwxyz</xsl:param>
<xsl:param name="delimeter">
<xsl:text> </xsl:text>
</xsl:param>
<xsl:variable name="str">
<xsl:for-each select="marc:subfield">
<xsl:if test="contains($codes, @code)">
<xsl:value-of select="text()"/>
<xsl:value-of select="$delimeter"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="substring($str,1,string-length($str)-string-length($delimeter))"/>
</xsl:template>
<xsl:template name="buildSpaces">
<xsl:param name="spaces"/>
<xsl:param name="char">
<xsl:text> </xsl:text>
</xsl:param>
<xsl:if test="$spaces>0">
<xsl:value-of select="$char"/>
<xsl:call-template name="buildSpaces">
<xsl:with-param name="spaces" select="$spaces - 1"/>
<xsl:with-param name="char" select="$char"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="chopPunctuation">
<xsl:param name="chopString"/>
<xsl:param name="punctuation">
<xsl:text>.:,;/ </xsl:text>
</xsl:param>
<xsl:variable name="length" select="string-length($chopString)"/>
<xsl:choose>
<xsl:when test="$length=0"/>
<xsl:when test="contains($punctuation, substring($chopString,$length,1))">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
<xsl:with-param name="punctuation" select="$punctuation"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="not($chopString)"/>
<xsl:otherwise>
<xsl:value-of select="$chopString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="chopPunctuationFront">
<xsl:param name="chopString"/>
<xsl:variable name="length" select="string-length($chopString)"/>
<xsl:choose>
<xsl:when test="$length=0"/>
<xsl:when test="contains('.:,;/[ ', substring($chopString,1,1))">
<xsl:call-template name="chopPunctuationFront">
<xsl:with-param name="chopString" select="substring($chopString,2,$length - 1)"
/>
</xsl:call-template>
</xsl:when>
<xsl:when test="not($chopString)"/>
<xsl:otherwise>
<xsl:value-of select="$chopString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="chopPunctuationBack">
<xsl:param name="chopString"/>
<xsl:param name="punctuation">
<xsl:text>.:,;/] </xsl:text>
</xsl:param>
<xsl:variable name="length" select="string-length($chopString)"/>
<xsl:choose>
<xsl:when test="$length=0"/>
<xsl:when test="contains($punctuation, substring($chopString,$length,1))">
<xsl:call-template name="chopPunctuation">
<xsl:with-param name="chopString" select="substring($chopString,1,$length - 1)"/>
<xsl:with-param name="punctuation" select="$punctuation"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="not($chopString)"/>
<xsl:otherwise>
<xsl:value-of select="$chopString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- nate added 12/14/2007 for lccn.loc.gov: url encode ampersand, etc. -->
<xsl:template name="url-encode">
<xsl:param name="str"/>
<xsl:if test="$str">
<xsl:variable name="first-char" select="substring($str,1,1)"/>
<xsl:choose>
<xsl:when test="contains($safe,$first-char)">
<xsl:value-of select="$first-char"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="codepoint">
<xsl:choose>
<xsl:when test="contains($ascii,$first-char)">
<xsl:value-of
select="string-length(substring-before($ascii,$first-char)) + 32"
/>
</xsl:when>
<xsl:when test="contains($latin1,$first-char)">
<xsl:value-of
select="string-length(substring-before($latin1,$first-char)) + 160"/>
<!-- was 160 -->
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="no">Warning: string contains a character
that is out of range! Substituting "?".</xsl:message>
<xsl:text>63</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="hex-digit1"
select="substring($hex,floor($codepoint div 16) + 1,1)"/>
<xsl:variable name="hex-digit2" select="substring($hex,$codepoint mod 16 + 1,1)"/>
<!-- <xsl:value-of select="concat('%',$hex-digit2)"/> -->
<xsl:value-of select="concat('%',$hex-digit1,$hex-digit2)"/>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="string-length($str) > 1">
<xsl:call-template name="url-encode">
<xsl:with-param name="str" select="substring($str,2)"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:stylesheet>$XXXX$ where name = $$mods33$$;
1103 — virtual index defs
Type: data
View SQL
INSERT INTO config.metabib_field (id, field_class, name, label, browse_field)
VALUES (45, 'keyword', 'blob', 'All searchable fields', FALSE);
INSERT INTO config.metabib_field (id, field_class, name, format, weight,
label, xpath, display_field, search_field, browse_field, facet_field)
VALUES (
53, 'title', 'maintitle', 'marcxml', 10,
oils_i18n_gettext(53, 'Main Title', 'cmf', 'label'),
$$//*[@tag='245']/*[@code='a']$$,
FALSE, TRUE, FALSE, FALSE
);
INSERT INTO config.metabib_field_virtual_map (real, virtual)
SELECT id,
45
FROM config.metabib_field
WHERE search_field
AND id NOT IN (15, 45, 38, 40) -- keyword|keyword, self, edition, publisher
AND id NOT IN (SELECT real FROM config.metabib_field_virtual_map);
UPDATE config.metabib_field SET xpath=$$//mods32:mods/mods32:subject[not(descendant::mods32:geographicCode)]$$ WHERE id = 16;
UPDATE config.metabib_field_virtual_map SET weight = -1 WHERE real = 39;
UPDATE config.metabib_field_virtual_map SET weight = 0 WHERE real = 41;
UPDATE config.metabib_field_virtual_map SET weight = 0 WHERE real = 42;
UPDATE config.metabib_field_virtual_map SET weight = 0 WHERE real = 46;
UPDATE config.metabib_field_virtual_map SET weight = 0 WHERE real = 47;
UPDATE config.metabib_field_virtual_map SET weight = 0 WHERE real = 48;
UPDATE config.metabib_field_virtual_map SET weight = 0 WHERE real = 50;
UPDATE config.metabib_field_virtual_map SET weight = 8 WHERE real = 6;
UPDATE config.metabib_field_virtual_map SET weight = 8 WHERE real = 8;
UPDATE config.metabib_field_virtual_map SET weight = 8 WHERE real = 16;
UPDATE config.metabib_field_virtual_map SET weight = 12 WHERE real = 53;
-- Stemming for genre
INSERT INTO config.metabib_field_ts_map (metabib_field, ts_config)
SELECT 33, 'english_nostop' WHERE NOT EXISTS (
SELECT 1 FROM config.metabib_field_ts_map WHERE metabib_field = 33 AND ts_config = 'english_nostop'
)
;
DO $FUNC$
DECLARE
same_marc BOOL;
SELECT INTO same_marc enabled FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc';
UPDATE config.internal_flag SET enabled = true WHERE name = 'ingest.reingest.force_on_same_marc';
UPDATE biblio.record_entry SET id=id WHERE not deleted AND id > 0;
UPDATE config.internal_flag SET enabled = same_marc WHERE name = 'ingest.reingest.force_on_same_marc';
END;
$FUNC$;
1104 — hold checkout ou
Type: data
View SQL
INSERT INTO config.org_unit_setting_type
( name, grp, label, description, datatype )
VALUES
('circ.clear_hold_on_checkout',
'circ',
oils_i18n_gettext('circ.clear_hold_on_checkout',
'Clear hold when other patron checks out item',
'coust', 'label'),
oils_i18n_gettext('circ.clear_hold_on_checkout',
'Default to cancel the hold when patron A checks out item on hold for patron B.',
'coust', 'description'),
'bool');
1105 — webstaff.circ.itemsout notice count excludes courtesies
Type: schema
View SQL
INSERT into config.org_unit_setting_type (name, label, grp, description, datatype)
values ('webstaff.circ.itemsout_notice_count_excludes_courtesies','Exclude Courtesy Notices from Patrons Itemsout Notices Count',
'circ', 'Exclude Courtesy Notices from Patron Itemsout Notices Count', 'bool');
1106 — expand billing timestamps
Type: data
View SQL
ALTER TABLE money.billing
ADD COLUMN create_date TIMESTAMP WITH TIME ZONE,
ADD COLUMN period_start TIMESTAMP WITH TIME ZONE,
ADD COLUMN period_end TIMESTAMP WITH TIME ZONE;
--Disable materialized update trigger
--It takes forever, and doesn't matter yet for what we are doing, as the
--view definition is unchanged (still using billing_ts)
ALTER TABLE money.billing DISABLE TRIGGER mat_summary_upd_tgr;
--Limit to btype=1 / 'Overdue Materials'
--Update day-granular fines first (i.e. 24 hour, 1 day, 2 day, etc., all of which are multiples of 86400 seconds), and simply remove the time portion of timestamp
UPDATE money.billing mb
SET period_start = date_trunc('day', billing_ts), period_end = date_trunc('day', billing_ts) + (ac.fine_interval - '1 second')
FROM action.circulation ac
WHERE mb.xact = ac.id
AND mb.btype = 1
AND (EXTRACT(EPOCH FROM ac.fine_interval))::integer % 86400 = 0;
--Update fines for non-day intervals
UPDATE money.billing mb
SET period_start = billing_ts - ac.fine_interval + interval '1 sec', period_end = billing_ts
FROM action.circulation ac
WHERE mb.xact = ac.id
AND mb.btype = 1
AND (EXTRACT(EPOCH FROM ac.fine_interval))::integer % 86400 > 0;
SET CONSTRAINTS ALL IMMEDIATE;
UPDATE money.billing SET create_date = COALESCE(period_start, billing_ts);
--Re-enable update trigger
ALTER TABLE money.billing ENABLE TRIGGER mat_summary_upd_tgr;
ALTER TABLE money.billing ALTER COLUMN create_date SET DEFAULT NOW();
ALTER TABLE money.billing ALTER COLUMN create_date SET NOT NULL;
CREATE INDEX m_b_create_date_idx ON money.billing (create_date);
CREATE INDEX m_b_period_start_idx ON money.billing (period_start);
CREATE INDEX m_b_period_end_idx ON money.billing (period_end);
CREATE OR REPLACE FUNCTION money.maintain_billing_ts () RETURNS TRIGGER AS $$
NEW.billing_ts := COALESCE(NEW.period_end, NEW.create_date);
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER maintain_billing_ts_tgr BEFORE INSERT OR UPDATE ON money.billing FOR EACH ROW EXECUTE PROCEDURE money.maintain_billing_ts();
1108 — lp1758347 fix merge record assets
Type: schema
View SQL
CREATE OR REPLACE FUNCTION asset.merge_record_assets( target_record BIGINT, source_record BIGINT ) RETURNS INT AS $func$
DECLARE
moved_objects INT := 0;
source_cn asset.call_number%ROWTYPE;
target_cn asset.call_number%ROWTYPE;
metarec metabib.metarecord%ROWTYPE;
hold action.hold_request%ROWTYPE;
ser_rec serial.record_entry%ROWTYPE;
ser_sub serial.subscription%ROWTYPE;
acq_lineitem acq.lineitem%ROWTYPE;
acq_request acq.user_request%ROWTYPE;
booking booking.resource_type%ROWTYPE;
source_part biblio.monograph_part%ROWTYPE;
target_part biblio.monograph_part%ROWTYPE;
multi_home biblio.peer_bib_copy_map%ROWTYPE;
uri_count INT := 0;
counter INT := 0;
uri_datafield TEXT;
uri_text TEXT := '';
-- move any 856 entries on records that have at least one MARC-mapped URI entry
SELECT INTO uri_count COUNT(*)
FROM asset.uri_call_number_map m
JOIN asset.call_number cn ON (m.call_number = cn.id)
WHERE cn.record = source_record;
IF uri_count > 0 THEN
-- This returns more nodes than you might expect:
-- 7 instead of 1 for an 856 with $u $y $9
SELECT COUNT(*) INTO counter
FROM oils_xpath_table(
'id',
'marc',
'biblio.record_entry',
'//*[@tag="856"]',
'id=' || source_record
) as t(i int,c text);
FOR i IN 1 .. counter LOOP
SELECT '<datafield xmlns="http://www.loc.gov/MARC21/slim"' ||
' tag="856"' ||
' ind1="' || FIRST(ind1) || '"' ||
' ind2="' || FIRST(ind2) || '">' ||
STRING_AGG(
'<subfield code="' || subfield || '">' ||
regexp_replace(
regexp_replace(
regexp_replace(data,'&','&','g'),
'>', '>', 'g'
),
'<', '<', 'g'
) || '</subfield>', ''
) || '</datafield>' INTO uri_datafield
FROM oils_xpath_table(
'id',
'marc',
'biblio.record_entry',
'//*[@tag="856"][position()=' || i || ']/@ind1|' ||
'//*[@tag="856"][position()=' || i || ']/@ind2|' ||
'//*[@tag="856"][position()=' || i || ']/*/@code|' ||
'//*[@tag="856"][position()=' || i || ']/*[@code]',
'id=' || source_record
) as t(id int,ind1 text, ind2 text,subfield text,data text);
-- As most of the results will be NULL, protect against NULLifying
-- the valid content that we do generate
uri_text := uri_text || COALESCE(uri_datafield, '');
END LOOP;
IF uri_text <> '' THEN
UPDATE biblio.record_entry
SET marc = regexp_replace(marc,'(</[^>]*record>)', uri_text || E'\\1')
WHERE id = target_record;
END IF;
END IF;
-- Find and move metarecords to the target record
SELECT INTO metarec *
FROM metabib.metarecord
WHERE master_record = source_record;
IF FOUND THEN
UPDATE metabib.metarecord
SET master_record = target_record,
mods = NULL
WHERE id = metarec.id;
moved_objects := moved_objects + 1;
END IF;
-- Find call numbers attached to the source ...
FOR source_cn IN SELECT * FROM asset.call_number WHERE record = source_record LOOP
SELECT INTO target_cn *
FROM asset.call_number
WHERE label = source_cn.label
AND prefix = source_cn.prefix
AND suffix = source_cn.suffix
AND owning_lib = source_cn.owning_lib
AND record = target_record
AND NOT deleted;
-- ... and if there's a conflicting one on the target ...
IF FOUND THEN
-- ... move the copies to that, and ...
UPDATE asset.copy
SET call_number = target_cn.id
WHERE call_number = source_cn.id;
-- ... move V holds to the move-target call number
FOR hold IN SELECT * FROM action.hold_request WHERE target = source_cn.id AND hold_type = 'V' LOOP
UPDATE action.hold_request
SET target = target_cn.id
WHERE id = hold.id;
moved_objects := moved_objects + 1;
END LOOP;
UPDATE asset.call_number SET deleted = TRUE WHERE id = source_cn.id;
-- ... if not ...
ELSE
-- ... just move the call number to the target record
UPDATE asset.call_number
SET record = target_record
WHERE id = source_cn.id;
END IF;
moved_objects := moved_objects + 1;
END LOOP;
-- Find T holds targeting the source record ...
FOR hold IN SELECT * FROM action.hold_request WHERE target = source_record AND hold_type = 'T' LOOP
-- ... and move them to the target record
UPDATE action.hold_request
SET target = target_record
WHERE id = hold.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find serial records targeting the source record ...
FOR ser_rec IN SELECT * FROM serial.record_entry WHERE record = source_record LOOP
-- ... and move them to the target record
UPDATE serial.record_entry
SET record = target_record
WHERE id = ser_rec.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find serial subscriptions targeting the source record ...
FOR ser_sub IN SELECT * FROM serial.subscription WHERE record_entry = source_record LOOP
-- ... and move them to the target record
UPDATE serial.subscription
SET record_entry = target_record
WHERE id = ser_sub.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find booking resource types targeting the source record ...
FOR booking IN SELECT * FROM booking.resource_type WHERE record = source_record LOOP
-- ... and move them to the target record
UPDATE booking.resource_type
SET record = target_record
WHERE id = booking.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find acq lineitems targeting the source record ...
FOR acq_lineitem IN SELECT * FROM acq.lineitem WHERE eg_bib_id = source_record LOOP
-- ... and move them to the target record
UPDATE acq.lineitem
SET eg_bib_id = target_record
WHERE id = acq_lineitem.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find acq user purchase requests targeting the source record ...
FOR acq_request IN SELECT * FROM acq.user_request WHERE eg_bib = source_record LOOP
-- ... and move them to the target record
UPDATE acq.user_request
SET eg_bib = target_record
WHERE id = acq_request.id;
moved_objects := moved_objects + 1;
END LOOP;
-- Find parts attached to the source ...
FOR source_part IN SELECT * FROM biblio.monograph_part WHERE record = source_record LOOP
SELECT INTO target_part *
FROM biblio.monograph_part
WHERE label = source_part.label
AND record = target_record;
-- ... and if there's a conflicting one on the target ...
IF FOUND THEN
-- ... move the copy-part maps to that, and ...
UPDATE asset.copy_part_map
SET part = target_part.id
WHERE part = source_part.id;
-- ... move P holds to the move-target part
FOR hold IN SELECT * FROM action.hold_request WHERE target = source_part.id AND hold_type = 'P' LOOP
UPDATE action.hold_request
SET target = target_part.id
WHERE id = hold.id;
moved_objects := moved_objects + 1;
END LOOP;
-- ... if not ...
ELSE
-- ... just move the part to the target record
UPDATE biblio.monograph_part
SET record = target_record
WHERE id = source_part.id;
END IF;
moved_objects := moved_objects + 1;
END LOOP;
-- Find multi_home items attached to the source ...
FOR multi_home IN SELECT * FROM biblio.peer_bib_copy_map WHERE peer_record = source_record LOOP
-- ... and move them to the target record
UPDATE biblio.peer_bib_copy_map
SET peer_record = target_record
WHERE id = multi_home.id;
moved_objects := moved_objects + 1;
END LOOP;
-- And delete mappings where the item's home bib was merged with the peer bib
DELETE FROM biblio.peer_bib_copy_map WHERE peer_record = (
SELECT (SELECT record FROM asset.call_number WHERE id = call_number)
FROM asset.copy WHERE id = target_copy
);
-- Apply merge tracking
UPDATE biblio.record_entry
SET merge_date = NOW() WHERE id = target_record;
UPDATE biblio.record_entry
SET merge_date = NOW(), merged_to = target_record
WHERE id = source_record;
-- replace book bag entries of source_record with target_record
UPDATE container.biblio_record_entry_bucket_item
SET target_biblio_record_entry = target_record
WHERE bucket IN (SELECT id FROM container.biblio_record_entry_bucket WHERE btype = 'bookbag')
AND target_biblio_record_entry = source_record;
-- Finally, "delete" the source record
DELETE FROM biblio.record_entry WHERE id = source_record;
-- That's all, folks!
RETURN moved_objects;
END;
$func$ LANGUAGE plpgsql;
1109 — yaos circ holds default pickup lib
Type: data
View SQL
INSERT into config.org_unit_setting_type (name, label, grp, description, datatype)
values ('circ.staff_placed_holds_fallback_to_ws_ou','Workstation OU fallback for staff-placed holds',
'circ', 'For staff-placed holds, in the absence of a patron preferred pickup location, fall back to using the staff workstation OU (rather than patron home OU)', 'bool');