Version Upgrade Cleanup
authorThomas Berezansky <tsbere@mvlc.org>
Thu, 10 May 2012 15:05:54 +0000 (11:05 -0400)
committerLebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Thu, 10 May 2012 16:41:33 +0000 (12:41 -0400)
Merge tacked on transactions into the "primary" transaction.
Add in 0708 for tracking purposes.

Separate 0672 and 0679+0680 in the version-to-version upgrade script
They're all potentially slow.

Signed-off-by: Lebbeous Fogle-Weekley <lebbeous@esilibrary.com>
Open-ILS/src/sql/Pg/version-upgrade/2.1-2.2-upgrade-db.sql

index 3086b50..de6d5c5 100644 (file)
@@ -8384,3404 +8384,161 @@ SELECT evergreen.upgrade_deps_block_check('0671', :eg_version);
 ALTER TABLE asset.copy_location
     ADD COLUMN checkin_alert BOOL NOT NULL DEFAULT FALSE;
 
--- Evergreen DB patch 0672.fix-nonfiling-titles.sql
---
--- Titles that begin with non-filing articles using apostrophes
--- (for example, "L'armée") get spaces injected between the article
--- and the subsequent text, which then breaks searching for titles
--- beginning with those articles.
---
--- This patch adds a nonfiling title element to MODS32 that can then
--- be used to retrieve the title proper without affecting the spaces
--- in the title. It's what we want, what we really really want, for
--- title searches.
+-- Evergreen DB patch 0673.data.acq-cancel-reason-cleanup.sql
 --
 
-
 -- check whether patch can be applied
-SELECT evergreen.upgrade_deps_block_check('0672', :eg_version);
+SELECT evergreen.upgrade_deps_block_check('0673', :eg_version);
 
--- Update the XPath definition before the titleNonfiling element exists;
--- but are you really going to read through the whole XSL below before
--- seeing this important bit?
+DELETE FROM
+    acq.cancel_reason
+WHERE
+    -- any entries with id >= 2000 were added locally.  
+    id < 2000 
+
+    -- these cancel_reason's are actively used by the system
+    AND id NOT IN (1, 2, 3, 1002, 1003, 1004, 1005, 1010, 1024, 1211, 1221, 1246, 1283)
+
+    -- don't delete any cancel_reason's that may be in use locally
+    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.user_request WHERE cancel_reason IS NOT NULL)
+    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.purchase_order WHERE cancel_reason IS NOT NULL)
+    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.lineitem WHERE cancel_reason IS NOT NULL)
+    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.lineitem_detail WHERE cancel_reason IS NOT NULL)
+    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.acq_lineitem_history WHERE cancel_reason IS NOT NULL)
+    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.acq_purchase_order_history WHERE cancel_reason IS NOT NULL);
+
+
+SELECT evergreen.upgrade_deps_block_check('0674', :eg_version);
+
+ALTER TABLE config.copy_status
+         ADD COLUMN restrict_copy_delete BOOL NOT NULL DEFAULT FALSE;
+
+UPDATE config.copy_status
+SET restrict_copy_delete = TRUE
+WHERE id IN (1,3,6,8);
+
+INSERT INTO permission.perm_list (id, code, description) VALUES (
+    520,
+    'COPY_DELETE_WARNING.override',
+    'Allow a user to override warnings about deleting copies in problematic situations.'
+);
+
+
+SELECT evergreen.upgrade_deps_block_check('0675', :eg_version);
+
+-- set expected row count to low value to avoid problem
+-- where use of this function by the circ tagging feature
+-- results in full scans of asset.call_number
+CREATE OR REPLACE FUNCTION action.usr_visible_circ_copies( INTEGER ) RETURNS SETOF BIGINT AS $$
+    SELECT DISTINCT(target_copy) FROM action.usr_visible_circs($1)
+$$ LANGUAGE SQL ROWS 10;
+
+
+SELECT evergreen.upgrade_deps_block_check('0676', :eg_version);
+
+INSERT INTO config.global_flag (name, label, enabled, value) VALUES (
+    'opac.use_autosuggest',
+    'OPAC: Show auto-completing suggestions dialog under basic search box (put ''opac_visible'' into the value field to limit suggestions to OPAC-visible items, or blank the field for a possible performance improvement)',
+    TRUE,
+    'opac_visible'
+);
+
+CREATE TABLE metabib.browse_entry (
+    id BIGSERIAL PRIMARY KEY,
+    value TEXT unique,
+    index_vector tsvector
+);
+--Skip this, will be created differently later
+--CREATE INDEX metabib_browse_entry_index_vector_idx ON metabib.browse_entry USING GIST (index_vector);
+CREATE TRIGGER metabib_browse_entry_fti_trigger
+    BEFORE INSERT OR UPDATE ON metabib.browse_entry
+    FOR EACH ROW EXECUTE PROCEDURE oils_tsearch2('keyword');
+
+
+CREATE TABLE metabib.browse_entry_def_map (
+    id BIGSERIAL PRIMARY KEY,
+    entry BIGINT REFERENCES metabib.browse_entry (id),
+    def INT REFERENCES config.metabib_field (id),
+    source BIGINT REFERENCES biblio.record_entry (id)
+);
+
+ALTER TABLE config.metabib_field ADD COLUMN browse_field BOOLEAN DEFAULT TRUE NOT NULL;
+ALTER TABLE config.metabib_field ADD COLUMN browse_xpath TEXT;
+
+ALTER TABLE config.metabib_class ADD COLUMN bouyant BOOLEAN DEFAULT FALSE NOT NULL;
+ALTER TABLE config.metabib_class ADD COLUMN restrict BOOLEAN DEFAULT FALSE NOT NULL;
+ALTER TABLE config.metabib_field ADD COLUMN restrict BOOLEAN DEFAULT FALSE NOT NULL;
+
+-- one good exception to default true:
 UPDATE config.metabib_field
-    SET xpath = $$//mods32:mods/mods32:titleNonfiling[mods32:title and not (@type)]$$,
-        format = 'mods32'
-    WHERE field_class = 'title' AND name = 'proper';
+    SET browse_field = FALSE
+    WHERE (field_class = 'keyword' AND name = 'keyword') OR
+        (field_class = 'subject' AND name = 'complete');
 
-UPDATE config.xml_transform SET xslt=$$<?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
+-- AFTER UPDATE OR INSERT trigger for biblio.record_entry
+-- We're only touching it here to add a DELETE statement to the IF NEW.deleted
+-- block.
 
-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
+CREATE OR REPLACE FUNCTION biblio.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
+DECLARE
+    transformed_xml TEXT;
+    prev_xfrm       TEXT;
+    normalizer      RECORD;
+    xfrm            config.xml_transform%ROWTYPE;
+    attr_value      TEXT;
+    new_attrs       HSTORE := ''::HSTORE;
+    attr_def        config.record_attr_definition%ROWTYPE;
+BEGIN
 
-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
+    IF NEW.deleted IS TRUE THEN -- If this bib is deleted
+        DELETE FROM metabib.metarecord_source_map WHERE source = NEW.id; -- Rid ourselves of the search-estimate-killing linkage
+        DELETE FROM metabib.record_attr WHERE id = NEW.id; -- Kill the attrs hash, useless on deleted records
+        DELETE FROM authority.bib_linking WHERE bib = NEW.id; -- Avoid updating fields in bibs that are no longer visible
+        DELETE FROM biblio.peer_bib_copy_map WHERE peer_record = NEW.id; -- Separate any multi-homed items
+        DELETE FROM metabib.browse_entry_def_map WHERE source = NEW.id; -- Don't auto-suggest deleted bibs
+        RETURN NEW; -- and we're done
+    END IF;
 
-Revision 1.9 subfield $y was added to field 242 2004/09/02 10:57 jrad
+    IF TG_OP = 'UPDATE' THEN -- re-ingest?
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
 
-Revision 1.8 Subject chopPunctuation expanded and attribute fixes 2004/08/12 jrad
+        IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
+            RETURN NEW;
+        END IF;
+    END IF;
 
-Revision 1.7 2004/03/25 08:29 jrad
+    -- Record authority linking
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_linking' AND enabled;
+    IF NOT FOUND THEN
+        PERFORM biblio.map_authority_linking( NEW.id, NEW.marc );
+    END IF;
 
-Revision 1.6 various validation fixes 2004/02/20 ntra
+    -- Flatten and insert the mfr data
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_full_rec' AND enabled;
+    IF NOT FOUND THEN
+        PERFORM metabib.reingest_metabib_full_rec(NEW.id);
 
-Revision 1.5  2003/10/02 16:18:58  ntra
-MODS2 to MODS3 updates, language unstacking and 
-de-duping, chopPunctuation expanded
+        -- Now we pull out attribute data, which is dependent on the mfr for all but XPath-based fields
+        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_rec_descriptor' AND enabled;
+        IF NOT FOUND THEN
+            FOR attr_def IN SELECT * FROM config.record_attr_definition ORDER BY format LOOP
 
-Revision 1.3  2003/04/03 00:07:19  ntra
-Revision 1.3 Additional Changes not related to MODS Version 2.0 by ntra
+                IF attr_def.tag IS NOT NULL THEN -- tag (and optional subfield list) selection
+                    SELECT  ARRAY_TO_STRING(ARRAY_ACCUM(value), COALESCE(attr_def.joiner,' ')) INTO attr_value
+                      FROM  (SELECT * FROM metabib.full_rec ORDER BY tag, subfield) AS x
+                      WHERE record = NEW.id
+                            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
+                      LIMIT 1;
 
