# originally edited by Ray Denenberg (Library of Congress) # converted to RelaxNG by Bruce D'Arcus # $Id: mods-3-0.rnc,v 1.4 2004/02/22 21:54:42 darcusb Exp $ default namespace = "http://www.loc.gov/mods/v3" namespace xlink = "http://www.w3.org/1999/xlink" start |= ModsSchema ModsSchema = classification | relatedItem | accessCondition | recordInfo | mods-note | typeOfResource | mods-language | element modsCollection { Mods+ } | Mods | mods-abstract | mods-tableOfContents | mods-identifier | physicalDescription | mods-subject | mods-location | genre | targetAudience | titleInfo | mods-name | originInfo mods-tableOfContents = element tableOfContents { unstructuredText } Mods = element mods { ModsType } ## generic structures div { unstructuredText = (simpleLink, attlist-language, attribute displayLabel { xsd:string }?, attribute type { xsd:string }?, xsd:string), empty mods-note = element note { unstructuredText } ID-Attribute = attribute ID { token } } titleInfoType = (attlist-language, simpleLink, attribute displayLabel { xsd:string }?, attribute authority { text }?, attribute type { xsd:string "uniform" | xsd:string "alternative" | xsd:string "abbreviated" | xsd:string "translated" }?, ID-Attribute?, (element title { anyType } | element subTitle { anyType } | element partNumber { anyType } | element partName { anyType } | element nonSort { anyType })+), empty recordInfo = element recordInfo { attlist-language, (element recordContentSource { genericAuthority } | element recordCreationDate { dateType } | element recordChangeDate { dateType } | element recordIdentifier { attribute source { text }?, xsd:string } | element languageOfCataloging { languageType } | element recordOrigin { anyType })+ } targetAudience = element targetAudience { attribute authority { text }?, attlist-language, xsd:string } typeOfResource = element typeOfResource { attribute collection { xsd:string "yes" }?, attribute manuscript { xsd:string "yes" }?, (xsd:string "sound recording-nonmusical" | xsd:string "mixed material" | xsd:string "notated music" | xsd:string "three dimensional object" | xsd:string "sound recording" | xsd:string "cartographic" | xsd:string "text" | xsd:string "software, multimedia" | xsd:string "sound recording-musical" | xsd:string "still image" | xsd:string "moving image") } genre = element genre { attribute authority { text }?, attlist-language, xsd:string } ## name definitions div { mods-name = element name { nameType } nameType = (attlist-language, simpleLink, attribute authority { text }?, name-type?, ID-Attribute?, (namePart | element displayForm { anyType } | element affiliation { anyType } | role | element description { anyType })+), empty name-type = attribute type { xsd:string "corporate" | xsd:string "conference" | xsd:string "personal" } namePart = element namePart { attlist-namePart, xsd:string } attlist-namePart = namePart-type? namePart-type = attribute type { xsd:string "family" | xsd:string "given" | xsd:string "date" | xsd:string "termsOfAddress" } role = element role { roleTerm+ } roleTerm = element roleTerm { attlist-roleTerm, xsd:string } attlist-roleTerm = attribute authority { text }?, attribute type { xsd:string "code" | xsd:string "text" }? } ## allow any content in the extension element div { anyType = mixed { (attribute * { text } | extensionSchema)* }, empty extensionSchema = element * { mixed { (extensionSchema | attribute * { text })* } } } titleInfo = element titleInfo { titleInfoType } physicalDescription = element physicalDescription { attlist-language, (element form { attribute authority { text }?, xsd:string } | element reformattingQuality { xsd:string "access" | xsd:string "preservation" | xsd:string "replacement" } | element internetMediaType { anyType } | element extent { anyType } | element digitalOrigin { xsd:string "reformatted digital" | xsd:string "born digital" } | element note { unstructuredText })+ } mods-identifier = element identifier { attribute type { text }?, attribute displayLabel { text }?, attribute invalid { xsd:string "yes" }?, attlist-language, xsd:string } mods-subject = element subject { attlist-language, attribute authority { text }?, simpleLink, ID-Attribute?, (element topic { anyType } | element geographic { anyType } | element temporal { dateType } | element titleInfo { titleInfoType } | element name { nameType } | element geographicCode { attribute authority { xsd:string "marcgac" | xsd:string "iso3166" | xsd:string "marccountry" }?, xsd:string } | element hierarchicalGeographic { (element continent { anyType } | element country { anyType } | element province { anyType } | element region { anyType } | element state { anyType } | element territory { anyType } | element county { anyType } | element city { anyType } | element island { anyType } | element area { anyType })+ } | element cartographics { element scale { anyType }?, element projection { anyType }?, element coordinates { anyType }+ } | element occupation { anyType })+ } mods-language = element language { languageType } attlist-language = attribute transliteration { text }?, attribute script { text }?, attribute lang { xsd:language }? ModsType = attribute version { xsd:string "3.0" }?, ID-Attribute?, (titleInfo | mods-name | typeOfResource | genre | originInfo | mods-language | physicalDescription | mods-abstract | mods-tableOfContents | targetAudience | mods-note | mods-subject | classification | relatedItem | mods-identifier | mods-location | accessCondition | element extension { extension-content } | recordInfo)+ extension-content = mixed { extensionSchema+ } baseDateType = attribute encoding { xsd:string "iso8601" | xsd:string "marc" | xsd:string "w3cdtf" }?, attribute qualifier { xsd:string "questionable" | xsd:string "inferred" | xsd:string "approximate" }?, attribute point { xsd:string "start" | xsd:string "end" }?, xsd:string genericAuthority = attribute authority { text }?, attlist-language, xsd:string accessCondition = element accessCondition { unstructuredText } dateType = (attribute keyDate { xsd:string "yes" }?, baseDateType), empty simpleLink = attribute xlink:actuate { xsd:string "other" | xsd:string "none" | xsd:string "onRequest" | xsd:string "onLoad" }?, attribute xlink:show { xsd:string "other" | xsd:string "embed" | xsd:string "none" | xsd:string "new" | xsd:string "replace" }?, attribute xlink:title { xsd:string }?, attribute xlink:arcrole { xsd:string }?, attribute xlink:role { xsd:string }?, attribute xlink:href { xsd:anyURI }?, attribute xlink:type { xsd:string "simple" }? mods-abstract = element abstract { unstructuredText } languageType = element languageTerm { attribute authority { xsd:string "iso639-2b" | xsd:string "rfc3066" }?, attribute type { xsd:string "code" | xsd:string "text" }?, xsd:string }+, empty classification = element classification { attribute authority { text }?, attribute edition { text }?, attlist-language, xsd:string } ## Used for capturing different levels of bibliographic metadata. ## For example, both an article and a book chapter would contain ## a relatedItem "host" to capture the container information. relatedItem = element relatedItem { ModsType, Part*, attribute type { xsd:string "otherVersion" | xsd:string "host" | xsd:string "original" | xsd:string "succeeding" | xsd:string "otherFormat" | xsd:string "preceding" | xsd:string "constituent" | xsd:string "series" | xsd:string "isReferencedBy" }?, attribute displayLabel { xsd:string }?, simpleLink } # ================= Begin part definitions =============== ## Key addition in v3 allows for coding of details associated with ## analyticals such as articles and book chapters. Part = element part { (Detail | Extent | Date | Text)+ } Detail = element detail { attlist-detail, (Number | Caption | Title)+ } attlist-detail = attribute level { xsd:positiveInteger }?, attribute type { text }? Extent = element extent { attlist-extent, Start?, End?, Total?, List? } attlist-extent = attribute unit { text }? Number = element number { anyType } Caption = element caption { anyType } Title = element title { anyType } Start = element start { anyType } End = element end { anyType } Total = element total { xsd:positiveInteger } List = element list { anyType } Date = element date { baseDateType } Text = element text { unstructuredText } # ================= End part definitions =============== ## Location captures archival holdings and online urls. mods-location = element location { element physicalLocation { attribute displayLabel { text }?, genericAuthority }*, element url { attribute dateLastAccessed { text }?, attribute displayLabel { text }?, xsd:string }* } originInfo = element originInfo { attlist-language, (place | element publisher { anyType } | element dateIssued { dateType } | element dateCreated { dateType } | element dateCaptured { dateType } | element dateValid { dateType } | element dateModified { dateType } | element copyrightDate { dateType } | element dateOther { dateType } | element edition { anyType } | element issuance { xsd:string "monographic" | xsd:string "continuing" } | element frequency { anyType })+ } ## For publisher places, but also could be used for things like ## conference, lecture, or interview places. This is thus different ## than the location element. div { place = element place { placeTerm? } placeTerm = element placeTerm { xsd:string, attlist-placeTerm } attlist-placeTerm = attribute authority { xsd:string "marcgac" | xsd:string "iso3166" | xsd:string "marccountry" }?, attribute type { xsd:string "code" | xsd:string "text" }? }