3 SELECT evergreen.upgrade_deps_block_check('0847', :eg_version);
5 CREATE OR REPLACE FUNCTION authority.generate_overlay_template (source_xml TEXT) RETURNS TEXT AS $f$
8 main_entry authority.control_set_authority_field%ROWTYPE;
9 bib_field authority.control_set_bib_field%ROWTYPE;
10 auth_id INT DEFAULT oils_xpath_string('//*[@tag="901"]/*[local-name()="subfield" and @code="c"]', source_xml)::INT;
12 replace_data XML[] DEFAULT '{}'::XML[];
13 replace_rules TEXT[] DEFAULT '{}'::TEXT[];
18 IF auth_id IS NULL THEN
22 -- Default to the LoC controll set
23 SELECT control_set INTO cset FROM authority.record_entry WHERE id = auth_id;
25 -- if none, make a best guess
27 SELECT control_set INTO cset
28 FROM authority.control_set_authority_field
30 SELECT UNNEST(XPATH('//*[starts-with(@tag,"1")]/@tag',marc::XML)::TEXT[])
31 FROM authority.record_entry
37 -- if STILL none, no-op change
41 XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
42 XMLELEMENT( name leader, '00881nam a2200193 4500'),
45 XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
48 XMLATTRIBUTES('d' AS code),
55 FOR main_entry IN SELECT * FROM authority.control_set_authority_field acsaf WHERE acsaf.control_set = cset AND acsaf.main_entry IS NULL LOOP
56 auth_field := XPATH('//*[@tag="'||main_entry.tag||'"][1]',source_xml::XML);
57 auth_i1 = (XPATH('@ind1',auth_field[1]))[1];
58 auth_i2 = (XPATH('@ind2',auth_field[1]))[1];
59 IF ARRAY_LENGTH(auth_field,1) > 0 THEN
60 FOR bib_field IN SELECT * FROM authority.control_set_bib_field WHERE authority_field = main_entry.id LOOP
61 SELECT XMLELEMENT( -- XMLAGG avoids magical <element> creation, but requires unnest subquery
63 XMLATTRIBUTES(bib_field.tag AS tag, auth_i1 AS ind1, auth_i2 AS ind2),
65 ) INTO tmp_data FROM UNNEST(XPATH('//*[local-name()="subfield"]', auth_field[1]));
66 replace_data := replace_data || tmp_data;
67 replace_rules := replace_rules || ( bib_field.tag || main_entry.sf_list || E'[0~\\)' || auth_id || '$]' );
74 SELECT XMLAGG(UNNEST) INTO tmp_data FROM UNNEST(replace_data);
78 XMLATTRIBUTES('http://www.loc.gov/MARC21/slim' AS xmlns),
79 XMLELEMENT( name leader, '00881nam a2200193 4500'),
83 XMLATTRIBUTES( '905' AS tag, ' ' AS ind1, ' ' AS ind2),
86 XMLATTRIBUTES('r' AS code),
87 ARRAY_TO_STRING(replace_rules,',')
92 $f$ STABLE LANGUAGE PLPGSQL;