-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: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>
-                               <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>
-                               <title>
-                                       <xsl:value-of select="$title"/>
-                               </title>
-                               <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>
-                       </titleNonfiling>
-               </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>
-                               <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: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>
-                               </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="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="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="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="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="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="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=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=502 or @tag=504 or @tag=507 or @tag=508 or  @tag=513 or @tag=514 or @tag=515 or @tag=516 or @tag=522 or @tag=524 or @tag=525 or @tag=526 or @tag=535 or @tag=536 or @tag=540 or @tag=541 or @tag=544 or @tag=545 or @tag=546 or @tag=547 or @tag=550 or @tag=552 or @tag=555 or @tag=556 or @tag=561 or @tag=562 or @tag=565 or @tag=567 or @tag=580 or @tag=581 or @tag=584 or @tag=585 or @tag=586]">
-                       <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">
-                               <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=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>
-                               <titleInfo>
-                                       <title>
-                                               <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>
-                                       </title>
-                                       <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">
-                               <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: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: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="termsOfAddress"></xsl:call-template>
-                               <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>
-                               <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: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">
-                               <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>
-                       <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>
-                                       <xsl:call-template name="part"></xsl:call-template>
-                               </title>
-                       </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="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="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: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="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(),'&lt;')">
-                                               <!-- 1<3 -->
-                                               <xsl:value-of select="substring-before(text(),'&lt;')"></xsl:value-of>
-                                       </xsl:if>
-                                       <xsl:if test="not(contains(text(),'&lt;'))">
-                                               <!-- 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,'&lt;')">
-                                       <!-- 1: 2<4 -->
-                                       <xsl:value-of select="substring-before($sici2,'&lt;')"></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,'&lt;')">
-                                       <!-- 2<4 -->
-                                       <xsl:value-of select="substring-before($sici3,'&lt;')"></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(),'&lt;')">
-                               <xsl:value-of select="substring-after(text(),'&lt;')"></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>$$ WHERE name = 'mods32';
-
--- Currently, the only difference from naco_normalize is that search_normalize
--- turns apostrophes into spaces, while naco_normalize collapses them.
-CREATE OR REPLACE FUNCTION public.search_normalize( TEXT, TEXT ) RETURNS TEXT AS $func$
-
-    use strict;
-    use Unicode::Normalize;
-    use Encode;
-
-    my $str = decode_utf8(shift);
-    my $sf = shift;
-
-    # Apply NACO normalization to input string; based on
-    # http://www.loc.gov/catdir/pcc/naco/SCA_PccNormalization_Final_revised.pdf
-    #
-    # Note that unlike a strict reading of the NACO normalization rules,
-    # output is returned as lowercase instead of uppercase for compatibility
-    # with previous versions of the Evergreen naco_normalize routine.
-
-    # Convert to upper-case first; even though final output will be lowercase, doing this will
-    # ensure that the German eszett (ß) and certain ligatures (ff, fi, ffl, etc.) will be handled correctly.
-    # If there are any bugs in Perl's implementation of upcasing, they will be passed through here.
-    $str = uc $str;
-
-    # remove non-filing strings
-    $str =~ s/\x{0098}.*?\x{009C}//g;
-
-    $str = NFKD($str);
-
-    # additional substitutions - 3.6.
-    $str =~ s/\x{00C6}/AE/g;
-    $str =~ s/\x{00DE}/TH/g;
-    $str =~ s/\x{0152}/OE/g;
-    $str =~ tr/\x{0110}\x{00D0}\x{00D8}\x{0141}\x{2113}\x{02BB}\x{02BC}][/DDOLl/d;
-
-    # transformations based on Unicode category codes
-    $str =~ s/[\p{Cc}\p{Cf}\p{Co}\p{Cs}\p{Lm}\p{Mc}\p{Me}\p{Mn}]//g;
-
-       if ($sf && $sf =~ /^a/o) {
-               my $commapos = index($str, ',');
-               if ($commapos > -1) {
-                       if ($commapos != length($str) - 1) {
-                $str =~ s/,/\x07/; # preserve first comma
-                       }
-               }
-       }
-
-    # since we've stripped out the control characters, we can now
-    # use a few as placeholders temporarily
-    $str =~ tr/+&@\x{266D}\x{266F}#/\x01\x02\x03\x04\x05\x06/;
-    $str =~ s/[\p{Pc}\p{Pd}\p{Pe}\p{Pf}\p{Pi}\p{Po}\p{Ps}\p{Sk}\p{Sm}\p{So}\p{Zl}\p{Zp}\p{Zs}]/ /g;
-    $str =~ tr/\x01\x02\x03\x04\x05\x06\x07/+&@\x{266D}\x{266F}#,/;
-
-    # decimal digits
-    $str =~ tr/\x{0660}-\x{0669}\x{06F0}-\x{06F9}\x{07C0}-\x{07C9}\x{0966}-\x{096F}\x{09E6}-\x{09EF}\x{0A66}-\x{0A6F}\x{0AE6}-\x{0AEF}\x{0B66}-\x{0B6F}\x{0BE6}-\x{0BEF}\x{0C66}-\x{0C6F}\x{0CE6}-\x{0CEF}\x{0D66}-\x{0D6F}\x{0E50}-\x{0E59}\x{0ED0}-\x{0ED9}\x{0F20}-\x{0F29}\x{1040}-\x{1049}\x{1090}-\x{1099}\x{17E0}-\x{17E9}\x{1810}-\x{1819}\x{1946}-\x{194F}\x{19D0}-\x{19D9}\x{1A80}-\x{1A89}\x{1A90}-\x{1A99}\x{1B50}-\x{1B59}\x{1BB0}-\x{1BB9}\x{1C40}-\x{1C49}\x{1C50}-\x{1C59}\x{A620}-\x{A629}\x{A8D0}-\x{A8D9}\x{A900}-\x{A909}\x{A9D0}-\x{A9D9}\x{AA50}-\x{AA59}\x{ABF0}-\x{ABF9}\x{FF10}-\x{FF19}/0-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-90-9/;
-
-    # intentionally skipping step 8 of the NACO algorithm; if the string
-    # gets normalized away, that's fine.
-
-    # leading and trailing spaces
-    $str =~ s/\s+/ /g;
-    $str =~ s/^\s+//;
-    $str =~ s/\s+$//g;
-
-    return lc $str;
-$func$ LANGUAGE 'plperlu' STRICT IMMUTABLE;
-
-CREATE OR REPLACE FUNCTION public.search_normalize_keep_comma( TEXT ) RETURNS TEXT AS $func$
-        SELECT public.search_normalize($1,'a');
-$func$ LANGUAGE SQL STRICT IMMUTABLE;
-
-CREATE OR REPLACE FUNCTION public.search_normalize( TEXT ) RETURNS TEXT AS $func$
-       SELECT public.search_normalize($1,'');
-$func$ LANGUAGE 'sql' STRICT IMMUTABLE;
-
-INSERT INTO config.index_normalizer (name, description, func, param_count) VALUES (
-       'Search Normalize',
-       'Apply search normalization rules to the extracted text. A less extreme version of NACO normalization.',
-       'search_normalize',
-       0
-);
-
-UPDATE config.metabib_field_index_norm_map
-    SET norm = (
-        SELECT id FROM config.index_normalizer WHERE func = 'search_normalize'
-    )
-    WHERE norm = (
-        SELECT id FROM config.index_normalizer WHERE func = 'naco_normalize'
-    )
-;
-
-
--- This could take a long time if you have a very non-English bib database
--- Run it outside of a transaction to avoid lock escalation
-SELECT metabib.reingest_metabib_field_entries(record)
-    FROM metabib.full_rec
-    WHERE tag = '245'
-    AND subfield = 'a'
-    AND value LIKE '%''%'
-;
--- Evergreen DB patch 0673.data.acq-cancel-reason-cleanup.sql
---
-
--- check whether patch can be applied
-SELECT evergreen.upgrade_deps_block_check('0673', :eg_version);
-
-DELETE FROM
-    acq.cancel_reason
-WHERE
-    -- any entries with id >= 2000 were added locally.  
-    id < 2000 
-
-    -- these cancel_reason's are actively used by the system
-    AND id NOT IN (1, 2, 3, 1002, 1003, 1004, 1005, 1010, 1024, 1211, 1221, 1246, 1283)
-
-    -- don't delete any cancel_reason's that may be in use locally
-    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.user_request WHERE cancel_reason IS NOT NULL)
-    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.purchase_order WHERE cancel_reason IS NOT NULL)
-    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.lineitem WHERE cancel_reason IS NOT NULL)
-    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.lineitem_detail WHERE cancel_reason IS NOT NULL)
-    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.acq_lineitem_history WHERE cancel_reason IS NOT NULL)
-    AND id NOT IN (SELECT DISTINCT(cancel_reason) FROM acq.acq_purchase_order_history WHERE cancel_reason IS NOT NULL);
-
-
-SELECT evergreen.upgrade_deps_block_check('0674', :eg_version);
-
-ALTER TABLE config.copy_status
-         ADD COLUMN restrict_copy_delete BOOL NOT NULL DEFAULT FALSE;
-
-UPDATE config.copy_status
-SET restrict_copy_delete = TRUE
-WHERE id IN (1,3,6,8);
-
-INSERT INTO permission.perm_list (id, code, description) VALUES (
-    520,
-    'COPY_DELETE_WARNING.override',
-    'Allow a user to override warnings about deleting copies in problematic situations.'
-);
-
-
-SELECT evergreen.upgrade_deps_block_check('0675', :eg_version);
-
--- set expected row count to low value to avoid problem
--- where use of this function by the circ tagging feature
--- results in full scans of asset.call_number
-CREATE OR REPLACE FUNCTION action.usr_visible_circ_copies( INTEGER ) RETURNS SETOF BIGINT AS $$
-    SELECT DISTINCT(target_copy) FROM action.usr_visible_circs($1)
-$$ LANGUAGE SQL ROWS 10;
-
-
-SELECT evergreen.upgrade_deps_block_check('0676', :eg_version);
-
-INSERT INTO config.global_flag (name, label, enabled, value) VALUES (
-    'opac.use_autosuggest',
-    'OPAC: Show auto-completing suggestions dialog under basic search box (put ''opac_visible'' into the value field to limit suggestions to OPAC-visible items, or blank the field for a possible performance improvement)',
-    TRUE,
-    'opac_visible'
-);
-
-CREATE TABLE metabib.browse_entry (
-    id BIGSERIAL PRIMARY KEY,
-    value TEXT unique,
-    index_vector tsvector
-);
---Skip this, will be created differently later
---CREATE INDEX metabib_browse_entry_index_vector_idx ON metabib.browse_entry USING GIST (index_vector);
-CREATE TRIGGER metabib_browse_entry_fti_trigger
-    BEFORE INSERT OR UPDATE ON metabib.browse_entry
-    FOR EACH ROW EXECUTE PROCEDURE oils_tsearch2('keyword');
-
-
-CREATE TABLE metabib.browse_entry_def_map (
-    id BIGSERIAL PRIMARY KEY,
-    entry BIGINT REFERENCES metabib.browse_entry (id),
-    def INT REFERENCES config.metabib_field (id),
-    source BIGINT REFERENCES biblio.record_entry (id)
-);
-
-ALTER TABLE config.metabib_field ADD COLUMN browse_field BOOLEAN DEFAULT TRUE NOT NULL;
-ALTER TABLE config.metabib_field ADD COLUMN browse_xpath TEXT;
-
-ALTER TABLE config.metabib_class ADD COLUMN bouyant BOOLEAN DEFAULT FALSE NOT NULL;
-ALTER TABLE config.metabib_class ADD COLUMN restrict BOOLEAN DEFAULT FALSE NOT NULL;
-ALTER TABLE config.metabib_field ADD COLUMN restrict BOOLEAN DEFAULT FALSE NOT NULL;
-
--- one good exception to default true:
-UPDATE config.metabib_field
-    SET browse_field = FALSE
-    WHERE (field_class = 'keyword' AND name = 'keyword') OR
-        (field_class = 'subject' AND name = 'complete');
-
--- AFTER UPDATE OR INSERT trigger for biblio.record_entry
--- We're only touching it here to add a DELETE statement to the IF NEW.deleted
--- block.
-
-CREATE OR REPLACE FUNCTION biblio.indexing_ingest_or_delete () RETURNS TRIGGER AS $func$
-DECLARE
-    transformed_xml TEXT;
-    prev_xfrm       TEXT;
-    normalizer      RECORD;
-    xfrm            config.xml_transform%ROWTYPE;
-    attr_value      TEXT;
-    new_attrs       HSTORE := ''::HSTORE;
-    attr_def        config.record_attr_definition%ROWTYPE;
-BEGIN
-
-    IF NEW.deleted IS TRUE THEN -- If this bib is deleted
-        DELETE FROM metabib.metarecord_source_map WHERE source = NEW.id; -- Rid ourselves of the search-estimate-killing linkage
-        DELETE FROM metabib.record_attr WHERE id = NEW.id; -- Kill the attrs hash, useless on deleted records
-        DELETE FROM authority.bib_linking WHERE bib = NEW.id; -- Avoid updating fields in bibs that are no longer visible
-        DELETE FROM biblio.peer_bib_copy_map WHERE peer_record = NEW.id; -- Separate any multi-homed items
-        DELETE FROM metabib.browse_entry_def_map WHERE source = NEW.id; -- Don't auto-suggest deleted bibs
-        RETURN NEW; -- and we're done
-    END IF;
-
-    IF TG_OP = 'UPDATE' THEN -- re-ingest?
-        PERFORM * FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc' AND enabled;
-
-        IF NOT FOUND AND OLD.marc = NEW.marc THEN -- don't do anything if the MARC didn't change
-            RETURN NEW;
-        END IF;
-    END IF;
-
-    -- Record authority linking
-    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_authority_linking' AND enabled;
-    IF NOT FOUND THEN
-        PERFORM biblio.map_authority_linking( NEW.id, NEW.marc );
-    END IF;
-
-    -- Flatten and insert the mfr data
-    PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_full_rec' AND enabled;
-    IF NOT FOUND THEN
-        PERFORM metabib.reingest_metabib_full_rec(NEW.id);
-
-        -- Now we pull out attribute data, which is dependent on the mfr for all but XPath-based fields
-        PERFORM * FROM config.internal_flag WHERE name = 'ingest.disable_metabib_rec_descriptor' AND enabled;
-        IF NOT FOUND THEN
-            FOR attr_def IN SELECT * FROM config.record_attr_definition ORDER BY format LOOP
-
-                IF attr_def.tag IS NOT NULL THEN -- tag (and optional subfield list) selection
-                    SELECT  ARRAY_TO_STRING(ARRAY_ACCUM(value), COALESCE(attr_def.joiner,' ')) INTO attr_value
-                      FROM  (SELECT * FROM metabib.full_rec ORDER BY tag, subfield) AS x
-                      WHERE record = NEW.id
-                            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
-                      LIMIT 1;
-
-                ELSIF attr_def.fixed_field IS NOT NULL THEN -- a named fixed field, see config.marc21_ff_pos_map.fixed_field
-                    attr_value := biblio.marc21_extract_fixed_field(NEW.id, attr_def.fixed_field);
+                ELSIF attr_def.fixed_field IS NOT NULL THEN -- a named fixed field, see config.marc21_ff_pos_map.fixed_field
+                    attr_value := biblio.marc21_extract_fixed_field(NEW.id, attr_def.fixed_field);
 
                 ELSIF attr_def.xpath IS NOT NULL THEN -- and xpath expression
 
