Repository: Brown-University-Library/bdrxml

Issue:
add support for MODS-3.8

Discussion:

Patch:
diff --git a/bdrxml/mods.py b/bdrxml/mods.py
index a5c9290..4daa10f 100644
--- a/bdrxml/mods.py
+++ b/bdrxml/mods.py
@@ -1,16 +1,36 @@
 import re
 import unicodedata
+
+from .darwincore import get_schema_validation_errors
+from eulxml import xmlmap
 from eulxml.xmlmap import StringField as SF, SchemaField, NodeListField, NodeField
+
 #import everything from eulxml.xmlmap.mods because clients have to use a lot of
 #   those classes, and we're just overriding a few of them here.
 from eulxml.xmlmap.mods import *
-from .darwincore import get_schema_validation_errors
+from eulxml.xmlmap.mods import BaseMods as EulXmlBaseMods
+from eulxml.xmlmap.mods import Common, Date, Note, TitleInfo
+from eulxml.xmlmap.mods import Genre as EulXmlGenre
+from eulxml.xmlmap.mods import Language as EulXmlLanguage
+from eulxml.xmlmap.mods import LanguageTerm as EulXmlLanguageTerm
+from eulxml.xmlmap.mods import Location as EulXmlLocation
+from eulxml.xmlmap.mods import Name as EulXmlName
+from eulxml.xmlmap.mods import OriginInfo as EulXmlOriginInfo
+from eulxml.xmlmap.mods import PartDetail as EulXmlPartDetail
+from eulxml.xmlmap.mods import PhysicalDescription as EulXmlPhysicalDescription
+from eulxml.xmlmap.mods import RecordInfo as EulXmlRecordInfo
+from eulxml.xmlmap.mods import RelatedItem as EulXmlRelatedItem
+from eulxml.xmlmap.mods import Role as EulXmlRole
+from eulxml.xmlmap.mods import Subject as EulXmlSubject
+
 
 XLINK_NAMESPACE = 'http://www.w3.org/1999/xlink'
 XSI_NAMESPACE = 'http://www.w3.org/2001/XMLSchema-instance'
-XSI_LOCATION = 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-7.xsd'
+# XSI_LOCATION = 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-7.xsd'
+XSI_LOCATION = 'http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-8.xsd'
 MODSv35_SCHEMA = "http://www.loc.gov/standards/mods/v3/mods-3-5.xsd"
 MODSv37_SCHEMA = "http://www.loc.gov/standards/mods/v3/mods-3-7.xsd"
+MODSv38_SCHEMA = "http://www.loc.gov/standards/mods/v3/mods-3-8.xsd"
 FAST = 'http://id.worldcat.org/fast'
 
 
@@ -22,12 +42,14 @@ class CommonField(Common):
     text = SF('text()')
 
 
-class PartDetail(PartDetail):
+class PartDetail(EulXmlPartDetail):
     caption = SF('mods:caption')
 
-class Part(Part):
+
+class Part(EulXmlPartDetail):
     details = NodeListField('mods:detail', PartDetail)
 
+
 class PlaceTerm(CommonField):
     ROOT_NAME = 'placeTerm'
     type = SF('@type')
@@ -37,21 +59,23 @@ class Place(Common):
     ROOT_NAME = 'place'
     place_terms = NodeListField('mods:placeTerm', PlaceTerm)
 
-class OriginInfo(OriginInfo):
+
+class OriginInfo(EulXmlOriginInfo):
     label = SF('@displayLabel')
     places = NodeListField('mods:place', Place)
 
 
-class Collection(RelatedItem):
+class Collection(EulXmlRelatedItem):
     name = SF('mods:titleInfo/mods:title')
     id = SF('mods:identifier[@type="COLID"]')
 
 
-class LanguageTerm(LanguageTerm):
+class LanguageTerm(EulXmlLanguageTerm):
     authority_uri = SF('@authorityURI')
     value_uri = SF('@valueURI')
 
-class Language(Language):
+
+class Language(EulXmlLanguage):
     terms = NodeListField('mods:languageTerm', LanguageTerm)
 
 
@@ -60,7 +84,7 @@ class PhysicalDescriptionForm(CommonField):
     type = SF('@type')
 
 
-class PhysicalDescription(PhysicalDescription):
+class PhysicalDescription(EulXmlPhysicalDescription):
     digital_origin = SF('mods:digitalOrigin')
     note = SF('mods:note')
     forms = NodeListField('mods:form', PhysicalDescriptionForm)
@@ -76,17 +100,19 @@ class SubLocation(Common):
     script = SF('@script')
     transliteration = SF('@transliteration')
 
+
 class CopyInformation(Common):
     ROOT_NAME = 'copyInformation'
     notes = NodeListField('mods:note', Note)
     sublocations = NodeListField('mods:subLocation', SubLocation)
 
+
 class HoldingSimple(Common):
     ROOT_NAME = 'holdingSimple'
     copy_information = NodeListField('mods:copyInformation', CopyInformation)
 
 
-class Location(Location):
+class Location(EulXmlLocation):
     physical = NodeField('mods:physicalLocation', PhysicalLocation)
     holding_simple = NodeField('mods:holdingSimple', HoldingSimple)
 
@@ -116,7 +142,7 @@ class Topic(CommonField):
     ROOT_NAME = 'topic'
 
 
-class Subject(Subject):
+class Subject(EulXmlSubject):
     label = SF('@displayLabel')
     authority_uri = SF('@authorityURI')
     value_uri = SF('@valueURI')
@@ -136,7 +162,7 @@ class Classification(CommonField):
     label = SF('@displayLabel')
 
 
-class Genre(Genre):
+class Genre(EulXmlGenre):
     authority_uri = SF('@authorityURI')
     value_uri = SF('@valueURI')
     type = SF('@type')
@@ -156,18 +182,18 @@ class RecordContentSource(CommonField):
     ROOT_NAME = 'recordContentSource'
 
 
-class RecordInfo(RecordInfo):
+class RecordInfo(EulXmlRecordInfo):
     record_identifier_list = NodeListField('mods:recordIdentifier', RecordIdentifier)
     record_creation_date = NodeField('mods:recordCreationDate', RecordCreationDate)
     record_content_source = NodeField('mods:recordContentSource', RecordContentSource)
 
 
-class Role(Role):
+class Role(EulXmlRole):
     authority_uri = SF('mods:roleTerm/@authorityURI')
     value_uri = SF('mods:roleTerm/@valueURI')
 
 
-class Name(Name):
+class Name(EulXmlName):
     roles = NodeListField('mods:role', Role)
     authority_uri = SF('@authorityURI')
     value_uri = SF('@valueURI')
@@ -182,7 +208,7 @@ class ResourceType(Common):
     text = SF('text()')
 
 
-class BaseMods(BaseMods):
+class BaseMods(EulXmlBaseMods):
     classifications = NodeListField('mods:classification', Classification)
     origin_info = NodeField('mods:originInfo', OriginInfo)
     subjects = NodeListField('mods:subject', Subject)
