namespace dc = "http://purl.org/dc/elements/1.1/" namespace dcterms = "http://purl.org/dc/terms/" namespace foaf = "http://xmlns.com/foaf/0.1/" namespace local = "" namespace od = "http://www.example.net/od#" namespace odbib = "http://www.example.net/odbib#" namespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" [ dc:creator [ "Bruce D’Arcus" ] dc:description [ "This an example for bibligraphic metadata modeled on DOAP: a clean XML representation that is also RDF." ] ] start = element rdf:RDF {(odbib.References | odbib.Agents | odbib.Events)+} # generic RDF structures div { ID = attribute rdf:about { xsd:anyURI } | attribute rdf:ID { xsd:anyURI }? ## to handle ordered lists div { Sequence = element rdf:Seq { ListItem+ } ListItem = element rdf:li { URI | Resource } } # literals div { # string literals Literal = text, attribute xml:lang { xsd:language }? # embedded XML content (say for MathML, etc.) XMLLiteral = text, attribute rdf:parseType { "Literal" }, attribute xml:lang { xsd:language }? Resource = element * - (local:*) { rdf.property+ } rdf.property = element * - (local:*) { (Literal | URI) | Resource } } URI = attribute rdf:resource { xsd:anyURI } } # Classes div { # reference types div { odbib.References = Abstract | Article | Bill | Book | Broadcast | Collection | CourtReporter | Data | EditedBook | Hearing | Image | Interview | Journal | LegalCase | Legislation | Magazine | Manuscript | Map | MotionPicture | Pamphlet | Paper | Patent | Periodical | PersonalCommunication | Photograph | Poster | Proceedings | Report | Review | Series | Speech | Thesis # basic patterns by class div { odbib.part = (odbib.base-properties & odbib.containedIn & odbib.part-properties), ID odbib.monograph = (odbib.base-properties & odbib.edition? & odbib.partOf? & odbib.original?), ID odbib.serial = odbib.base-properties, ID odbib.generic = (odbib.base-properties & odbib.containedIn? & odbib.partOf?), ID odbib.presentation = (odbib.base-properties & odbib.containedIn? & odbib.presentedAt? & odbib.part-properties), ID odbib.collection = odbib.collection-properties, ID } div { Abstract = element odbib:Abstract { odbib.part } Article = element odbib:Article { odbib.part } Bill = element odbib:Bill { odbib.part } Book = element odbib:Book { odbib.monograph } Broadcast = element odbib:Broadcast { odbib.generic } Collection = element odbib:Collection { odbib.collection } CourtReporter = element odbib:CourtReporter { odbib.part } Data = element odbib:Data { odbib.generic } EditedBook = element odbib:EditedBook { odbib.monograph } Hearing = element odbib:Hearing { odbib.generic } Image = element odbib:Image { odbib.generic } Interview = element odbib:Image { odbib.part } Journal = element odbib:Journal { odbib.serial } LegalCase = element odbib:LegalCase { odbib.part } Legislation = element odbib:Legislation { odbib.part } Magazine = element odbib:Magazine { odbib.serial } Manuscript = element odbib:Manuscript { odbib.monograph } Map = element odbib:Map { odbib.generic } MotionPicture = element odbib:MotionPicture { odbib.monograph } Pamphlet = element odbib:Pamphlet { odbib.monograph } Paper = element odbib:Paper { odbib.presentation } Patent = element odbib:Patent { odbib.monograph } Periodical = element odbib:Periodical { odbib.serial } PersonalCommunication = element odbib:PersonalCommunication { odbib.generic } Photograph = element odbib:Photograph { odbib.generic } Poster = element odbib:Poster { odbib.presentation } Proceedings = element odbib:Proceedings { odbib.monograph } Report = element odbib:Report { odbib.monograph } Review = element odbib:Review { odbib.part } Series = element odbib:Series { odbib.collection } Speech = element odbib:Speech { odbib.presentation } Thesis = element odbib:Thesis { odbib.monograph } } } # agents div { # Contributors and contributor names are one of the difficult issues in bibligraphic # metadata. RDF adds an additional complication which is that by default RDF properties # an unordered. So the first thing we do is insist that authors are represented as an # rdf sequence. odbib.Authors = element odbib:authors { element rdf:Seq { element rdf:li { odbib.Agents | URI }* } } odbib.Agents = odbib.Person | odbib.Organization odbib.Person = element odbib:Person { ID, odbib.PersonProperties } odbib.Organization = element odbib:Organization { ID, odbib.OrganizationProperties } div { # The other complication is personal names in particular. Ideal requirements: # 1. must be able to represent complex Western and non-Western names in machine-processable ways # example 1: "J. Edgar Hoover" # example 2: any Asian name, with its reversed (in relation to 1) sort order # # 2. support internationalization, which includes transliterated names # # Below is a minimal example that needs more work. div { odbib.PersonProperties = odbib.prefix? & odbib.givenname? & odbib.surname? & odbib.suffix? & odbib.name? & odbib.articular? odbib.givenname = element odbib:givenname { Literal } odbib.surname = element odbib:surname { Literal } odbib.prefix = element odbib:prefix { Literal } odbib.suffix = element odbib:suffix { Literal } ## articular refers to examples like "von" or "bin" which typically precede surnames, but are not sorted on odbib.articular = element odbib:articular { Literal } } div { odbib.OrganizationProperties = odbib.name & odbib.abbreviatedName? & odbib.address? odbib.name = element odbib:name { Literal } odbib.abbreviatedName = element odbib:abbreviatedName { Literal } odbib.address = odbib.city odbib.city = element odbib:city { URI | Literal } } } } # events div { odbib.Events = odbib.Conference | odbib.Workshop odbib.Conference = element odbib:Conference { (odbib.base-properties & (odbib.date | odbib.dateRange)), ID } odbib.Workshop = element odbib:Workshop { (odbib.base-properties & (odbib.date | odbib.dateRange)), ID } } } # properties div { odbib.base-properties = odbib.title* & odbib.abbreviatedTitle* & odbib.dateIssued? & odbib.Authors? & odbib.item* & odbib.publisher? & odbib.identifier* odbib.part-properties = odbib.volume_number? & odbib.issue_number? & odbib.document_number? & odbib.page_numbers? odbib.collection-properties = odbib.partOf # titles div { odbib.title = element odbib:title { Literal | XMLLiteral } odbib.abbreviatedTitle = element odbib:abbreviatedTitle { Literal | XMLLiteral } } # relations # here is the important difference fromi DC and PRISM; we add more fine-grained relations div { odbib.containedIn = element odbib:containedIn { URI | odbib.References } odbib.presentedAt = element odbib:presentedAt { URI | odbib.Events } odbib.partOf = element odbib:partOf { URI | odbib.References } # not sure reviewOf is necessary odbib.reviewOf = element odbib:reviewOf { URI | odbib.References } odbib.original = element odbib:original { URI | odbib.References } } div { odbib.publisher = element odbib:publisher { URI | odbib.Organization } odbib.volume_number = element odbib:volume { Literal } odbib.issue_number = element odbib:issue { Literal } odbib.document_number = element odbib:document { Literal } odbib.edition = element odbib:edition { Literal } odbib.page_numbers = element odbib:pages { Literal } odbib.identifier = element odbib:identifier { URI } } div { # Dates in bibliographic metadata are sometimes difficult. Consider "Summer 2000" # or "March/April 2001" or "April 1-5, 1999" or (even more diffcult) "April 1, 3, 5." # This may need more thought. odbib.dateIssued = element odbib:dateIssued { xsd:date | xsd:gYear | xsd:gYearMonth } odbib.date = element odbib:date { xsd:date | xsd:gYear | xsd:gYearMonth } odbib.dateRange = odbib.beginDate & odbib.endDate odbib.beginDate = element odbib:beginDate { xsd:date | xsd:gYear | xsd:gYearMonth } odbib.endDate = element odbib:endDate { xsd:date | xsd:gYear | xsd:gYearMonth } } div { odbib.item = element odbib:item { URI | odbib.Copy } odbib.Copy = odbib.PhysicalCopy | odbib.ElectronicCopy odbib.PhysicalCopy = element odbib:PhysicalCopy { odbib.item-properties* } odbib.ElectronicCopy = element odbib:ElectronicCopy { odbib.item-properties* } odbib.item-properties = odbib.location | odbib.accessDate | odbib.audience | odbib.owner odbib.location = element odbib:location { Literal | URI } odbib.accessDate = element odbib:accessDate { xsd:date } odbib.audience = element odbib:audience { text } odbib.owner = element odbib:owner { URI | Literal } } }