@@ -12726,3412 +9483,6661 @@ INSERT INTO vandelay.merge_profile (owner, name, replace_spec)
 INSERT INTO vandelay.merge_profile (owner, name, preserve_spec) 
     VALUES (1, 'Full Overlay', '901c');
 
-SELECT evergreen.upgrade_deps_block_check('0679', :eg_version);
+-- Evergreen DB patch 0681.schema.user-activity.sql
+--
 
--- Address typo in column name
-ALTER TABLE config.metabib_class ADD COLUMN buoyant BOOL DEFAULT FALSE NOT NULL;
-UPDATE config.metabib_class SET buoyant = bouyant;
-ALTER TABLE config.metabib_class DROP COLUMN bouyant;
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0681', :eg_version);
 
-CREATE OR REPLACE FUNCTION oils_tsearch2 () RETURNS TRIGGER AS $$
+-- SCHEMA --
+
+CREATE TYPE config.usr_activity_group AS ENUM ('authen','authz','circ','hold','search');
+
+CREATE TABLE config.usr_activity_type (
+    id          SERIAL                      PRIMARY KEY, 
+    ewho        TEXT,
+    ewhat       TEXT,
+    ehow        TEXT,
+    label       TEXT                        NOT NULL, -- i18n
+    egroup      config.usr_activity_group   NOT NULL,
+    enabled     BOOL                        NOT NULL DEFAULT TRUE,
+    transient   BOOL                        NOT NULL DEFAULT FALSE,
+    CONSTRAINT  one_of_wwh CHECK (COALESCE(ewho,ewhat,ehow) IS NOT NULL)
+);
+
+CREATE UNIQUE INDEX unique_wwh ON config.usr_activity_type 
+    (COALESCE(ewho,''), COALESCE (ewhat,''), COALESCE(ehow,''));
+
+CREATE TABLE actor.usr_activity (
+    id          BIGSERIAL   PRIMARY KEY,
+    usr         INT         REFERENCES actor.usr (id) ON DELETE SET NULL,
+    etype       INT         NOT NULL REFERENCES config.usr_activity_type (id),
+    event_time  TIMESTAMPTZ NOT NULL DEFAULT NOW()
+);
+
+-- remove transient activity entries on insert of new entries
+CREATE OR REPLACE FUNCTION actor.usr_activity_transient_trg () RETURNS TRIGGER AS $$
+BEGIN
+    DELETE FROM actor.usr_activity act USING config.usr_activity_type atype
+        WHERE atype.transient AND 
+            NEW.etype = atype.id AND
+            act.etype = atype.id AND
+            act.usr = NEW.usr;
+    RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER remove_transient_usr_activity
+    BEFORE INSERT ON actor.usr_activity
+    FOR EACH ROW EXECUTE PROCEDURE actor.usr_activity_transient_trg();
+
+-- given a set of activity criteria, find the most approprate activity type
+CREATE OR REPLACE FUNCTION actor.usr_activity_get_type (
+        ewho TEXT, 
+        ewhat TEXT, 
+        ehow TEXT
+    ) RETURNS SETOF config.usr_activity_type AS $$
+SELECT * FROM config.usr_activity_type 
+    WHERE 
+        enabled AND 
+        (ewho  IS NULL OR ewho  = $1) AND
+        (ewhat IS NULL OR ewhat = $2) AND
+        (ehow  IS NULL OR ehow  = $3) 
+    ORDER BY 
+        -- BOOL comparisons sort false to true
+        COALESCE(ewho, '')  != COALESCE($1, ''),
+        COALESCE(ewhat,'')  != COALESCE($2, ''),
+        COALESCE(ehow, '')  != COALESCE($3, '') 
+    LIMIT 1;
+$$ LANGUAGE SQL;
+
+-- given a set of activity criteria, finds the best
+-- activity type and inserts the activity entry
+CREATE OR REPLACE FUNCTION actor.insert_usr_activity (
+        usr INT,
+        ewho TEXT, 
+        ewhat TEXT, 
+        ehow TEXT
+    ) RETURNS SETOF actor.usr_activity AS $$
 DECLARE
-    normalizer      RECORD;
-    value           TEXT := '';
+    new_row actor.usr_activity%ROWTYPE;
 BEGIN