@@ -210,7 +236,8 @@ class Mods(BaseMods):
     http://www.loc.gov/standards/mods/mods-outline.html
     """
     ROOT_NAME = 'mods'
-    XSD_SCHEMA = MODSv37_SCHEMA
+    # XSD_SCHEMA = MODSv37_SCHEMA
+    XSD_SCHEMA = MODSv38_SCHEMA
     Common.ROOT_NAMESPACES['xlink'] = XLINK_NAMESPACE
     Common.ROOT_NAMESPACES['xsi'] = XSI_NAMESPACE
     xsi_schema_location = SF('@xsi:schemaLocation')
@@ -223,8 +250,9 @@ class Mods(BaseMods):
 
     def validation_errors(self):
         '''see notes on SimpleDarwinRecordSet.validation_errors()'''
-        return get_schema_validation_errors(schema_name='mods-3-7.xsd', lxml_node=self.node)
-
+        #return get_schema_validation_errors(schema_name='mods-3-7.xsd', lxml_node=self.node)
+        return get_schema_validation_errors(schema_name='mods-3-8.xsd', lxml_node=self.node)
+    
 
 def make_mods():
     """Helper that returns Mods object."""
diff --git a/bdrxml/schemas/mods-3-8.xsd b/bdrxml/schemas/mods-3-8.xsd
new file mode 100644
index 0000000..72f60c6
--- /dev/null
+++ b/bdrxml/schemas/mods-3-8.xsd
@@ -0,0 +1,1774 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  
+	Library of Congress
+	
+Editor: Ray Denenberg	raydenenberg@gmail.com 
+ -->
+<xs:schema xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns="http://www.loc.gov/mods/v3" targetNamespace="http://www.loc.gov/mods/v3"
+	elementFormDefault="qualified" attributeFormDefault="unqualified">
+	<!-- -->
+	<xs:import namespace="http://www.w3.org/XML/1998/namespace"
+		schemaLocation="http://www.loc.gov/mods/xml.xsd"/>
+	<xs:import namespace="http://www.w3.org/1999/xlink"
+		schemaLocation="http://www.loc.gov/standards/xlink/xlink.xsd"/>
+	<!-- 
+MODS: Metadata Object Description Schema. See http://www.loc.gov/standards/mods/
+
+          *******************************************************************
+         *                                                                                
+         *                          MODS 3.8
+         *         
+         *                     September 16, 2022
+         *             
+          *********************************************************************
+
+********* November 10, 2022 the attribute @supplied has been added to the <name> definition.
+********* August 11, 2023 removed duplicate IDAttributeGroup declaration from accessCondition.
+
+
+*************** Changes in version 3.8
+
+1. Controlled-list restriction removed on authority attribute 
+   for <placeTerm> <geographic Code> and <languageTerm>.	
+
+2.  Attributes @otherTypeAuth,  @otherTypeAuthURI,  and @otherTypeURI added for <titleInfo>.
+
+3. Element <agent>  added, subelement of <originInfo>.
+   
+4. Authority attributes added for <accessCondition> and for <affiliation>. 
+
+5. Attribute @usage added for <recordInfo>, value "primary".
+
+6. Attribute @IDref added to any element that has the @ID attribute; 
+   attributes @ID and @idref added to top-level elements that have neither.
+
+7. Element <nameIdentifier> element added, subelement of <place>.
+
+8. Element <cartographics> added, subelement of <place>.
+
+9. Attribute @stateType added, subelement of <subject><hierarchicalGeographic><state>.
+
+10.  Element <displayDate> added, subelement of <originInfo>.
+
+11.  Attribute @eventTypeURI added to <originInfo>.
+
+12.  Attribute @usage of <location><url>, value "primary display" deprecated.
+
+13. All occurrences of @fixed removed, replaced by a single-value controlled list,
+    where the value is the previous value of @fixed.
+
+14. @type  added to <extension>.
+
+***************************************************
+***************************************************
+
+
+
+     *************************************
+     Organization of this schema
+     *************************************
+
+The schema has three parts:
+
+1.   Structural declarations and definitions 
+2.    Elements (top level elements  and their subelements)
+3.   Auxiliary Definitions 
+
+         ***********************************************************************
+         ***********************************************************************
+         Part 1:    Structural Declarations and Definitions 
+         ***********************************************************************
+         ***********************************************************************
+- Definition of a single MODS record  and a MODS collection   
+- modsGroup, listing the top level MODS elements
+
+***********************************************************************
+**      Definition of a single MODS record                           **
+**********************************************************************
+-->
+	<xs:element name="mods" type="modsDefinition"/>
+	<!--  -->
+	<xs:complexType name="modsDefinition">
+		<xs:group ref="modsGroup" maxOccurs="unbounded"/>
+		<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+		<xs:attribute name="version">
+			<xs:simpleType>
+				<xs:restriction base="xs:string">
+					<xs:enumeration value="3.8"/>
+					<xs:enumeration value="3.7"/>
+					<xs:enumeration value="3.6"/>
+					<xs:enumeration value="3.5"/>
+					<xs:enumeration value="3.4"/>
+					<xs:enumeration value="3.3"/>
+					<xs:enumeration value="3.2"/>
+					<xs:enumeration value="3.1"/>
+					<xs:enumeration value="3.0"/>
+				</xs:restriction>
+			</xs:simpleType>
+		</xs:attribute>
+	</xs:complexType>
+	<!-- 
+***********************************************************************
+**      Definition of a MODS collection                                **
+**********************************************************************
+-->
+	<xs:element name="modsCollection" type="modsCollectionDefinition"/>
+	<!-- -->
+	<xs:complexType name="modsCollectionDefinition">
+		<xs:sequence>
+			<xs:element ref="mods" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!--  
+
+************************************************
+**      Group Definition 
+***********************************************
+This forms the basis of the mods record definition, and also relatedItem. 
+The difference between a MODS record and a relatedItem 
+(as they pertain to their usage of the group definition) 
+is that mods requires at least one element and relatedItem does not. 
+The group definition is used by both, where relatedItem says 
+minOccurs="0" and for the mods record definition minOccurs="1" (default).
+
+-->
+	<xs:group name="modsGroup">
+		<xs:choice>
+			<!-- 
+***********************************************************************
+**        These are the "top level" MODS elements               **
+**********************************************************************
+-->
+			<xs:element ref="abstract"/>
+			<xs:element ref="accessCondition"/>
+			<xs:element ref="classification"/>
+			<xs:element ref="extension"/>
+			<xs:element ref="genre"/>
+			<xs:element ref="identifier"/>
+			<xs:element ref="language"/>
+			<xs:element ref="location"/>
+			<xs:element ref="name"/>
+			<xs:element ref="note"/>
+			<xs:element ref="originInfo"/>
+			<xs:element ref="part"/>
+			<xs:element ref="physicalDescription"/>
+			<xs:element ref="recordInfo"/>
+			<xs:element ref="relatedItem"/>
+			<xs:element ref="subject"/>
+			<xs:element ref="tableOfContents"/>
+			<xs:element ref="targetAudience"/>
+			<xs:element ref="titleInfo"/>
+			<xs:element ref="typeOfResource"/>
+			<!-- 
+End list of "top level" MODS elements 
+-->
+		</xs:choice>
+	</xs:group>
+	<!--	
+        ***********************************************************************
+        ***********************************************************************
+       Part 2:   Elements (top level elements and their subelements)                               
+       ************************************************************************
+        ***********************************************************************                              
+-->
+	<!--   
+*********************************************
+*   Top Level Element <abstract>       *
+*********************************************
+ -->
+	<xs:element name="abstract" type="abstractDefinition"/>
+	<!-- -->
+	<xs:complexType name="abstractDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="type" type="xs:string"/>
+				<xs:attributeGroup ref="xlink:simpleLink"/>
+				<!-- 
+					@sharable definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+				<xs:attribute name="shareable" type="no"/>
+				<!--  -->
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<xs:attributeGroup ref="altFormatAttributeGroup"/>
+				<!-- 
+****************** following attribute group added in 3.8-->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!-- -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+
+****************************************************
+*   Top Level Element <accessCondition>       *
+*****************************************************
+ -->
+	<xs:element name="accessCondition" type="accessConditionDefinition"/>
+	<!-- -->
+	<xs:complexType name="accessConditionDefinition" mixed="true">
+		<xs:complexContent mixed="true">
+			<xs:extension base="extensionDefinition">
+				<xs:attributeGroup ref="xlink:simpleLink"/>
+				<xs:attributeGroup ref="languageAttributeGroup"/>
+				<!-- 
+			Previously attribute @type was here. It is 
+			removed  in 3.8 because it has been added 
+			to the "extension" defintion;  "accessCondition"
+			is based on the "extension definition" so @type is
+			thereby implicitly included in this definition.
+				-->
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<xs:attributeGroup ref="altFormatAttributeGroup"/>
+				<!-- 
+****************** following two attribute groups added in 3.8 -->
+		 		<!--ID attribute group removed as duplicate. See August 11, 2023 note -->
+				<!-- <xs:attributeGroup ref="IDAttributeGroup"/> -->
+				<xs:attributeGroup ref="authorityAttributeGroup"/>
+				<!--  -->
+			</xs:extension>
+		</xs:complexContent>
+	</xs:complexType>
+	<!--
+****************************************************
+*   Top Level Element <classification>          *
+*****************************************************
+-->
+	<xs:element name="classification" type="classificationDefinition"/>
+	<!-- -->
+	<xs:complexType name="classificationDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<xs:attribute name="edition" type="xs:string"/>
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<!-- 
+					@usage definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+				<xs:attribute name="usage" type="usagePrimary"/>
+				<!-- -->
+				<xs:attribute name="generator" type="xs:string"/>
+				<!-- 
+****************** following  attribute group added in 3.8-->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!--  -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+****************************************************
+*   Top Level Element <extension>              *
+*****************************************************
+ -->
+	<xs:element name="extension" type="extensionDefinition"/>
+	<!-- -->
+	<xs:complexType name="extensionDefinition" mixed="true">
+		<xs:sequence>
+			<xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<!-- 
+****************** following  attribute added in 3.8 -->
+		<xs:attribute name="type" type="xs:string"/>
+		<!-- 
+****************** following  attribute group added in 3.8-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!--  -->
+	</xs:complexType>
+	<!--  
+****************************************************
+*   Top Level Element <genre>                    *
+*****************************************************
+-->
+	<xs:element name="genre" type="genreDefinition"/>
+	<!-- -->
+	<xs:complexType name="genreDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<xs:attribute name="type" type="xs:string"/>
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<!-- 
+					@usage definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+				<xs:attribute name="usage" type="usagePrimary"/>
+				<!-- 
+****************** following  attribute group added in 3.8 -->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!--  -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+****************************************************
+*   Top Level Element <identifier>                  *
+*****************************************************
+-->
+	<xs:element name="identifier" type="identifierDefinition"/>
+	<!-- -->
+	<xs:complexType name="identifierDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="type" type="xs:string"/>
+				<xs:attribute name="typeURI" type="xs:anyURI"/>
+				<!-- 
+					@invalid definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+				<xs:attribute name="invalid" type="yes"/>
+				<!-- -->
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<!-- 
+****************** following attribute group  added in 3.8 -->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!-- -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--  
+****************************************************
+*   Top Level Element <language>                *
+*****************************************************
+-->
+	<xs:element name="language" type="languageDefinition"/>
+	<!-- -->
+	<xs:complexType name="languageDefinition">
+		<xs:sequence>
+			<xs:element ref="languageTerm" maxOccurs="unbounded"/>
+			<xs:element ref="scriptTerm" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="objectPart" type="xs:string"/>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<!-- 
+					@usage definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+		<xs:attribute name="usage" type="usagePrimary"/>
+		<!-- 
+****************** following attribute group added in 3.8 -->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <language>  ********
+
+ 
+*****************languageTerm ************************
+ -->
+	<xs:element name="languageTerm" type="languageTermDefinition"/>
+	<!-- -->
+	<xs:complexType name="languageTermDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">			  
+	<!--	    ****** changed in 3.8 from "stringPlusLanguage" to
+				****** "stringPlusLanguagePlusAuthority".  Previously,
+				******  @authority was restricted to specific values.
+				******   That restriction is removed in 3.8
+				-->
+				<xs:attribute name="type" type="codeOrText"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- 
+*****************scriptTerm ************************
+-->
+	<xs:element name="scriptTerm" type="scriptTermDefinition"/>
+	<!-- -->
+	<xs:complexType name="scriptTermDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<xs:attribute name="type" type="codeOrText"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+
+****************************************************
+*   Top Level Element <location>                 *
+*****************************************************         
+ -->
+	<xs:element name="location" type="locationDefinition"/>
+	<!-- -->
+	<xs:complexType name="locationDefinition">
+		<xs:sequence>
+			<xs:element ref="physicalLocation" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="shelfLocator" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="url" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="holdingSimple" minOccurs="0"/>
+			<xs:element ref="holdingExternal" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<!-- 
+****************** following attribute group  added in 3.8 -->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <location>                
+ -->
+	<!--	  
+********** physicalLocation **********         
+-->
+	<xs:element name="physicalLocation" type="physicalLocationDefinition"/>
+	<!-- -->
+	<xs:complexType name="physicalLocationDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<xs:attributeGroup ref="xlink:simpleLink"/>
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="type" type="xs:string"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- -->
+	<xs:element name="shelfLocator" type="stringPlusLanguage"/>
+	<!--  
+********** holdingSimple **********      
+ -->
+	<xs:element name="holdingSimple" type="holdingSimpleDefinition"/>
+	<!-- -->
+	<xs:complexType name="holdingSimpleDefinition">
+		<xs:sequence>
+			<xs:element ref="copyInformation" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!--
+**********copyInformation **********     
+ -->
+	<xs:element name="copyInformation" type="copyInformationDefinition"/>
+	<!-- -->
+	<xs:complexType name="copyInformationDefinition">
+		<xs:sequence>
+			<xs:element ref="form" minOccurs="0"/>
+			<xs:element ref="subLocation" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="shelfLocator" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="electronicLocator" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="note" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="stringPlusLanguage">
+							<xs:attribute name="displayLabel" type="xs:string"/>
+							<xs:attribute name="type" type="xs:string"/>
+							<xs:attributeGroup ref="xlink:simpleLink"/>
+							<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+							<xs:attributeGroup ref="IDAttributeGroup"/>
+							<!-- -->
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element ref="enumerationAndChronology" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="itemIdentifier" minOccurs="0" maxOccurs="unbounded"/>
+			<!--	-->
+		</xs:sequence>
+	</xs:complexType>
+	<!--
+**********itemIdentifier **********     
+ -->
+	<xs:element name="itemIdentifier" type="itemIdentifierDefinition"/>
+	<xs:complexType name="itemIdentifierDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="type" type="xs:string"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+**********form**********     
+ -->
+	<xs:element name="form" type="formDefinition"/>
+	<!-- -->
+	<xs:complexType name="formDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<xs:attribute name="type" type="xs:string"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- -->
+	<xs:element name="subLocation" type="stringPlusLanguage"/>
+	<xs:element name="electronicLocator" type="stringPlusLanguage"/>
+	<!--  
+**********enumerationAndChronology  **********     
+     -->
+	<xs:element name="enumerationAndChronology" type="enumerationAndChronologyDefinition"/>
+	<!-- -->
+	<xs:complexType name="enumerationAndChronologyDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="unitType">
+					<xs:simpleType>
+						<xs:restriction base="xs:string">
+							<xs:enumeration value="1"/>
+							<xs:enumeration value="2"/>
+							<xs:enumeration value="3"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+ ********** url  **********        
+     -->
+	<xs:element name="url" type="urlDefinition"/>
+	<!-- -->
+	<xs:complexType name="urlDefinition">
+		<xs:simpleContent>
+			<xs:extension base="xs:anyURI">
+				<xs:attribute name="dateLastAccessed" type="xs:string"/>
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="note" type="xs:string"/>
+				<xs:attribute name="access">
+					<xs:simpleType>
+						<xs:restriction base="xs:string">
+							<xs:enumeration value="preview"/>
+							<xs:enumeration value="raw object"/>
+							<xs:enumeration value="object in context"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+				<xs:attribute name="usage">
+					<xs:simpleType>
+						<xs:restriction base="xs:string">
+							<xs:enumeration value="primary display"/>
+							<!-- This value,"primary display”, is deprecated in version 3.8;
+								“primary” is the only value that should be used in 3.8 and beyond.
+								("primary display” remains a legal value in the schema, 
+								for compatibility with earlier versions.) 
+							-->
+							<xs:enumeration value="primary"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- -->
+	<xs:element name="holdingExternal" type="extensionDefinition"/>
+	<!-- 
+****************************************************
+*   Top Level Element <name>                 *
+*****************************************************         
+-->
+	<xs:element name="name" type="nameDefinition"/>
+	<!-- -->
+	<xs:complexType name="nameDefinition">
+		<xs:choice>
+
+			<!-- this choice gives two ways to do this.  
+				The second way allows the element <etal>,  to express "et. al."
+
+Choice one. WITHOUT <etal>.
+-->
+			<xs:choice minOccurs="0" maxOccurs="unbounded">
+				<xs:element ref="namePart"/>
+				<xs:element ref="displayForm"/>
+				<xs:element ref="affiliation"/>
+				<xs:element ref="role"/>
+				<xs:element ref="description"/>
+				<xs:element ref="nameIdentifier"/>
+				<xs:element ref="alternativeName"/>
+				<!--   -->
+			</xs:choice>
+			<!-- 
+Choice two.	With <etal>.
+               The presence of <etal> indicates that there are names that cannot 
+               be explicitily included. It may be empty, or it may have simple content
+               - e.g. <etal>et al.</etal>.  In the latter case the content is what is 
+               suggested for display. 
+               When <etal> occurs:
+                  - <namePart>, <displayForm>, and <identifier> MAY NOT occur;
+                  - <affiliation>, <role>, <description>   MAY occur (but are NOT repeatable).
+              <etal> is not repeatable within a given <name>, however there may be 
+              mutilple <etal> elements, each within in a separate <name> element.
+-->
+			<xs:sequence>
+				<!--   
+             <etal> is mandatory, nonrepeatable, and must occur first. 
+            After that <affiliation>, <role>, and <description> may occur, in any order or number. 
+            <nameIdentifier> is not used with <etal>
+-->
+				<xs:element ref="etal"/>
+				<xs:choice minOccurs="0" maxOccurs="unbounded">
+					<xs:element ref="affiliation"/>
+					<xs:element ref="role"/>
+					<xs:element ref="description"/>
+				</xs:choice>
+			</xs:sequence>
+			<!-- -->
+		</xs:choice>
+		<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+		<xs:attributeGroup ref="authorityAttributeGroup"/>
+		<xs:attributeGroup ref="xlink:simpleLink"/>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<xs:attribute name="nameTitleGroup" type="xs:string"/>
+		<!-- 
+					@usage definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+		<xs:attribute name="usage" type="usagePrimary"/>
+		<xs:attribute name="type">
+			<xs:simpleType>
+				<xs:restriction base="xs:string">
+					<xs:enumeration value="personal"/>
+					<xs:enumeration value="corporate"/>
+					<xs:enumeration value="conference"/>
+					<xs:enumeration value="family"/>
+				</xs:restriction>
+			</xs:simpleType>
+		</xs:attribute>
+		<!--    
+******************  Following line added 11/10/2022.  Fixes a flaw.
+			 -->
+		<xs:attribute name="supplied"  type="yes"/>
+		<!-- -->
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <name>                
+ -->
+	<!-- namePart-->
+	<xs:element name="namePart" type="namePartDefinition"/>
+	<!-- -->
+	<xs:complexType name="namePartDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="type">
+					<xs:simpleType>
+						<xs:restriction base="xs:string">
+							<xs:enumeration value="date"/>
+							<xs:enumeration value="family"/>
+							<xs:enumeration value="given"/>
+							<xs:enumeration value="termsOfAddress"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- displayForm, affiliation, description, alternativeName -->
+	<xs:element name="displayForm" type="stringPlusLanguage"/>
+	<!-- 
+		affiliation definition changed in 3.8. Authority attributes added -->
+	<xs:element name="affiliation" type="stringPlusLanguagePlusAuthority"/>
+	<!-- -->
+	<xs:element name="description" type="stringPlusLanguage"/>
+	<xs:element name="nameIdentifier" type="identifierDefinition"/>
+	<xs:element name="alternativeName" type="alternativeNameDefinition"/>
+	<!--  
+		
+******** role *********************
+    -->
+	<xs:element name="role" type="roleDefinition"/>
+	<!-- -->
+	<xs:complexType name="roleDefinition">
+		<xs:sequence maxOccurs="unbounded">
+			<xs:element ref="roleTerm"/>
+		</xs:sequence>
+	</xs:complexType>
+	<!--  
+***************roleTerm *********************** 
+    -->
+	<xs:element name="roleTerm" type="roleTermDefinition"/>
+	<!-- -->
+	<xs:complexType name="roleTermDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<xs:attribute name="type" type="codeOrText"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- 
+********  etal  ********
+-->
+	<xs:element name="etal" type="stringPlusLanguage"/>
+	<!--   
+********  alternativeName  ********
+-->
+	<xs:complexType name="alternativeNameDefinition">
+
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="namePart"/>
+			<xs:element ref="displayForm"/>
+			<xs:element ref="affiliation"/>
+			<xs:element ref="role"/>
+			<xs:element ref="description"/>
+			<xs:element ref="nameIdentifier"/>
+		</xs:choice>
+		<!-- -->
+		<xs:attributeGroup ref="xlink:simpleLink"/>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altType" type="xs:string"/>
+	</xs:complexType>
+
+	<!--
+
+****************************************************
+*   Top Level Element <note>                      *
+*****************************************************         
+-->
+	<xs:element name="note" type="noteDefinition"/>
+	<!-- -->
+	<xs:complexType name="noteDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="type" type="xs:string"/>
+				<xs:attribute name="typeURI" type="xs:anyURI"/>
+				<xs:attributeGroup ref="xlink:simpleLink"/>
+				<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!-- -->
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<!-- -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--  
+
+****************************************************
+*   Top Level Element <originInfo>                 *
+****************************************************        
+-->
+	<xs:element name="originInfo" type="originInfoDefinition"/>
+	<!-- -->
+	<xs:complexType name="originInfoDefinition">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element ref="place"/>
+			<xs:element ref="publisher"/>
+			<xs:element ref="dateIssued"/>
+			<xs:element ref="dateCreated"/>
+			<xs:element ref="dateCaptured"/>
+			<xs:element ref="dateValid"/>
+			<xs:element ref="dateModified"/>
+			<xs:element ref="copyrightDate"/>
+			<xs:element ref="dateOther"/>
+			<!-- 
+				following element, "displayDate", added in 3.8  -->
+			<xs:element ref="displayDate"/>
+			<!--  -->
+			<xs:element ref="edition"/>
+			<xs:element ref="issuance"/>
+			<xs:element ref="frequency"/>
+			<!--  
+				following element, "agent", added in 3.8-->
+			<xs:element ref="agent"/>
+			<!--		-->
+		</xs:choice>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<xs:attribute name="eventType" type="xs:string"/>
+		<!--  
+			following attribute, @eventTypeURI, added in 3.8	-->
+		<xs:attribute name="eventTypeURI" type="xs:anyURI"/>
+		<!--
+******************  following attribute group added in 3.8 -->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <originInfo>    -->             
+<!--
+		
+*** place ***
+-->
+	<xs:element name="place" type="placeDefinition"/>
+	<!-- -->
+	<xs:complexType name="placeDefinition">
+		<xs:choice minOccurs="1" maxOccurs="unbounded">
+			<!-- 
+				Previously, place was simply one or more occurrences of placeTerm.
+				In 3.8, placeIdentifer and cartographics are added to placeDefinition. 
+				placeIdentifier is a new element in 3.8; cartographics uses the 
+				existing cartographicsDefinition. 
+				
+				So, now place is one or more of the following three subelements where 
+				each may be any of the three.
+			-->
+			<xs:element ref="placeTerm"/>
+			<xs:element ref="placeIdentifier"/>
+			<xs:element ref="cartographics"/>
+			<!-- -->
+		</xs:choice>
+		<!-- 
+					@supplied definition corrected in 3.8.  
+					See "Changes in version 3.8" #13 -->
+		<xs:attribute name="supplied" type="yes"/>
+		<!-- -->
+	</xs:complexType>
+	<!-- 
+		
+*** placeTerm ***
+-->
+	<xs:element name="placeTerm" type="placeTermDefinition"/>
+	<!-- -->
+	<xs:complexType name="placeTermDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<!--  
+				****** changed in 3.8 from "stringPlusLanguage" to
+				****** "stringPlusLanguagePlusAuthority".  Previously,
+				******  @authority was restricted to specific values.
+				******   That restriction is removed in 3.8
+				-->
+				<xs:attribute name="type" type="codeOrText"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- 
+		
+*** placeIdentifier ***    (********new in 3.8) 
+-->
+	<xs:element name="placeIdentifier" type="xs:anyURI"/>
+	<!-- -->
+	<!-- 
+		
+*** publisher ***
+-->
+	<xs:element name="publisher" type="publisherDefinition"/>
+	<!--   -->
+	<xs:complexType name="publisherDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusSupplied">
+				<xs:attributeGroup ref="authorityAttributeGroup"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+		
+	agent ***    (********new in 3.8) 
+		
+	 -->
+	<xs:element name="agent" type="nameDefinition"/>
+	<!-- 
+		
+********** dates  **********  -->
+	<xs:element name="dateIssued" type="dateDefinition"/>
+	<xs:element name="dateCreated" type="dateDefinition"/>
+	<xs:element name="dateCaptured" type="dateDefinition"/>
+	<xs:element name="dateValid" type="dateDefinition"/>
+	<xs:element name="dateModified" type="dateDefinition"/>
+	<xs:element name="copyrightDate" type="dateDefinition"/>
+	<xs:element name="dateOther" type="dateOtherDefinition"/>
+
+	<!-- following definition added 3.8  -->
+	<xs:element name="displayDate" type="xs:string"/>
+	<!--  -->
+
+	<xs:complexType name="dateDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="encoding">
+					<xs:simpleType>
+						<xs:restriction base="xs:string">
+							<xs:enumeration value="w3cdtf"/>
+							<xs:enumeration value="iso8601"/>
+							<xs:enumeration value="marc"/>
+							<xs:enumeration value="temper"/>
+							<xs:enumeration value="edtf"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+				<xs:attribute name="qualifier">
+					<xs:simpleType>
+						<xs:restriction base="xs:string">
+							<xs:enumeration value="approximate"/>
+							<xs:enumeration value="inferred"/>
+							<xs:enumeration value="questionable"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+				<xs:attribute name="point">
+					<xs:simpleType>
+						<xs:restriction base="xs:string">
+							<xs:enumeration value="start"/>
+							<xs:enumeration value="end"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+				<!-- 
+					@keyDate definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+				<xs:attribute name="keyDate" type="yes"/>
+				<!-- -->
+				<xs:attribute name="calendar" type="xs:string"/>
+				<!-- -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+	********** dateOther  **********  
+-->
+	<xs:complexType name="dateOtherDefinition">
+		<xs:simpleContent>
+			<xs:extension base="dateDefinition">
+				<xs:attribute name="type" type="xs:string"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+	********** edition **********  
+-->
+	<xs:element name="edition" type="stringPlusLanguagePlusSupplied"/>
+	<!--  
+********** issuance **********  	
+       -->
+	<xs:element name="issuance" type="issuanceDefinition"/>
+	<!-- -->
+	<xs:simpleType name="issuanceDefinition">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="continuing"/>
+			<xs:enumeration value="monographic"/>
+			<xs:enumeration value="single unit"/>
+			<xs:enumeration value="multipart monograph"/>
+			<xs:enumeration value="serial"/>
+			<xs:enumeration value="integrating resource"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!--
+	********** frequency **********  
+-->
+	<xs:element name="frequency" type="stringPlusLanguagePlusAuthority"/>
+
+
+	<!--
+****************************************************
+*   Top Level Element <part>                       *
+*****************************************************  
+-->
+	<xs:element name="part" type="partDefinition"/>
+	<!-- -->
+	<xs:complexType name="partDefinition">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="detail"/>
+			<xs:element name="extent" type="extentDefinition"/>
+			<xs:element ref="date"/>
+			<xs:element ref="text"/>
+		</xs:choice>
+		<xs:attribute name="type" type="xs:string"/>
+		<xs:attribute name="order" type="xs:integer"/>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <part>                
+ -->
+	<!-- 
+********** detail **********  
+-->
+	<xs:element name="detail" type="detailDefinition"/>
+	<!-- -->
+	<xs:complexType name="detailDefinition">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element ref="number"/>
+			<xs:element ref="caption"/>
+			<xs:element ref="title"/>
+		</xs:choice>
+		<xs:attribute name="type" type="xs:string"/>
+		<xs:attribute name="level" type="xs:positiveInteger"/>
+	</xs:complexType>
+	<!-- -->
+	<xs:element name="number" type="stringPlusLanguage"/>
+	<xs:element name="caption" type="stringPlusLanguage"/>
+	<!-- 
+********** extent **********  
+-->
+	<xs:complexType name="extentDefinition">
+		<xs:sequence>
+			<xs:element ref="start" minOccurs="0"/>
+			<xs:element ref="end" minOccurs="0"/>
+			<xs:element ref="total" minOccurs="0"/>
+			<xs:element ref="list" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute name="unit" type="xs:string"/>
+	</xs:complexType>
+	<!-- -->
+	<xs:element name="start" type="stringPlusLanguage"/>
+	<xs:element name="end" type="stringPlusLanguage"/>
+	<xs:element name="total" type="xs:positiveInteger"/>
+	<xs:element name="list" type="stringPlusLanguage"/>
+	<!--
+***************** date *** 
+-->
+	<xs:element name="date" type="dateDefinition"/>
+	<!--
+***************** text *** 
+-->
+	<xs:element name="text">
+		<xs:complexType>
+			<xs:simpleContent>
+				<xs:extension base="stringPlusLanguage">
+					<xs:attribute name="displayLabel" type="xs:string"/>
+					<xs:attribute name="type" type="xs:string"/>
+					<xs:attributeGroup ref="xlink:simpleLink"/>
+				</xs:extension>
+			</xs:simpleContent>
+		</xs:complexType>
+	</xs:element>
+	<!--
+
+****************************************************
+*   Top Level Element <physicalDescription> *
+*****************************************************         
+ -->
+	<xs:element name="physicalDescription" type="physicalDescriptionDefinition"/>
+	<!-- -->
+	<xs:complexType name="physicalDescriptionDefinition">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element ref="form"/>
+			<!-- same definition as is used in copyInformation -->
+			<xs:element ref="reformattingQuality"/>
+			<xs:element ref="internetMediaType"/>
+			<xs:element ref="extent"/>
+			<xs:element ref="digitalOrigin"/>
+			<xs:element name="note" type="physicalDescriptionNote"/>
+		</xs:choice>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<!-- 
+******************  following attribute group added in in 3.8-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <physicalDescription>                
+ -->
+	<!-- 
+**********reformattingQuality **********  		 
+ -->
+	<xs:element name="reformattingQuality" type="reformattingQualityDefinition"/>
+	<!-- -->
+	<xs:simpleType name="reformattingQualityDefinition">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="access"/>
+			<xs:enumeration value="preservation"/>
+			<xs:enumeration value="replacement"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- 
+**********internetMediaType **********  		 
+ -->
+	<xs:element name="internetMediaType" type="stringPlusLanguage"/>
+	<!--
+********** extent **********  	
+ -->
+	<xs:element name="extent">
+		<xs:complexType>
+			<xs:simpleContent>
+				<xs:extension base="stringPlusLanguagePlusSupplied">
+					<xs:attribute name="unit"/>
+				</xs:extension>
+			</xs:simpleContent>
+		</xs:complexType>
+	</xs:element>
+	<!--
+********** digitalOrigin **********  	
+ -->
+	<xs:element name="digitalOrigin" type="digitalOriginDefinition"/>
+	<!-- -->
+	<xs:simpleType name="digitalOriginDefinition">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="born digital"/>
+			<xs:enumeration value="reformatted digital"/>
+			<xs:enumeration value="digitized microfilm"/>
+			<xs:enumeration value="digitized other analog"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!--
+********** note **********  	
+ -->
+	<xs:complexType name="physicalDescriptionNote">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="type" type="xs:string"/>
+				<xs:attribute name="typeURI" type="xs:anyURI"/>
+				<xs:attributeGroup ref="xlink:simpleLink"/>
+				<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!-- -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+****************************************************
+*   Top Level Element <recordInfo>              *
+*****************************************************         
+
+**********  recordInfo  **********   
+-->
+	<xs:element name="recordInfo" type="recordInfoDefinition"/>
+	<!-- -->
+	<xs:complexType name="recordInfoDefinition">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element ref="recordContentSource"/>
+			<xs:element ref="recordCreationDate"/>
+			<xs:element ref="recordChangeDate"/>
+			<xs:element ref="recordIdentifier"/>
+			<xs:element ref="languageOfCataloging"/>
+			<xs:element ref="recordOrigin"/>
+			<xs:element ref="descriptionStandard"/>
+			<xs:element ref="recordInfoNote"/>
+			<!-- -->
+		</xs:choice>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<!-- 
+					@usage added to recordInfo in 3.8.  -->
+		<xs:attribute name="usage" type="usagePrimary"/>
+		<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following) -->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <recordInfo>                
+ -->
+	<xs:element name="recordContentSource" type="stringPlusLanguagePlusAuthority"/>
+	<xs:element name="recordCreationDate" type="dateDefinition"/>
+	<xs:element name="recordChangeDate" type="dateDefinition"/>
+	<xs:element name="recordInfoNote" type="noteDefinition"/>
+	<!--
+********** recordIdentifier 
+-->
+	<xs:element name="recordIdentifier" type="recordIdentifierDefinition"/>
+	<!-- -->
+	<xs:complexType name="recordIdentifierDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="source" type="xs:string"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- -->
+	<xs:element name="languageOfCataloging" type="languageDefinition"/>
+	<xs:element name="recordOrigin" type="stringPlusLanguage"/>
+	<xs:element name="descriptionStandard" type="stringPlusLanguagePlusAuthority"/>
+	<!-- 
+
+****************************************************
+*   Top Level Element <relatedItem>             *
+*****************************************************         
+
+**********   relatedItem  **********  
+-->
+	<xs:element name="relatedItem" type="relatedItemDefinition"/>
+	<!-- -->
+	<xs:complexType name="relatedItemDefinition">
+		<xs:group ref="modsGroup" minOccurs="0" maxOccurs="unbounded"/>
+		<xs:attribute name="type">
+			<xs:simpleType>
+				<xs:restriction base="xs:string">
+					<xs:enumeration value="preceding"/>
+					<xs:enumeration value="succeeding"/>
+					<xs:enumeration value="original"/>
+					<xs:enumeration value="host"/>
+					<xs:enumeration value="constituent"/>
+					<xs:enumeration value="series"/>
+					<xs:enumeration value="otherVersion"/>
+					<xs:enumeration value="otherFormat"/>
+					<xs:enumeration value="isReferencedBy"/>
+					<xs:enumeration value="references"/>
+					<xs:enumeration value="reviewOf"/>
+				</xs:restriction>
+			</xs:simpleType>
+		</xs:attribute>
+		<!-- -->
+		<xs:attribute name="otherType" type="xs:string"/>
+		<xs:attribute name="otherTypeAuth" type="xs:string"/>
+		<xs:attribute name="otherTypeAuthURI" type="xs:string"/>
+		<xs:attribute name="otherTypeURI" type="xs:string"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attributeGroup ref="xlink:simpleLink"/>
+		<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+	</xs:complexType>
+	<!--  
+
+****************************************************
+*   Top Level Element <subject>                  *
+*****************************************************         
+-->
+	<xs:element name="subject" type="subjectDefinition"/>
+	<!-- -->
+	<xs:complexType name="subjectDefinition">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="topic"/>
+			<xs:element ref="geographic"/>
+			<xs:element ref="temporal"/>
+			<xs:element name="titleInfo" type="subjectTitleInfoDefinition"/>
+			<xs:element name="name" type="subjectNameDefinition"/>
+			<xs:element ref="geographicCode"/>
+			<xs:element ref="hierarchicalGeographic"/>
+			<xs:element ref="cartographics"/>
+			<xs:element ref="occupation"/>
+			<xs:element ref="genre"/>
+			<!-- uses top-level genre definition -->
+		</xs:choice>
+		<xs:attributeGroup ref="authorityAttributeGroup"/>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attributeGroup ref="xlink:simpleLink"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<!-- 
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+		<!-- 
+					@usage definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+		<xs:attribute name="usage" type="usagePrimary"/>
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <subject>                
+ -->
+	<!-- topic, geographic -->
+	<xs:element name="topic" type="stringPlusLanguagePlusAuthority"/>
+	<xs:element name="geographic" type="stringPlusLanguagePlusAuthority"/>
+	<xs:element name="geographicCode" type="stringPlusLanguagePlusAuthority"/>
+	<!-- changed in 3.8 from "geographicCodeDefinition" to "stringPlusLanguagePlusAuthority". 
+		Previously there had been a separate definition for geographicCode 
+		to accomodate a controlled list restriction.  That restriction is 
+		dropped in 3.8 
+		-->
+	<!-- 
+*****************temporal  ************************
+ -->
+	<xs:element name="temporal" type="temporalDefinition"/>
+	<!-- -->
+	<xs:complexType name="temporalDefinition">
+		<xs:simpleContent>
+			<xs:extension base="dateDefinition">
+				<xs:attributeGroup ref="authorityAttributeGroup"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- 
+*****************subjectTitleInfo ************************
+-->
+	<xs:complexType name="subjectTitleInfoDefinition">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="title"/>
+			<xs:element ref="subTitle"/>
+			<xs:element ref="partNumber"/>
+			<xs:element ref="partName"/>
+			<xs:element ref="nonSort"/>
+		</xs:choice>
+		<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+		<xs:attributeGroup ref="authorityAttributeGroup"/>
+		<xs:attributeGroup ref="xlink:simpleLink"/>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<xs:attribute name="type">
+			<xs:simpleType>
+				<xs:restriction base="xs:string">
+					<xs:enumeration value="abbreviated"/>
+					<xs:enumeration value="translated"/>
+					<xs:enumeration value="alternative"/>
+					<xs:enumeration value="uniform"/>
+				</xs:restriction>
+			</xs:simpleType>
+		</xs:attribute>
+		<!--	
+					Following four attributes added in 3.8 -->
+		<xs:attribute name="otherType"/>
+		<xs:attribute name="otherTypeAuth" type="xs:string"/>
+		<xs:attribute name="otherTypeAuthURI" type="xs:anyURI"/>
+		<xs:attribute name="otherTypeURI" type="xs:anyURI"/>
+		<!-- -->
+	</xs:complexType>
+	<!-- 
+*****************subjectName ************************
+-->
+	<xs:complexType name="subjectNameDefinition">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="namePart"/>
+			<xs:element ref="displayForm"/>
+			<xs:element ref="affiliation"/>
+			<xs:element ref="role"/>
+			<xs:element ref="description"/>
+			<xs:element ref="nameIdentifier"/>
+			<!-- -->
+		</xs:choice>
+		<xs:attribute name="type">
+			<xs:simpleType>
+				<xs:restriction base="xs:string">
+					<xs:enumeration value="personal"/>
+					<xs:enumeration value="corporate"/>
+					<xs:enumeration value="conference"/>
+					<xs:enumeration value="family"/>
+				</xs:restriction>
+			</xs:simpleType>
+		</xs:attribute>
+		<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+		<xs:attributeGroup ref="authorityAttributeGroup"/>
+		<xs:attributeGroup ref="xlink:simpleLink"/>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+	</xs:complexType>
+	<!--
+ ********** geographicCode ********** 
+ 
+ "geographicCode definition, here, prior to 3.8, is removed in 3.8;
+ it is now in "subordinate defitions for subject"
+-->
+	<!--  
+********** hierarchicalGeographic **********  	 
+-->
+	<xs:element name="hierarchicalGeographic" type="hierarchicalGeographicDefinition"/>
+	<!-- -->
+	<xs:complexType name="hierarchicalGeographicDefinition">
+		<xs:choice maxOccurs="unbounded">
+			<xs:element ref="extraTerrestrialArea"/>
+			<xs:element ref="continent"/>
+			<xs:element ref="country"/>
+			<!-- -->
+			<xs:element ref="province"/>
+			<!-- province has been deprecated (in a previous version). 
+				Use <state> instead of province. 
+			-->
+			<xs:element ref="region"/>
+			<xs:element ref="state"/>
+			<xs:element ref="territory"/>
+			<xs:element ref="county"/>
+			<xs:element ref="city"/>
+			<xs:element ref="citySection"/>
+			<xs:element ref="island"/>
+			<xs:element ref="area"/>
+		</xs:choice>
+		<xs:attributeGroup ref="authorityAttributeGroup"/>
+	</xs:complexType>
+	<!-- -->
+	<!-- 		********** hierarchicalPart   *** auxiliary definition 	-->
+	<xs:complexType name="hierarchicalPart">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="level"/>
+				<xs:attribute name="period"/>
+				<xs:attributeGroup ref="authorityAttributeGroup"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- 
+		Next, definitions for the place elements, starting with area, region, and citySection
+		-->
+	<!--
+		
+********** area 
+-->
+	<xs:element name="area" type="areaDefinition"/>
+	<!-- -->
+	<xs:complexType name="areaDefinition">
+		<xs:simpleContent>
+			<xs:extension base="hierarchicalPart">
+				<xs:attribute name="areaType"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- -->
+	<!--
+		
+********** region 
+-->
+	<xs:element name="region" type="regionDefinition"/>
+	<!-- -->
+	<xs:complexType name="regionDefinition">
+		<xs:simpleContent>
+			<xs:extension base="hierarchicalPart">
+				<xs:attribute name="regionType"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+		
+********** citySection
+-->
+	<xs:element name="citySection" type="citySectionDefinition"/>
+	<!-- -->
+	<xs:complexType name="citySectionDefinition">
+		<xs:simpleContent>
+			<xs:extension base="hierarchicalPart">
+				<xs:attribute name="citySectionType"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--  -->	
+	<!-- 
+		Next, definitions for state
+		-->
+	<!--
+		
+********** state
+-->
+	<xs:element name="state" type="stateDefinition"/>
+	<!-- see stateDefinition, revised in 3.8: @stateType added.  -->
+	<!-- 
+		
+	The rest are all of type "hierarchicalPart"   ......
+		-->
+	<xs:element name="extraTerrestrialArea" type="hierarchicalPart"/>
+	<xs:element name="city" type="hierarchicalPart"/>
+	<xs:element name="continent" type="hierarchicalPart"/>
+	<xs:element name="country" type="hierarchicalPart"/>
+	<xs:element name="county" type="hierarchicalPart"/>
+	<xs:element name="island" type="hierarchicalPart"/>
+	<!-- 
+		following removed in 3.8, replaced by new definition for state, below.
+	****REMOVED: <xs:element name="state" type="hierarchicalPart"/>  ****REMOVED
+	-->
+	<xs:element name="territory" type="hierarchicalPart"/>
+	<!--  
+		..... except for province  (which was depricated in a previous version)	-->
+	<xs:element name="province" type="stringPlusLanguage"/>
+	<!-- 	
+		.... and (in 3.8) for state: 
+	
+	new state definition, 3.8. Before, state was simply hierarchicalPart.
+	 Now @stateType is added-->
+	<xs:complexType name="stateDefinition">
+		<xs:simpleContent>
+			<xs:extension base="hierarchicalPart">
+				<xs:attribute name="stateType"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--  
+		
+ ********** cartographics **********  
+-->
+	<xs:element name="cartographics" type="cartographicsDefinition"/>
+	<!-- -->
+	<xs:complexType name="cartographicsDefinition">
+
+		<xs:sequence>
+			<xs:element ref="scale" minOccurs="0"/>
+			<xs:element ref="projection" minOccurs="0"/>
+			<xs:element ref="coordinates" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element ref="cartographicExtension" minOccurs="0" maxOccurs="unbounded"/>
+			<!--  -->
+		</xs:sequence>
+		<!--  -->
+		<xs:attributeGroup ref="authorityAttributeGroup"/>
+		<!--  -->
+	</xs:complexType>
+	<!-- -->
+	<xs:element name="scale" type="stringPlusLanguage"/>
+	<xs:element name="projection" type="stringPlusLanguage"/>
+	<xs:element name="coordinates" type="stringPlusLanguage"/>
+	<xs:element name="cartographicExtension" type="extensionDefinition"/>
+	<!-- 
+		
+ ********** occupation **********  
+-->
+	<xs:element name="occupation" type="stringPlusLanguagePlusAuthority"/>
+	<!--
+****************************************************
+*   Top Level Element <tableOfContents>     *
+*****************************************************           
+ -->
+	<xs:element name="tableOfContents" type="tableOfContentsDefinition"/>
+	<!-- -->
+	<xs:complexType name="tableOfContentsDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="type" type="xs:string"/>
+				<xs:attributeGroup ref="xlink:simpleLink"/>
+				<!-- 
+					@sharable definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+				<xs:attribute name="shareable" type="no"/>
+				<!--  -->
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<xs:attributeGroup ref="altFormatAttributeGroup"/>
+				<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!-- -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- 
+
+****************************************************
+*   Top Level Element <targetAudience>       *
+*****************************************************           
+ -->
+	<xs:element name="targetAudience" type="targetAudienceDefinition"/>
+	<!-- -->
+	<xs:complexType name="targetAudienceDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<!-- 
+******************  following attribute group added in 3.8-->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!-- -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+****************************************************
+*   Top Level Element <titleInfo>                   *
+*****************************************************
+          -->
+	<xs:element name="titleInfo" type="titleInfoDefinition"/>
+	<!-- -->
+	<xs:complexType name="titleInfoDefinition">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="title"/>
+			<xs:element ref="subTitle"/>
+			<xs:element ref="partNumber"/>
+			<xs:element ref="partName"/>
+			<xs:element ref="nonSort"/>
+		</xs:choice>
+		<xs:attribute name="type">
+			<xs:simpleType>
+				<xs:restriction base="xs:string">
+					<xs:enumeration value="abbreviated"/>
+					<xs:enumeration value="translated"/>
+					<xs:enumeration value="alternative"/>
+					<xs:enumeration value="uniform"/>
+				</xs:restriction>
+			</xs:simpleType>
+		</xs:attribute>
+		<xs:attribute name="otherType"/>
+		<!-- 
+			Following three attributes added in 3.8 
+			(For consistency with relatedItem.)
+			-->
+		<xs:attribute name="otherTypeAuth" type="xs:string"/>
+		<xs:attribute name="otherTypeAuthURI" type="xs:anyURI"/>
+		<xs:attribute name="otherTypeURI" type="xs:anyURI"/>
+		<!--  -->
+		<!-- 
+					@supplied definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+		<xs:attribute name="supplied" type="yes"/>
+		<!-- -->
+		<xs:attribute name="altRepGroup" type="xs:string"/>
+		<xs:attributeGroup ref="altFormatAttributeGroup"/>
+		<xs:attribute name="nameTitleGroup" type="xs:string"/>
+		<!-- 
+					@usage definition corrected in 3.8.  
+					See "Changes in version 3.8" #13-->
+		<xs:attribute name="usage" type="usagePrimary"/>
+		<!-- -->
+		<xs:attributeGroup ref="authorityAttributeGroup"/>
+		<xs:attributeGroup ref="xlink:simpleLink"/>
+		<xs:attributeGroup ref="languageAttributeGroup"/>
+		<xs:attribute name="displayLabel" type="xs:string"/>
+		<!--
+****************** @IDREF added in 3.8 (@ID removed and replaced by the following)-->
+		<xs:attributeGroup ref="IDAttributeGroup"/>
+		<!-- -->
+	</xs:complexType>
+	<!--
+
+********   Subordinate Elements for <titleInfo>                
+ -->
+	<xs:element name="title" type="stringPlusLanguage"/>
+	<xs:element name="subTitle" type="stringPlusLanguage"/>
+	<xs:element name="partNumber" type="stringPlusLanguage"/>
+	<xs:element name="partName" type="stringPlusLanguage"/>
+	<!-- 
+*********  nonSort
+		-->
+	<xs:element name="nonSort">
+		<xs:complexType>
+			<xs:simpleContent>
+				<xs:extension base="stringPlusLanguage">
+					<xs:attribute ref="xml:space"/>
+				</xs:extension>
+			</xs:simpleContent>
+		</xs:complexType>
+	</xs:element>
+	<!--
+****************************************************
+*   Top Level Element <typeOfResource>     *
+*****************************************************         
+ -->
+	<xs:element name="typeOfResource" type="typeOfResourceDefinition"/>
+	<!-- -->
+	<xs:complexType name="typeOfResourceDefinition">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguagePlusAuthority">
+				<!-- 
+
+					@collection, @manuscript, and @usage definitions changed.  
+					See "Changes in version 3.8" #13-->
+				<xs:attribute name="collection" type="yes"/>
+				<xs:attribute name="manuscript" type="yes"/>
+				<xs:attribute name="usage" type="usagePrimary"/>
+				<!-- -->
+				<xs:attribute name="displayLabel" type="xs:string"/>
+				<xs:attribute name="altRepGroup" type="xs:string"/>
+				<!-- 
+******************  following attribute group added in 3.8-->
+				<xs:attributeGroup ref="IDAttributeGroup"/>
+				<!-- -->
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+
+	<!--  
+		
+		***** End of top level elements *****
+		
+         *********************************
+         *********************************
+         Part 3:   Auxiliary definitions
+         *********************************
+         *********************************
+
+**********************************
+String Definitions 
+**********************************
+-->
+	<!--
+********** stringPlusLanguage  
+   -->
+	<xs:complexType name="stringPlusLanguage">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attributeGroup ref="languageAttributeGroup"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--
+************************* stringPlusLanguagePlusAuthority  *************************     	
+ -->
+	<xs:complexType name="stringPlusLanguagePlusAuthority">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attributeGroup ref="authorityAttributeGroup"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!--                     
+************************* stringPlusLanguagePlusSupplied  *************************     	 
+ -->
+	<xs:complexType name="stringPlusLanguagePlusSupplied">
+		<xs:simpleContent>
+			<xs:extension base="stringPlusLanguage">
+				<xs:attribute name="supplied" type="yes"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<!-- 
+**********************************
+  Attribute Group Definitions 
+**********************************
+-->
+	<!--   
+ ********** authorityAttributeGroup   **********  	                       	  
+   -->
+	<xs:attributeGroup name="authorityAttributeGroup">
+		<!-- new in 3.4 -->
+		<xs:attribute name="authority" type="xs:string"/>
+		<xs:attribute name="authorityURI" type="xs:anyURI"/>
+		<xs:attribute name="valueURI" type="xs:anyURI"/>
+	</xs:attributeGroup>
+	<!--   
+  ********** languageAttributeGroup   **********  	                       	  
+-->
+	<xs:attributeGroup name="languageAttributeGroup">
+		<xs:attribute name="lang" type="xs:string"/>
+		<xs:attribute ref="xml:lang"/>
+		<xs:attribute name="script" type="xs:string"/>
+		<xs:attribute name="transliteration" type="xs:string"/>
+	</xs:attributeGroup>
+	<!--   
+  ********** altFormatAttributeGroup   **********  	                       	  
+-->
+	<xs:attributeGroup name="altFormatAttributeGroup">
+		<xs:attribute name="altFormat" type="xs:anyURI"/>
+		<xs:attribute name="contentType" type="xs:string"/>
+	</xs:attributeGroup>
+
+	<!--   ********** IDAttributeGroup   **********  	                       	  
+-
+			This attribute group added in 3.8 
+			-->
+	<xs:attributeGroup name="IDAttributeGroup">
+		<xs:attribute name="ID" type="xs:ID"/>
+		<xs:attribute name="IDREF" type="xs:IDREF"/>
+	</xs:attributeGroup>
+	<!-- 
+****************************************************
+  - Attribute definitions (simpleTypes)
+*****************************************************
+-->
+	<!--  
+   ********** codeOrText
+                  ******** used by type attribute  for elements that distinguish code from text:
+                  ******** <languageTerm>, <placeTerm>, <roleTerm>, <scriptTerm>
+ -->
+	<xs:simpleType name="codeOrText">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="code"/>
+			<xs:enumeration value="text"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- 
+		all following attribute definitions added 3.8	
+	-->
+	<xs:simpleType name="no">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="no"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- -->
+	<xs:simpleType name="yes">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="yes"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<!-- -->
+	<xs:simpleType name="usagePrimary">
+		<xs:restriction base="xs:string">
+			<xs:enumeration value="primary"/>
+		</xs:restriction>
+	</xs:simpleType>
+
+</xs:schema>
diff --git a/requirements.in b/requirements.in
new file mode 100644
index 0000000..10fb6eb
--- /dev/null
+++ b/requirements.in
@@ -0,0 +1,12 @@
+## TEMP -- for development
+
+## from setup.py
+eulxml==1.1.3
+ply==3.8
+# rdflib
+
+## actual version used by workshop in production
+rdflib==6.0.0
+
+## actual version used by workshop in production -- newest version fails on some code
+lxml==4.7.1
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..b8fbcf4
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,29 @@
+#
+# This file is autogenerated by pip-compile with Python 3.8
+# by the following command:
+#
+#    pip-compile ./requirements.in
+#
+eulxml==1.1.3
+    # via -r ./requirements.in
+isodate==0.6.1
+    # via rdflib
+lxml==4.7.1
+    # via
+    #   -r ./requirements.in
+    #   eulxml
+ply==3.8
+    # via
+    #   -r ./requirements.in
+    #   eulxml
+pyparsing==3.1.1
+    # via rdflib
+rdflib==6.0.0
+    # via -r ./requirements.in
+six==1.16.0
+    # via
+    #   eulxml
+    #   isodate
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
diff --git a/setup.py b/setup.py
index 125dad7..8010727 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 from setuptools import setup, find_packages
 
 setup(name='bdrxml',
-    version='1.4',
+    version='1.5',
     url='https://github.com/Brown-University-Library/bdrxml',
     author='Brown University Library',
     author_email='bdr@brown.edu',


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 3ebe023..2a9b0bb 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -14,7 +14,7 @@ jobs:
     strategy:
       max-parallel: 4
       matrix:
-        python-version: [3.6.8, 3.7, 3.8, 3.9]
+        python-version: [3.7, 3.8, 3.9]
 
     steps:
     - uses: actions/checkout@v2
diff --git a/test/mods_test.py b/test/mods_test.py
index c2f9932..3dce81b 100644
--- a/test/mods_test.py
+++ b/test/mods_test.py
@@ -1,5 +1,5 @@
 import unittest
-from eulxml.xmlmap  import load_xmlobject_from_string
+from eulxml.xmlmap import load_xmlobject_from_string
 from bdrxml import mods
 
 SAMPLE_MODS = '''
@@ -165,6 +165,13 @@ MODS_35_XML = '''
     </mods:titleInfo>
 </mods:mods>
 '''
+MODS_38_XML = '''
+<mods:mods xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/1999/xlink" 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-8.xsd" ID="id101" version="3.8">
+    <mods:titleInfo>
+        <mods:title>A Title</mods:title>
+    </mods:titleInfo>
+</mods:mods>
+'''
 INVALID_MODS_XML = '''
 <mods:mods xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/1999/xlink" 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-7.xsd" ID="id101" version="3.7">
     <mods:titleInfo>
@@ -366,6 +373,10 @@ class ModsReadWrite(unittest.TestCase):
         loaded = load_xmlobject_from_string(MODS_35_XML, mods.Mods)
         self.assertTrue(loaded.is_valid())
 
+    def test_validate_mods_38(self):
+        loaded = load_xmlobject_from_string(MODS_38_XML, mods.Mods)
+        self.assertTrue(loaded.is_valid())
+
     def test_validate_created_mods(self):
         self.mods.title = 'Poétry'
         self.assertTrue(self.mods.is_valid())