+    SELECT id INTO new_row.etype FROM actor.usr_activity_get_type(ewho, ewhat, ehow);
+    IF FOUND THEN
+        new_row.usr := usr;
+        INSERT INTO actor.usr_activity (usr, etype) 
+            VALUES (usr, new_row.etype)
+            RETURNING * INTO new_row;
+        RETURN NEXT new_row;
+    END IF;
+END;
+$$ LANGUAGE plpgsql;
+
+-- SEED DATA --
+
+INSERT INTO config.usr_activity_type (id, ewho, ewhat, ehow, egroup, label) VALUES
+
+     -- authen/authz actions
+     -- note: "opensrf" is the default ingress/ehow
+     (1,  NULL, 'login',  'opensrf',      'authen', oils_i18n_gettext(1 , 'Login via opensrf', 'cuat', 'label'))
+    ,(2,  NULL, 'login',  'srfsh',        'authen', oils_i18n_gettext(2 , 'Login via srfsh', 'cuat', 'label'))
+    ,(3,  NULL, 'login',  'gateway-v1',   'authen', oils_i18n_gettext(3 , 'Login via gateway-v1', 'cuat', 'label'))
+    ,(4,  NULL, 'login',  'translator-v1','authen', oils_i18n_gettext(4 , 'Login via translator-v1', 'cuat', 'label'))
+    ,(5,  NULL, 'login',  'xmlrpc',       'authen', oils_i18n_gettext(5 , 'Login via xmlrpc', 'cuat', 'label'))
+    ,(6,  NULL, 'login',  'remoteauth',   'authen', oils_i18n_gettext(6 , 'Login via remoteauth', 'cuat', 'label'))
+    ,(7,  NULL, 'login',  'sip2',         'authen', oils_i18n_gettext(7 , 'SIP2 Proxy Login', 'cuat', 'label'))
+    ,(8,  NULL, 'login',  'apache',       'authen', oils_i18n_gettext(8 , 'Login via Apache module', 'cuat', 'label'))
+
+    ,(9,  NULL, 'verify', 'opensrf',      'authz',  oils_i18n_gettext(9 , 'Verification via opensrf', 'cuat', 'label'))
+    ,(10, NULL, 'verify', 'srfsh',        'authz',  oils_i18n_gettext(10, 'Verification via srfsh', 'cuat', 'label'))
+    ,(11, NULL, 'verify', 'gateway-v1',   'authz',  oils_i18n_gettext(11, 'Verification via gateway-v1', 'cuat', 'label'))
+    ,(12, NULL, 'verify', 'translator-v1','authz',  oils_i18n_gettext(12, 'Verification via translator-v1', 'cuat', 'label'))
+    ,(13, NULL, 'verify', 'xmlrpc',       'authz',  oils_i18n_gettext(13, 'Verification via xmlrpc', 'cuat', 'label'))
+    ,(14, NULL, 'verify', 'remoteauth',   'authz',  oils_i18n_gettext(14, 'Verification via remoteauth', 'cuat', 'label'))
+    ,(15, NULL, 'verify', 'sip2',         'authz',  oils_i18n_gettext(15, 'SIP2 User Verification', 'cuat', 'label'))
+
+     -- authen/authz actions w/ known uses of "who"
+    ,(16, 'opac',        'login',  'gateway-v1',   'authen', oils_i18n_gettext(16, 'OPAC Login (jspac)', 'cuat', 'label'))
+    ,(17, 'opac',        'login',  'apache',       'authen', oils_i18n_gettext(17, 'OPAC Login (tpac)', 'cuat', 'label'))
+    ,(18, 'staffclient', 'login',  'gateway-v1',   'authen', oils_i18n_gettext(18, 'Staff Client Login', 'cuat', 'label'))
+    ,(19, 'selfcheck',   'login',  'translator-v1','authen', oils_i18n_gettext(19, 'Self-Check Proxy Login', 'cuat', 'label'))
+    ,(20, 'ums',         'login',  'xmlrpc',       'authen', oils_i18n_gettext(20, 'Unique Mgt Login', 'cuat', 'label'))
+    ,(21, 'authproxy',   'login',  'apache',       'authen', oils_i18n_gettext(21, 'Apache Auth Proxy Login', 'cuat', 'label'))
+    ,(22, 'libraryelf',  'login',  'xmlrpc',       'authz',  oils_i18n_gettext(22, 'LibraryElf Login', 'cuat', 'label'))
+
+    ,(23, 'selfcheck',   'verify', 'translator-v1','authz',  oils_i18n_gettext(23, 'Self-Check User Verification', 'cuat', 'label'))
+    ,(24, 'ezproxy',     'verify', 'remoteauth',   'authz',  oils_i18n_gettext(24, 'EZProxy Verification', 'cuat', 'label'))
+    -- ...
+    ;
+
+-- reserve the first 1000 slots
+SELECT SETVAL('config.usr_activity_type_id_seq'::TEXT, 1000);
+
+INSERT INTO config.org_unit_setting_type 
+    (name, label, description, grp, datatype) 
+    VALUES (
+        'circ.patron.usr_activity_retrieve.max',
+         oils_i18n_gettext(
+            'circ.patron.usr_activity_retrieve.max',
+            'Max user activity entries to retrieve (staff client)',
+            'coust', 
+            'label'
+        ),
+        oils_i18n_gettext(
+            'circ.patron.usr_activity_retrieve.max',
+            'Sets the maxinum number of recent user activity entries to retrieve for display in the staff client.  0 means show none, -1 means show all.  Default is 1.',
+            'coust', 
+            'description'
+        ),
+        'gui',
+        'integer'
+    );
+
+
+SELECT evergreen.upgrade_deps_block_check('0682', :eg_version);
+
+CREATE TABLE asset.copy_location_group (
+    id              SERIAL  PRIMARY KEY,
+    name            TEXT    NOT NULL, -- i18n
+    owner           INT     NOT NULL REFERENCES actor.org_unit (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    pos             INT     NOT NULL DEFAULT 0,
+    top             BOOL    NOT NULL DEFAULT FALSE,
+    opac_visible    BOOL    NOT NULL DEFAULT TRUE,
+    CONSTRAINT lgroup_once_per_owner UNIQUE (owner,name)
+);
+
+CREATE TABLE asset.copy_location_group_map (
+    id       SERIAL PRIMARY KEY,
+    location    INT     NOT NULL REFERENCES asset.copy_location (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    lgroup      INT     NOT NULL REFERENCES asset.copy_location_group (id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+    CONSTRAINT  lgroup_once_per_group UNIQUE (lgroup,location)
+);
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0683', :eg_version);
+
+INSERT INTO action_trigger.event_params (event_def, param, value)
+    VALUES (5, 'check_email_notify', 1);
+INSERT INTO action_trigger.event_params (event_def, param, value)
+    VALUES (7, 'check_email_notify', 1);
+INSERT INTO action_trigger.event_params (event_def, param, value)
+    VALUES (9, 'check_email_notify', 1);
+INSERT INTO action_trigger.validator (module,description) VALUES
+    ('HoldNotifyCheck',
+    oils_i18n_gettext(
+        'HoldNotifyCheck',
+        'Check Hold notification flag(s)',
+        'atval',
+        'description'
+    ));
+UPDATE action_trigger.event_definition SET validator = 'HoldNotifyCheck' WHERE id = 9;
+
+-- NOT COVERED: Adding check_sms_notify to the proper trigger. It doesn't have a static id.
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0684', :eg_version);
+
+-- schema --
+
+-- Replace the constraints with more flexible ENUM's
+ALTER TABLE vandelay.queue DROP CONSTRAINT queue_queue_type_check;
+ALTER TABLE vandelay.bib_queue DROP CONSTRAINT bib_queue_queue_type_check;
+ALTER TABLE vandelay.authority_queue DROP CONSTRAINT authority_queue_queue_type_check;
 
-    value := NEW.value;
+CREATE TYPE vandelay.bib_queue_queue_type AS ENUM ('bib', 'acq');
+CREATE TYPE vandelay.authority_queue_queue_type AS ENUM ('authority');
 
-    IF TG_TABLE_NAME::TEXT ~ 'field_entry$' THEN
-        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.metabib_field_index_norm_map m ON (m.norm = n.id)
-              WHERE field = NEW.field AND m.pos < 0
-              ORDER BY m.pos LOOP
-                EXECUTE 'SELECT ' || normalizer.func || '(' ||
-                    quote_literal( value ) ||
-                    CASE
-                        WHEN normalizer.param_count > 0
-                            THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
-                            ELSE ''
-                        END ||
-                    ')' INTO value;
+-- dropped column is also implemented by the child tables
+ALTER TABLE vandelay.queue DROP COLUMN queue_type; 
 
-        END LOOP;
+-- to recover after using the undo sql from below
+-- alter table vandelay.bib_queue  add column queue_type text default 'bib' not null;
+-- alter table vandelay.authority_queue  add column queue_type text default 'authority' not null;
 
-        NEW.value := value;
-    END IF;
+-- modify the child tables to use the ENUMs
+ALTER TABLE vandelay.bib_queue 
+    ALTER COLUMN queue_type DROP DEFAULT,
+    ALTER COLUMN queue_type TYPE vandelay.bib_queue_queue_type 
+        USING (queue_type::vandelay.bib_queue_queue_type),
+    ALTER COLUMN queue_type SET DEFAULT 'bib';
 
-    IF NEW.index_vector = ''::tsvector THEN
-        RETURN NEW;
-    END IF;
+ALTER TABLE vandelay.authority_queue 
+    ALTER COLUMN queue_type DROP DEFAULT,
+    ALTER COLUMN queue_type TYPE vandelay.authority_queue_queue_type 
+        USING (queue_type::vandelay.authority_queue_queue_type),
+    ALTER COLUMN queue_type SET DEFAULT 'authority';
 
-    IF TG_TABLE_NAME::TEXT ~ 'field_entry$' THEN
-        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.metabib_field_index_norm_map m ON (m.norm = n.id)
-              WHERE field = NEW.field AND m.pos >= 0
-              ORDER BY m.pos LOOP
-                EXECUTE 'SELECT ' || normalizer.func || '(' ||
-                    quote_literal( value ) ||
-                    CASE
-                        WHEN normalizer.param_count > 0
-                            THEN ',' || REPLACE(REPLACE(BTRIM(normalizer.params,'[]'),E'\'',E'\\\''),E'"',E'\'')
-                            ELSE ''
-                        END ||
-                    ')' INTO value;
+-- give lineitems a pointer to their vandelay queued_record
 
-        END LOOP;
-    END IF;
+ALTER TABLE acq.lineitem ADD COLUMN queued_record BIGINT
+    REFERENCES vandelay.queued_bib_record (id) 
+    ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
 
-    IF TG_TABLE_NAME::TEXT ~ 'browse_entry$' THEN
-        value :=  ARRAY_TO_STRING(
-            evergreen.regexp_split_to_array(value, E'\\W+'), ' '
-        );
-        value := public.search_normalize(value);
-    END IF;
+ALTER TABLE acq.acq_lineitem_history ADD COLUMN queued_record BIGINT
+    REFERENCES vandelay.queued_bib_record (id) 
+    ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
 
-    NEW.index_vector = to_tsvector((TG_ARGV[0])::regconfig, value);
+-- seed data --
 
-    RETURN NEW;
-END;
-$$ LANGUAGE PLPGSQL;
+INSERT INTO permission.perm_list ( id, code, description ) 
+    VALUES ( 
+        521, 
+        'IMPORT_ACQ_LINEITEM_BIB_RECORD_UPLOAD', 
+        oils_i18n_gettext( 
+            521,
+            'Allows a user to create new bibs directly from an ACQ MARC file upload', 
+            'ppl', 
+            'description' 
+        )
+    );
 
--- Given a string such as a user might type into a search box, prepare
--- two changed variants for TO_TSQUERY(). See
--- http://www.postgresql.org/docs/9.0/static/textsearch-controls.html
--- The first variant is normalized to match indexed documents regardless
--- of diacritics.  The second variant keeps its diacritics for proper
--- highlighting via TS_HEADLINE().
-CREATE OR REPLACE
-    FUNCTION metabib.autosuggest_prepare_tsquery(orig TEXT) RETURNS TEXT[] AS
-$$
-DECLARE
-    orig_ended_in_space     BOOLEAN;
-    result                  RECORD;
-    plain                   TEXT;
-    normalized              TEXT;
-BEGIN
-    orig_ended_in_space := orig ~ E'\\s$';
 
-    orig := ARRAY_TO_STRING(
-        evergreen.regexp_split_to_array(orig, E'\\W+'), ' '
+INSERT INTO vandelay.import_error ( code, description ) 
+    VALUES ( 
+        'import.record.perm_failure', 
+        oils_i18n_gettext(
+            'import.record.perm_failure', 
+            'Perm failure creating a record', 'vie', 'description') 
     );
 
-    normalized := public.search_normalize(orig); -- also trim()s
-    plain := trim(orig);
 
-    IF NOT orig_ended_in_space THEN
-        plain := plain || ':*';
-        normalized := normalized || ':*';
-    END IF;
 
-    plain := ARRAY_TO_STRING(
-        evergreen.regexp_split_to_array(plain, E'\\s+'), ' & '
-    );
-    normalized := ARRAY_TO_STRING(
-        evergreen.regexp_split_to_array(normalized, E'\\s+'), ' & '
-    );
 
-    RETURN ARRAY[normalized, plain];
-END;
-$$ LANGUAGE PLPGSQL;
+-- Evergreen DB patch 0685.data.bluray_vr_format.sql
+--
+-- FIXME: insert description of change, if needed
+--
 
 
--- Definition of OUT parameters changes, so must drop first
-DROP FUNCTION IF EXISTS metabib.suggest_browse_entries (TEXT, TEXT, TEXT, INTEGER, INTEGER, INTEGER);
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0685', :eg_version);
 
-CREATE OR REPLACE
-    FUNCTION metabib.suggest_browse_entries(
-        raw_query_text  TEXT,   -- actually typed by humans at the UI level
-        search_class    TEXT,   -- 'alias' or 'class' or 'class|field..', etc
-        headline_opts   TEXT,   -- markup options for ts_headline()
-        visibility_org  INTEGER,-- null if you don't want opac visibility test
-        query_limit     INTEGER,-- use in LIMIT clause of interal query
-        normalization   INTEGER -- argument to TS_RANK_CD()
-    ) RETURNS TABLE (
-        value                   TEXT,   -- plain
-        field                   INTEGER,
-        buoyant_and_class_match BOOL,
-        field_match             BOOL,
-        field_weight            INTEGER,
-        rank                    REAL,
-        buoyant                 BOOL,
-        match                   TEXT    -- marked up
-    ) AS $func$
+-- FIXME: add/check SQL statements to perform the upgrade
+DO $FUNC$
 DECLARE
-    prepared_query_texts    TEXT[];
-    query                   TSQUERY;
-    plain_query             TSQUERY;
-    opac_visibility_join    TEXT;
-    search_class_join       TEXT;
-    r_fields                RECORD;
+    same_marc BOOL;
 BEGIN
-    prepared_query_texts := metabib.autosuggest_prepare_tsquery(raw_query_text);
-
-    query := TO_TSQUERY('keyword', prepared_query_texts[1]);
-    plain_query := TO_TSQUERY('keyword', prepared_query_texts[2]);
+    -- Check if it is already there
+    PERFORM * FROM config.marc21_physical_characteristic_value_map v
+        JOIN config.marc21_physical_characteristic_subfield_map s ON v.ptype_subfield = s.id
+        WHERE s.ptype_key = 'v' AND s.subfield = 'e' AND s.start_pos = '4' AND s.length = '1'
+            AND v.value = 's';
 
-    IF visibility_org IS NOT NULL THEN
-        opac_visibility_join := '
-    JOIN asset.opac_visible_copies aovc ON (
-        aovc.record = mbedm.source AND
-        aovc.circ_lib IN (SELECT id FROM actor.org_unit_descendants($4))
-    )';
-    ELSE
-        opac_visibility_join := '';
+    -- If it is, bail.
+    IF FOUND THEN
+        RETURN;
     END IF;
 
-    -- The following determines whether we only provide suggestsons matching
-    -- the user's selected search_class, or whether we show other suggestions
-    -- too. The reason for MIN() is that for search_classes like
-    -- 'title|proper|uniform' you would otherwise get multiple rows.  The
-    -- implication is that if title as a class doesn't have restrict,
-    -- nor does the proper field, but the uniform field does, you're going
-    -- to get 'false' for your overall evaluation of 'should we restrict?'
-    -- To invert that, change from MIN() to MAX().
+    -- Otherwise, insert it
+    INSERT INTO config.marc21_physical_characteristic_value_map (value,ptype_subfield,label)
+    SELECT 's',id,'Blu-ray'
+        FROM config.marc21_physical_characteristic_subfield_map
+        WHERE ptype_key = 'v' AND subfield = 'e' AND start_pos = '4' AND length = '1';
 
-    SELECT
-        INTO r_fields
-            MIN(cmc.restrict::INT) AS restrict_class,
-            MIN(cmf.restrict::INT) AS restrict_field
-        FROM metabib.search_class_to_registered_components(search_class)
-            AS _registered (field_class TEXT, field INT)
-        JOIN
-            config.metabib_class cmc ON (cmc.name = _registered.field_class)
-        LEFT JOIN
-            config.metabib_field cmf ON (cmf.id = _registered.field);
+    -- And reingest the blue-ray items so that things see the new value
+    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 marc=marc WHERE id IN (SELECT record
+        FROM
+            metabib.full_rec a JOIN metabib.full_rec b USING (record)
+        WHERE
+            a.tag = 'LDR' AND a.value LIKE '______g%'
+        AND b.tag = '007' AND b.value LIKE 'v___s%');
+    UPDATE config.internal_flag SET enabled = same_marc WHERE name = 'ingest.reingest.force_on_same_marc';
+END;
+$FUNC$;
 
-    -- evaluate 'should we restrict?'
-    IF r_fields.restrict_field::BOOL OR r_fields.restrict_class::BOOL THEN
-        search_class_join := '
-    JOIN
-        metabib.search_class_to_registered_components($2)
-        AS _registered (field_class TEXT, field INT) ON (
-            (_registered.field IS NULL AND
-                _registered.field_class = cmf.field_class) OR
-            (_registered.field = cmf.id)
-        )
-    ';
-    ELSE
-        search_class_join := '
-    LEFT JOIN
-        metabib.search_class_to_registered_components($2)
-        AS _registered (field_class TEXT, field INT) ON (
-            _registered.field_class = cmc.name
-        )
-    ';
-    END IF;
 
-    RETURN QUERY EXECUTE 'SELECT *, TS_HEADLINE(value, $7, $3) FROM (SELECT DISTINCT
-        mbe.value,
-        cmf.id,
-        cmc.buoyant AND _registered.field_class IS NOT NULL,
-        _registered.field = cmf.id,
-        cmf.weight,
-        TS_RANK_CD(mbe.index_vector, $1, $6),
-        cmc.buoyant
-    FROM metabib.browse_entry_def_map mbedm
-    JOIN metabib.browse_entry mbe ON (mbe.id = mbedm.entry)
-    JOIN config.metabib_field cmf ON (cmf.id = mbedm.def)
-    JOIN config.metabib_class cmc ON (cmf.field_class = cmc.name)
-    '  || search_class_join || opac_visibility_join ||
-    ' WHERE $1 @@ mbe.index_vector
-    ORDER BY 3 DESC, 4 DESC NULLS LAST, 5 DESC, 6 DESC, 7 DESC, 1 ASC
-    LIMIT $5) x
-    ORDER BY 3 DESC, 4 DESC NULLS LAST, 5 DESC, 6 DESC, 7 DESC, 1 ASC
-    '   -- sic, repeat the order by clause in the outer select too
-    USING
-        query, search_class, headline_opts,
-        visibility_org, query_limit, normalization, plain_query
-        ;
+-- Evergreen DB patch 0686.schema.auditor_boost.sql
+--
+-- FIXME: insert description of change, if needed
+--
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0686', :eg_version);
+
+-- FIXME: add/check SQL statements to perform the upgrade
+-- These three functions are for capturing, getting, and clearing user and workstation information
+
+-- Set the User AND workstation in one call. Tis faster. And less calls.
+-- First argument is user, second is workstation
+CREATE OR REPLACE FUNCTION auditor.set_audit_info(INT, INT) RETURNS VOID AS $$
+    $_SHARED{"eg_audit_user"} = $_[0];
+    $_SHARED{"eg_audit_ws"} = $_[1];
+$$ LANGUAGE plperl;
+
+-- Get the User AND workstation in one call. Less calls, useful for joins ;)
+CREATE OR REPLACE FUNCTION auditor.get_audit_info() RETURNS TABLE (eg_user INT, eg_ws INT) AS $$
+    return [{eg_user => $_SHARED{"eg_audit_user"}, eg_ws => $_SHARED{"eg_audit_ws"}}];
+$$ LANGUAGE plperl;
 
-    -- sort order:
-    --  buoyant AND chosen class = match class
-    --  chosen field = match field
-    --  field weight
-    --  rank
-    --  buoyancy
-    --  value itself
+-- Clear the audit info, for whatever reason
+CREATE OR REPLACE FUNCTION auditor.clear_audit_info() RETURNS VOID AS $$
+    delete($_SHARED{"eg_audit_user"});
+    delete($_SHARED{"eg_audit_ws"});
+$$ LANGUAGE plperl;
 
+CREATE OR REPLACE FUNCTION auditor.create_auditor_history ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
+BEGIN
+    EXECUTE $$
+        CREATE TABLE auditor.$$ || sch || $$_$$ || tbl || $$_history (
+            audit_id   BIGINT                          PRIMARY KEY,
+            audit_time TIMESTAMP WITH TIME ZONE        NOT NULL,
+            audit_action       TEXT                            NOT NULL,
+            audit_user  INT,
+            audit_ws    INT,
+            LIKE $$ || sch || $$.$$ || tbl || $$
+        );
+    $$;
+       RETURN TRUE;
 END;
-$func$ LANGUAGE PLPGSQL;
+$creator$ LANGUAGE 'plpgsql';
+
+CREATE OR REPLACE FUNCTION auditor.create_auditor_func    ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
+DECLARE
+    column_list TEXT[];
+BEGIN
+    SELECT INTO column_list array_agg(a.attname)
+        FROM pg_catalog.pg_attribute a
+            JOIN pg_catalog.pg_class c ON a.attrelid = c.oid
+            JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+        WHERE relkind = 'r' AND n.nspname = sch AND c.relname = tbl AND a.attnum > 0 AND NOT a.attisdropped;
 
+    EXECUTE $$
+        CREATE OR REPLACE FUNCTION auditor.audit_$$ || sch || $$_$$ || tbl || $$_func ()
+        RETURNS TRIGGER AS $func$
+        BEGIN
+            INSERT INTO auditor.$$ || sch || $$_$$ || tbl || $$_history ( audit_id, audit_time, audit_action, audit_user, audit_ws, $$
+            || array_to_string(column_list, ', ') || $$ )
+                SELECT  nextval('auditor.$$ || sch || $$_$$ || tbl || $$_pkey_seq'),
+                    now(),
+                    SUBSTR(TG_OP,1,1),
+                    eg_user,
+                    eg_ws,
+                    OLD.$$ || array_to_string(column_list, ', OLD.') || $$
+                FROM auditor.get_audit_info();
+            RETURN NULL;
+        END;
+        $func$ LANGUAGE 'plpgsql';
+    $$;
+    RETURN TRUE;
+END;
+$creator$ LANGUAGE 'plpgsql';
 
-\qecho 
-\qecho The following takes about a minute per 100,000 rows in
-\qecho metabib.browse_entry on my development system, which is only a VM with
-\qecho 4 GB of memory and 2 cores.
-\qecho 
-\qecho The following is a very loose estimate of how long the next UPDATE
-\qecho statement would take to finish on MY machine, based on YOUR number
-\qecho of rows in metabib.browse_entry:
-\qecho 
+CREATE OR REPLACE FUNCTION auditor.create_auditor_lifecycle     ( sch TEXT, tbl TEXT ) RETURNS BOOL AS $creator$
+DECLARE
+    column_list TEXT[];
+BEGIN
+    SELECT INTO column_list array_agg(a.attname)
+        FROM pg_catalog.pg_attribute a
+            JOIN pg_catalog.pg_class c ON a.attrelid = c.oid
+            JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+        WHERE relkind = 'r' AND n.nspname = sch AND c.relname = tbl AND a.attnum > 0 AND NOT a.attisdropped;
 
-SELECT (COUNT(id) / 100000.0) * INTERVAL '1 minute'
-    AS "approximate duration of following UPDATE statement"
-    FROM metabib.browse_entry;
+    EXECUTE $$
+        CREATE VIEW auditor.$$ || sch || $$_$$ || tbl || $$_lifecycle AS
+            SELECT -1 AS audit_id,
+                   now() AS audit_time,
+                   '-' AS audit_action,
+                   -1 AS audit_user,
+                   -1 AS audit_ws,
+                   $$ || array_to_string(column_list, ', ') || $$
+              FROM $$ || sch || $$.$$ || tbl || $$
+                UNION ALL
+            SELECT audit_id, audit_time, audit_action, audit_user, audit_ws,
+            $$ || array_to_string(column_list, ', ') || $$
+              FROM auditor.$$ || sch || $$_$$ || tbl || $$_history;
+    $$;
+    RETURN TRUE;
+END;
+$creator$ LANGUAGE 'plpgsql';
+
+-- Corrects all column discrepencies between audit table and core table:
+-- Adds missing columns
+-- Removes leftover columns
+-- Updates types
+-- Also, ensures all core auditor columns exist.
+CREATE OR REPLACE FUNCTION auditor.fix_columns() RETURNS VOID AS $BODY$
+DECLARE
+    current_table TEXT = ''; -- Storage for post-loop main table name
+    current_audit_table TEXT = ''; -- Storage for post-loop audit table name
+    query TEXT = ''; -- Storage for built query
+    cr RECORD; -- column record object
+    alter_t BOOL = false; -- Has the alter table command been appended yet
+    auditor_cores TEXT[] = ARRAY[]::TEXT[]; -- Core auditor function list (filled inside of loop)
+    core_column TEXT; -- The current core column we are adding
+BEGIN
+    FOR cr IN
+        WITH audit_tables AS ( -- Basic grab of auditor tables. Anything in the auditor namespace, basically. With oids.
+            SELECT c.oid AS audit_oid, c.relname AS audit_table
+            FROM pg_catalog.pg_class c
+            JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+            WHERE relkind='r' AND nspname = 'auditor'
+        ),
+        table_set AS ( -- Union of auditor tables with their "main" tables. With oids.
+            SELECT a.audit_oid, a.audit_table, c.oid AS main_oid, n.nspname as main_namespace, c.relname as main_table
+            FROM pg_catalog.pg_class c
+            JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+            JOIN audit_tables a ON a.audit_table = n.nspname || '_' || c.relname || '_history'
+            WHERE relkind = 'r'
+        ),
+        column_lists AS ( -- All columns associated with the auditor or main table, grouped by the main table's oid.
+            SELECT DISTINCT ON (main_oid, attname) t.main_oid, a.attname
+            FROM table_set t
+            JOIN pg_catalog.pg_attribute a ON a.attrelid IN (t.main_oid, t.audit_oid)
+            WHERE attnum > 0 AND NOT attisdropped
+        ),
+        column_defs AS ( -- The motherload, every audit table and main table plus column names and defs.
+            SELECT audit_table,
+                   main_namespace,
+                   main_table,
+                   a.attname AS main_column, -- These two will be null for columns that have since been deleted, or for auditor core columns
+                   pg_catalog.format_type(a.atttypid, a.atttypmod) AS main_column_def,
+                   b.attname AS audit_column, -- These two will be null for columns that have since been added
+                   pg_catalog.format_type(b.atttypid, b.atttypmod) AS audit_column_def
+            FROM table_set t
+            JOIN column_lists c USING (main_oid)
+            LEFT JOIN pg_catalog.pg_attribute a ON a.attname = c.attname AND a.attrelid = t.main_oid AND a.attnum > 0 AND NOT a.attisdropped
+            LEFT JOIN pg_catalog.pg_attribute b ON b.attname = c.attname AND b.attrelid = t.audit_oid AND b.attnum > 0 AND NOT b.attisdropped
+        )
+        -- Nice sorted output from the above
+        SELECT * FROM column_defs WHERE main_column_def IS DISTINCT FROM audit_column_def ORDER BY main_namespace, main_table, main_column, audit_column
+    LOOP
+        IF current_table <> (cr.main_namespace || '.' || cr.main_table) THEN -- New table?
+            FOR core_column IN SELECT DISTINCT unnest(auditor_cores) LOOP -- Update missing core auditor columns
+                IF NOT alter_t THEN -- Add ALTER TABLE if we haven't already
+                    query:=query || $$ALTER TABLE auditor.$$ || current_audit_table;
+                    alter_t:=TRUE;
+                ELSE
+                    query:=query || $$,$$;
+                END IF;
+                -- Bit of a sneaky bit here. Create audit_id as a bigserial so it gets automatic values and doesn't complain about nulls when becoming a PRIMARY KEY.
+                query:=query || $$ ADD COLUMN $$ || CASE WHEN core_column = 'audit_id bigint' THEN $$audit_id bigserial PRIMARY KEY$$ ELSE core_column END;
+            END LOOP;
+            IF alter_t THEN -- Open alter table = needs a semicolon
+                query:=query || $$; $$;
+                alter_t:=FALSE;
+                IF 'audit_id bigint' = ANY(auditor_cores) THEN -- We added a primary key...
+                    -- Fun! Drop the default on audit_id, drop the auto-created sequence, create a new one, and set the current value
+                    -- For added fun, we have to execute in chunks due to the parser checking setval/currval arguments at parse time.
+                    EXECUTE query;
+                    EXECUTE $$ALTER TABLE auditor.$$ || current_audit_table || $$ ALTER COLUMN audit_id DROP DEFAULT; $$ ||
+                        $$CREATE SEQUENCE auditor.$$ || current_audit_table || $$_pkey_seq;$$;
+                    EXECUTE $$SELECT setval('auditor.$$ || current_audit_table || $$_pkey_seq', currval('auditor.$$ || current_audit_table || $$_audit_id_seq')); $$ ||
+                        $$DROP SEQUENCE auditor.$$ || current_audit_table || $$_audit_id_seq;$$;
+                    query:='';
+                END IF;
+            END IF;
+            -- New table means we reset the list of needed auditor core columns
+            auditor_cores = ARRAY['audit_id bigint', 'audit_time timestamp with time zone', 'audit_action text', 'audit_user integer', 'audit_ws integer'];
+            -- And store some values for use later, because we can't rely on cr in all places.
+            current_table:=cr.main_namespace || '.' || cr.main_table;
+            current_audit_table:=cr.audit_table;
+        END IF;
+        IF cr.main_column IS NULL AND cr.audit_column LIKE 'audit_%' THEN -- Core auditor column?
+            -- Remove core from list of cores
+            SELECT INTO auditor_cores array_agg(core) FROM unnest(auditor_cores) AS core WHERE core != (cr.audit_column || ' ' || cr.audit_column_def);
+        ELSIF cr.main_column IS NULL THEN -- Main column doesn't exist, and it isn't an auditor column. Needs dropping from the auditor.
+            IF NOT alter_t THEN
+                query:=query || $$ALTER TABLE auditor.$$ || current_audit_table;
+                alter_t:=TRUE;
+            ELSE
+                query:=query || $$,$$;
+            END IF;
+            query:=query || $$ DROP COLUMN $$ || cr.audit_column;
+        ELSIF cr.audit_column IS NULL AND cr.main_column IS NOT NULL THEN -- New column auditor doesn't have. Add it.
+            IF NOT alter_t THEN
+                query:=query || $$ALTER TABLE auditor.$$ || current_audit_table;
+                alter_t:=TRUE;
+            ELSE
+                query:=query || $$,$$;
+            END IF;
+            query:=query || $$ ADD COLUMN $$ || cr.main_column || $$ $$ || cr.main_column_def;
+        ELSIF cr.main_column IS NOT NULL AND cr.audit_column IS NOT NULL THEN -- Both sides have this column, but types differ. Fix that.
+            IF NOT alter_t THEN
+                query:=query || $$ALTER TABLE auditor.$$ || current_audit_table;
+                alter_t:=TRUE;
+            ELSE
+                query:=query || $$,$$;
+            END IF;
+            query:=query || $$ ALTER COLUMN $$ || cr.audit_column || $$ TYPE $$ || cr.main_column_def;
+        END IF;
+    END LOOP;
+    FOR core_column IN SELECT DISTINCT unnest(auditor_cores) LOOP -- Repeat this outside of the loop to catch the last table
+        IF NOT alter_t THEN
+            query:=query || $$ALTER TABLE auditor.$$ || current_audit_table;
+            alter_t:=TRUE;
+        ELSE
+            query:=query || $$,$$;
+        END IF;
+        -- Bit of a sneaky bit here. Create audit_id as a bigserial so it gets automatic values and doesn't complain about nulls when becoming a PRIMARY KEY.
+        query:=query || $$ ADD COLUMN $$ || CASE WHEN core_column = 'audit_id bigint' THEN $$audit_id bigserial PRIMARY KEY$$ ELSE core_column END;
+    END LOOP;
+    IF alter_t THEN -- Open alter table = needs a semicolon
+        query:=query || $$;$$;
+        IF 'audit_id bigint' = ANY(auditor_cores) THEN -- We added a primary key...
+            -- Fun! Drop the default on audit_id, drop the auto-created sequence, create a new one, and set the current value
+            -- For added fun, we have to execute in chunks due to the parser checking setval/currval arguments at parse time.
+            EXECUTE query;
+            EXECUTE $$ALTER TABLE auditor.$$ || current_audit_table || $$ ALTER COLUMN audit_id DROP DEFAULT; $$ ||
+                $$CREATE SEQUENCE auditor.$$ || current_audit_table || $$_pkey_seq;$$;
+            EXECUTE $$SELECT setval('auditor.$$ || current_audit_table || $$_pkey_seq', currval('auditor.$$ || current_audit_table || $$_audit_id_seq')); $$ ||
+                $$DROP SEQUENCE auditor.$$ || current_audit_table || $$_audit_id_seq;$$;
+            query:='';
+        END IF;
+    END IF;
+    EXECUTE query;
+END;
+$BODY$ LANGUAGE plpgsql;
 
-UPDATE metabib.browse_entry SET index_vector = TO_TSVECTOR(
-    'keyword',
-    public.search_normalize(
-        ARRAY_TO_STRING(
-            evergreen.regexp_split_to_array(value, E'\\W+'), ' '
+-- Update it all routine
+CREATE OR REPLACE FUNCTION auditor.update_auditors() RETURNS boolean AS $BODY$
+DECLARE
+    auditor_name TEXT;
+    table_schema TEXT;
+    table_name TEXT;
+BEGIN
+    -- Drop Lifecycle view(s) before potential column changes
+    FOR auditor_name IN
+        SELECT c.relname
+            FROM pg_catalog.pg_class c
+                JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+            WHERE relkind = 'v' AND n.nspname = 'auditor' LOOP
+        EXECUTE $$ DROP VIEW auditor.$$ || auditor_name || $$;$$;
+    END LOOP;
+    -- Fix all column discrepencies
+    PERFORM auditor.fix_columns();
+    -- Re-create trigger functions and lifecycle views
+    FOR table_schema, table_name IN
+        WITH audit_tables AS (
+            SELECT c.oid AS audit_oid, c.relname AS audit_table
+            FROM pg_catalog.pg_class c
+            JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+            WHERE relkind='r' AND nspname = 'auditor'
+        ),
+        table_set AS (
+            SELECT a.audit_oid, a.audit_table, c.oid AS main_oid, n.nspname as main_namespace, c.relname as main_table
+            FROM pg_catalog.pg_class c
+            JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+            JOIN audit_tables a ON a.audit_table = n.nspname || '_' || c.relname || '_history'
+            WHERE relkind = 'r'
         )
-    )
-);
-
-
-SELECT evergreen.upgrade_deps_block_check('0680', :eg_version);
-
--- Not much use in having identifier-class fields be suggestions. Credit for the idea goes to Ben Shum.
-UPDATE config.metabib_field SET browse_field = FALSE WHERE id < 100 AND field_class = 'identifier';
-
+        SELECT main_namespace, main_table FROM table_set LOOP
+        
+        PERFORM auditor.create_auditor_func(table_schema, table_name);
+        PERFORM auditor.create_auditor_lifecycle(table_schema, table_name);
+    END LOOP;
+    RETURN TRUE;
+END;
+$BODY$ LANGUAGE plpgsql;
 
----------------------------------------------------------------------------
--- The rest of this was tested on Evergreen Indiana's dev server, which has
--- a large data set  of 2.6M bibs, and was instrumental in sussing out the
--- needed adjustments.  Thanks, EG-IN!
----------------------------------------------------------------------------
+-- Go ahead and update them all now
+SELECT auditor.update_auditors();
 
--- GIN indexes are /much/ better for prefix matching, which is important for browse and autosuggest
---Commented out the creation earlier, so we don't need to drop it here.
---DROP INDEX metabib.metabib_browse_entry_index_vector_idx;
-CREATE INDEX metabib_browse_entry_index_vector_idx ON metabib.browse_entry USING GIN (index_vector);
 
+-- Evergreen DB patch 0687.schema.enhance_reingest.sql
+--
+-- FIXME: insert description of change, if needed
+--
 
--- We need thes to make the autosuggest limiting joins fast
-CREATE INDEX browse_entry_def_map_def_idx ON metabib.browse_entry_def_map (def);
-CREATE INDEX browse_entry_def_map_entry_idx ON metabib.browse_entry_def_map (entry);
-CREATE INDEX browse_entry_def_map_source_idx ON metabib.browse_entry_def_map (source);
 
--- In practice this will always be ~1 row, and the default of 1000 causes terrible plans
-ALTER FUNCTION metabib.search_class_to_registered_components(text) ROWS 1;
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0687', :eg_version);
 
--- Reworking of the generated query to act in a sane manner in the face of large datasets
-CREATE OR REPLACE
-    FUNCTION metabib.suggest_browse_entries(
-        raw_query_text  TEXT,   -- actually typed by humans at the UI level
-        search_class    TEXT,   -- 'alias' or 'class' or 'class|field..', etc
-        headline_opts   TEXT,   -- markup options for ts_headline()
-        visibility_org  INTEGER,-- null if you don't want opac visibility test
-        query_limit     INTEGER,-- use in LIMIT clause of interal query
-        normalization   INTEGER -- argument to TS_RANK_CD()
-    ) RETURNS TABLE (
-        value                   TEXT,   -- plain
-        field                   INTEGER,
-        buoyant_and_class_match BOOL,
-        field_match             BOOL,
-        field_weight            INTEGER,
-        rank                    REAL,
-        buoyant                 BOOL,
-        match                   TEXT    -- marked up
-    ) AS $func$
+-- FIXME: add/check SQL statements to perform the upgrade
+-- New function def
+CREATE OR REPLACE FUNCTION metabib.reingest_metabib_field_entries( bib_id BIGINT, skip_facet BOOL DEFAULT FALSE, skip_browse BOOL DEFAULT FALSE, skip_search BOOL DEFAULT FALSE ) RETURNS VOID AS $func$
 DECLARE
-    prepared_query_texts    TEXT[];
-    query                   TSQUERY;
-    plain_query             TSQUERY;
-    opac_visibility_join    TEXT;
-    search_class_join       TEXT;
-    r_fields                RECORD;
+    fclass          RECORD;
+    ind_data        metabib.field_entry_template%ROWTYPE;
+    mbe_row         metabib.browse_entry%ROWTYPE;
+    mbe_id          BIGINT;
 BEGIN
-    prepared_query_texts := metabib.autosuggest_prepare_tsquery(raw_query_text);
-
-    query := TO_TSQUERY('keyword', prepared_query_texts[1]);
-    plain_query := TO_TSQUERY('keyword', prepared_query_texts[2]);
-
-    IF visibility_org IS NOT NULL THEN
-        opac_visibility_join := '
-    JOIN asset.opac_visible_copies aovc ON (
-        aovc.record = x.source AND
-        aovc.circ_lib IN (SELECT id FROM actor.org_unit_descendants($4))
-    )';
-    ELSE
-        opac_visibility_join := '';
+    PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled;
+    IF NOT FOUND THEN
+        IF NOT skip_search THEN
+            FOR fclass IN SELECT * FROM config.metabib_class LOOP
+                -- RAISE NOTICE 'Emptying out %', fclass.name;
+                EXECUTE $$DELETE FROM metabib.$$ || fclass.name || $$_field_entry WHERE source = $$ || bib_id;
+            END LOOP;
+        END IF;
+        IF NOT skip_facet THEN
+            DELETE FROM metabib.facet_entry WHERE source = bib_id;
+        END IF;
+        IF NOT skip_browse THEN
+            DELETE FROM metabib.browse_entry_def_map WHERE source = bib_id;
+        END IF;
     END IF;
 
-    -- The following determines whether we only provide suggestsons matching
-    -- the user's selected search_class, or whether we show other suggestions
-    -- too. The reason for MIN() is that for search_classes like
-    -- 'title|proper|uniform' you would otherwise get multiple rows.  The
-    -- implication is that if title as a class doesn't have restrict,
-    -- nor does the proper field, but the uniform field does, you're going
-    -- to get 'false' for your overall evaluation of 'should we restrict?'
-    -- To invert that, change from MIN() to MAX().
-
-    SELECT
-        INTO r_fields
-            MIN(cmc.restrict::INT) AS restrict_class,
-            MIN(cmf.restrict::INT) AS restrict_field
-        FROM metabib.search_class_to_registered_components(search_class)
-            AS _registered (field_class TEXT, field INT)
-        JOIN
-            config.metabib_class cmc ON (cmc.name = _registered.field_class)
-        LEFT JOIN
-            config.metabib_field cmf ON (cmf.id = _registered.field);
-
-    -- evaluate 'should we restrict?'
-    IF r_fields.restrict_field::BOOL OR r_fields.restrict_class::BOOL THEN
-        search_class_join := '
-    JOIN
-        metabib.search_class_to_registered_components($2)
-        AS _registered (field_class TEXT, field INT) ON (
-            (_registered.field IS NULL AND
-                _registered.field_class = cmf.field_class) OR
-            (_registered.field = cmf.id)
-        )
-    ';
-    ELSE
-        search_class_join := '
-    LEFT JOIN
-        metabib.search_class_to_registered_components($2)
-        AS _registered (field_class TEXT, field INT) ON (
-            _registered.field_class = cmc.name
-        )
-    ';
-    END IF;
+    FOR ind_data IN SELECT * FROM biblio.extract_metabib_field_entry( bib_id ) LOOP
+        IF ind_data.field < 0 THEN
+            ind_data.field = -1 * ind_data.field;
+        END IF;
 
-    RETURN QUERY EXECUTE '
-SELECT  DISTINCT
-        x.value,
-        x.id,
-        x.push,
-        x.restrict,
-        x.weight,
-        x.ts_rank_cd,
-        x.buoyant,
-        TS_HEADLINE(value, $7, $3)
-  FROM  (SELECT DISTINCT
-                mbe.value,
-                cmf.id,
-                cmc.buoyant AND _registered.field_class IS NOT NULL AS push,
-                _registered.field = cmf.id AS restrict,
-                cmf.weight,
-                TS_RANK_CD(mbe.index_vector, $1, $6),
-                cmc.buoyant,
-                mbedm.source
-          FROM  metabib.browse_entry_def_map mbedm
+        IF ind_data.facet_field AND NOT skip_facet THEN
+            INSERT INTO metabib.facet_entry (field, source, value)
+                VALUES (ind_data.field, ind_data.source, ind_data.value);
+        END IF;
 
-                -- Start with a pre-limited set of 10k possible suggestions. More than that is not going to be useful anyway
-                JOIN (SELECT * FROM metabib.browse_entry WHERE index_vector @@ $1 LIMIT 10000) mbe ON (mbe.id = mbedm.entry)
+        IF ind_data.browse_field AND NOT skip_browse THEN
+            -- A caveat about this SELECT: this should take care of replacing
+            -- old mbe rows when data changes, but not if normalization (by
+            -- which I mean specifically the output of
+            -- evergreen.oils_tsearch2()) changes.  It may or may not be
+            -- expensive to add a comparison of index_vector to index_vector
+            -- to the WHERE clause below.
+            SELECT INTO mbe_row * FROM metabib.browse_entry WHERE value = ind_data.value;
+            IF FOUND THEN
+                mbe_id := mbe_row.id;
+            ELSE
+                INSERT INTO metabib.browse_entry (value) VALUES
+                    (metabib.browse_normalize(ind_data.value, ind_data.field));
+                mbe_id := CURRVAL('metabib.browse_entry_id_seq'::REGCLASS);
+            END IF;
 
-                JOIN config.metabib_field cmf ON (cmf.id = mbedm.def)
-                JOIN config.metabib_class cmc ON (cmf.field_class = cmc.name)
-                '  || search_class_join || '
-          ORDER BY 3 DESC, 4 DESC NULLS LAST, 5 DESC, 6 DESC, 7 DESC, 1 ASC
-          LIMIT 1000) AS x -- This outer limit makes testing for opac visibility usably fast
-        ' || opac_visibility_join || '
-  ORDER BY 3 DESC, 4 DESC NULLS LAST, 5 DESC, 6 DESC, 7 DESC, 1 ASC
-  LIMIT $5
-'   -- sic, repeat the order by clause in the outer select too
-    USING
-        query, search_class, headline_opts,
-        visibility_org, query_limit, normalization, plain_query
-        ;
+            INSERT INTO metabib.browse_entry_def_map (entry, def, source)
+                VALUES (mbe_id, ind_data.field, ind_data.source);
+        END IF;
 
-    -- sort order:
-    --  buoyant AND chosen class = match class
-    --  chosen field = match field
-    --  field weight
-    --  rank
-    --  buoyancy
-    --  value itself
+        IF ind_data.search_field AND NOT skip_search THEN
+            EXECUTE $$
+                INSERT INTO metabib.$$ || ind_data.field_class || $$_field_entry (field, source, value)
+                    VALUES ($$ ||
+                        quote_literal(ind_data.field) || $$, $$ ||
+                        quote_literal(ind_data.source) || $$, $$ ||
+                        quote_literal(ind_data.value) ||
+                    $$);$$;
+        END IF;
+
+    END LOOP;
 
+    RETURN;
 END;
 $func$ LANGUAGE PLPGSQL;
 
+-- Delete old one
+DROP FUNCTION IF EXISTS metabib.reingest_metabib_field_entries(BIGINT);
 
--- Evergreen DB patch 0681.schema.user-activity.sql
+-- Evergreen DB patch 0688.data.circ_history_export_csv.sql
+--
+-- FIXME: insert description of change, if needed
 --
 
 -- check whether patch can be applied
-SELECT evergreen.upgrade_deps_block_check('0681', :eg_version);
+SELECT evergreen.upgrade_deps_block_check('0688', :eg_version);
 
--- SCHEMA --
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+VALUES (
+    'circ.format.history.csv',
+    'circ',
+    oils_i18n_gettext(
+        'circ.format.history.csv',
+        'Produce CSV of circulation history',
+        'ath',
+        'description'
+    ),
+    FALSE
+);
 
-CREATE TYPE config.usr_activity_group AS ENUM ('authen','authz','circ','hold','search');
+INSERT INTO action_trigger.event_definition (
+    active, owner, name, hook, reactor, validator, group_field, template) 
+VALUES (
+    TRUE, 1, 'Circ History CSV', 'circ.format.history.csv', 'ProcessTemplate', 'NOOP_True', 'usr',
+$$
+Title,Author,Call Number,Barcode,Format
+[%-
+FOR circ IN target;
+    bibxml = helpers.unapi_bre(circ.target_copy.call_number.record, {flesh => '{mra}'});
+    title = "";
+    FOR part IN bibxml.findnodes('//*[@tag="245"]/*[@code="a" or @code="b"]');
+        title = title _ part.textContent;
+    END;
+    author = bibxml.findnodes('//*[@tag="100"]/*[@code="a"]').textContent;
+    item_type = bibxml.findnodes('//*[local-name()="attributes"]/*[local-name()="field"][@name="item_type"]').getAttribute('coded-value') %]
 
-CREATE TABLE config.usr_activity_type (
-    id          SERIAL                      PRIMARY KEY, 
-    ewho        TEXT,
-    ewhat       TEXT,
-    ehow        TEXT,
-    label       TEXT                        NOT NULL, -- i18n
-    egroup      config.usr_activity_group   NOT NULL,
-    enabled     BOOL                        NOT NULL DEFAULT TRUE,
-    transient   BOOL                        NOT NULL DEFAULT FALSE,
-    CONSTRAINT  one_of_wwh CHECK (COALESCE(ewho,ewhat,ehow) IS NOT NULL)
+    [%- helpers.csv_datum(title) -%],
+    [%- helpers.csv_datum(author) -%],
+    [%- helpers.csv_datum(circ.target_copy.call_number.label) -%],
+    [%- helpers.csv_datum(circ.target_copy.barcode) -%],
+    [%- helpers.csv_datum(item_type) %]
+[%- END -%]
+$$
 );
 
-CREATE UNIQUE INDEX unique_wwh ON config.usr_activity_type 
-    (COALESCE(ewho,''), COALESCE (ewhat,''), COALESCE(ehow,''));
+INSERT INTO action_trigger.environment (event_def, path)
+    VALUES (
+        currval('action_trigger.event_definition_id_seq'),
+        'target_copy.call_number'
+    );
 
-CREATE TABLE actor.usr_activity (
-    id          BIGSERIAL   PRIMARY KEY,
-    usr         INT         REFERENCES actor.usr (id) ON DELETE SET NULL,
-    etype       INT         NOT NULL REFERENCES config.usr_activity_type (id),
-    event_time  TIMESTAMPTZ NOT NULL DEFAULT NOW()
-);
 
--- remove transient activity entries on insert of new entries
-CREATE OR REPLACE FUNCTION actor.usr_activity_transient_trg () RETURNS TRIGGER AS $$
-BEGIN
-    DELETE FROM actor.usr_activity act USING config.usr_activity_type atype
-        WHERE atype.transient AND 
-            NEW.etype = atype.id AND
-            act.etype = atype.id AND
-            act.usr = NEW.usr;
-    RETURN NEW;
-END;
-$$ LANGUAGE PLPGSQL;
+-- Evergreen DB patch 0689.data.record_print_format_update.sql
+--
+-- Updates print and email templates for bib record actions
+--
 
-CREATE TRIGGER remove_transient_usr_activity
-    BEFORE INSERT ON actor.usr_activity
-    FOR EACH ROW EXECUTE PROCEDURE actor.usr_activity_transient_trg();
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0689', :eg_version);
 
--- given a set of activity criteria, find the most approprate activity type
-CREATE OR REPLACE FUNCTION actor.usr_activity_get_type (
-        ewho TEXT, 
-        ewhat TEXT, 
-        ehow TEXT
-    ) RETURNS SETOF config.usr_activity_type AS $$
-SELECT * FROM config.usr_activity_type 
-    WHERE 
-        enabled AND 
-        (ewho  IS NULL OR ewho  = $1) AND
-        (ewhat IS NULL OR ewhat = $2) AND
-        (ehow  IS NULL OR ehow  = $3) 
-    ORDER BY 
-        -- BOOL comparisons sort false to true
-        COALESCE(ewho, '')  != COALESCE($1, ''),
-        COALESCE(ewhat,'')  != COALESCE($2, ''),
-       &