patrick@0: # $Id$ patrick@0: patrick@0: start = publiset patrick@0: patrick@0: patrick@0: publiset = element publiset { patrick@0: publiset.attributes, patrick@0: publiset.content patrick@0: } patrick@0: patrick@0: publiset.attributes = patrick@0: version.attribute patrick@0: version.attribute = attribute version { "1.0" } patrick@0: patrick@0: publiset.content = patrick@0: (composition | selection)+ patrick@0: patrick@0: patrick@0: # ============================================================================= patrick@20: # TOP LEVEL patrick@0: # ============================================================================= patrick@0: patrick@0: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ composition ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@0: patrick@96: # ~~~~~~ composition patrick@0: composition = element composition { patrick@0: composition.attributes, patrick@0: composition.content patrick@0: } patrick@0: patrick@0: composition.attributes = patrick@0: composition.id.attribute patrick@29: & path.attribute? Patrick@152: & (xpath.attribute | xslt.attribute)? patrick@0: & remap.attributes patrick@66: & lang.attribute? patrick@117: composition.id.attribute = attribute id { xsd:NMTOKEN } patrick@29: path.attribute = attribute path { xsd:anyURI } patrick@29: xslt.attribute = attribute xslt { xsd:anyURI } patrick@29: xpath.attribute = attribute xpath { text } patrick@66: lang.attribute = attribute xml:lang { xsd:language } patrick@0: patrick@0: composition.content = patrick@20: composition.head?, patrick@30: (composition.division | composition.file)+ patrick@0: patrick@96: # ~~~~~~ composition.head patrick@96: composition.head = element head { patrick@96: composition.head.attributes, composition.head.content } patrick@96: patrick@96: composition.head.attributes = patrick@96: remap.attributes patrick@96: patrick@96: composition.head.content = patrick@127: (title, shorttitle?, subtitle?)? Patrick@189: & (identifier, identifier?)? patrick@181: & copyright* Patrick@155: & collection? patrick@96: & contributors? Patrick@189: & date? patrick@98: & keywordset? Patrick@189: & subjectset? patrick@96: & abstract? patrick@96: & cover? patrick@96: patrick@0: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ selection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@0: patrick@96: # ~~~~~~ selection patrick@0: selection = element selection { patrick@0: selection.attributes, patrick@0: selection.content patrick@0: } patrick@0: patrick@0: selection.attributes = patrick@29: selection.id.attribute patrick@29: & path.attribute? patrick@66: & lang.attribute? patrick@117: selection.id.attribute = attribute id { xsd:NMTOKEN } patrick@0: patrick@0: selection.content = patrick@20: selection.head?, patrick@30: (selection.division | selection.file | link)+ patrick@0: patrick@96: # ~~~~~~ selection.head patrick@96: selection.head = element head { composition.head.content } patrick@96: patrick@96: patrick@96: # ============================================================================= patrick@96: # DIVISION LEVEL patrick@96: # ============================================================================= patrick@96: patrick@98: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ division ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@98: patrick@96: # ~~~~~~ division patrick@96: composition.division = element division { patrick@96: composition.division.attributes, patrick@96: composition.division.content patrick@96: } patrick@96: selection.division = element division { patrick@96: selection.division.attributes, patrick@96: selection.division.content patrick@96: } patrick@96: patrick@96: composition.division.attributes = patrick@96: path.attribute? Patrick@152: & (xpath.attribute | xslt.attribute)? patrick@96: & remap.attributes patrick@96: selection.division.attributes = patrick@96: path.attribute? patrick@96: patrick@96: composition.division.content = patrick@96: composition.head?, patrick@96: (composition.division | composition.file)+ patrick@96: selection.division.content = patrick@96: selection.head?, patrick@96: (selection.division | selection.file | link)+ patrick@96: patrick@96: # ~~~~~~ division.head patrick@96: division.head = element head { division.head.content } patrick@96: patrick@96: division.head.content = patrick@127: (title, shorttitle?, subtitle?)? patrick@96: patrick@96: patrick@96: # ============================================================================= patrick@96: # FILE LEVEL patrick@96: # ============================================================================= patrick@96: patrick@96: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@96: patrick@167: composition.file = element file { composition.file.attributes, file.content } patrick@96: selection.file = element file { selection.file.attributes, file.content } patrick@96: patrick@96: composition.file.attributes = patrick@167: path.attribute? Patrick@152: & (xpath.attribute | xslt.attribute)? patrick@96: selection.file.attributes = patrick@167: path.attribute? patrick@96: Patrick@172: file.content = xsd:anyURI patrick@96: patrick@96: patrick@96: # ============================================================================= patrick@96: # BLOCK LEVEL patrick@96: # ============================================================================= patrick@96: patrick@96: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ p ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@96: patrick@96: p = element p { p.content } patrick@96: patrick@96: p.content = patrick@96: inlines patrick@96: patrick@0: patrick@0: # ============================================================================= patrick@20: # HEAD LEVEL patrick@0: # ============================================================================= patrick@0: patrick@0: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ title, subtitle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@0: patrick@0: title = element title { title.content } patrick@127: shorttitle = element shorttitle { title.content } patrick@18: subtitle = element subtitle { title.content } patrick@2: patrick@0: title.content = inlines patrick@0: patrick@34: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ identifier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@34: patrick@38: identifier.uri = element identifier { patrick@38: attribute type { "uri" }, xsd:anyURI patrick@38: } patrick@34: patrick@38: identifier.ean = element identifier { patrick@38: attribute type { "ean" }, xsd:token {pattern = "\d{13}"} patrick@38: } patrick@34: patrick@38: identifier = identifier.uri | identifier.ean patrick@34: patrick@39: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ copyright ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@39: patrick@39: copyright = element copyright { copyright.content } patrick@39: patrick@39: copyright.content = inlines patrick@39: Patrick@155: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ collection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Patrick@155: Patrick@155: collection = element collection { collection.content } Patrick@155: Patrick@155: collection.content = inlines Patrick@155: patrick@66: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ contributors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@5: patrick@66: # ~~~~~~ contributors patrick@66: contributors = element contributors { contributors.content } patrick@5: patrick@66: contributors.content = patrick@66: contributor+ patrick@34: patrick@66: # ~~~~~~ contributor patrick@66: contributor = element contributor { contributor.content } patrick@66: patrick@66: contributor.content = patrick@66: (((firstname, secondname?)?, lastname) | label), patrick@66: address?, patrick@66: link?, patrick@101: role+ patrick@5: patrick@66: # ~~~~~~ firstname, secondname, lastname, label patrick@5: firstname = element firstname { firstname.content } patrick@66: secondname = element secondname { secondname.content } patrick@66: lastname = element lastname { lastname.content } patrick@66: label = element label { label.content } patrick@5: patrick@5: firstname.content = inlines patrick@66: secondname.content = inlines patrick@66: lastname.content = inlines patrick@66: label.content = inlines patrick@5: patrick@66: # ~~~~~~ address patrick@66: address = element address { address.content } patrick@5: patrick@66: address.content = inlines patrick@5: patrick@34: # ~~~~~~ role patrick@66: role = element role { role.content } patrick@34: patrick@101: role.content = "author" | "illustrator" | "publisher" | "packager" patrick@38: Patrick@189: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ keyword & subject ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@98: patrick@98: # ~~~~~~ keywordset patrick@98: keywordset = element keywordset { keywordset.content } patrick@98: patrick@98: keywordset.content = keyword+ patrick@98: patrick@98: # ~~~~~~ keyword patrick@98: keyword = element keyword { keyword.content } patrick@98: patrick@98: keyword.content = mixed { sup*, sub* } patrick@98: Patrick@189: # ~~~~~~ subjectset Patrick@189: subjectset = element subjectset { subjectset.content } Patrick@189: Patrick@189: subjectset.content = subject+ Patrick@189: Patrick@189: # ~~~~~~ subject Patrick@189: subject = element subject { subject.content } Patrick@189: Patrick@189: subject.content = xsd:NMTOKEN Patrick@189: yvon@52: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ abstract ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ yvon@52: yvon@52: abstract = element abstract { abstract.content } yvon@52: yvon@52: abstract.content = yvon@52: p+ yvon@52: patrick@35: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cover ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@35: patrick@35: cover = element cover { cover.content } patrick@35: patrick@35: cover.content = patrick@35: cover.image patrick@35: patrick@35: cover.image = element image { cover.image.attributes } patrick@35: patrick@35: cover.image.attributes = patrick@35: cover.image.id.attribute patrick@35: cover.image.id.attribute = attribute id { xsd:NMTOKEN } patrick@35: patrick@0: patrick@0: # ============================================================================= patrick@20: # INLINE LEVEL patrick@0: # ============================================================================= patrick@0: patrick@0: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ inlines ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@0: patrick@0: inlines = mixed { patrick@0: sup* patrick@0: & sub* Patrick@189: & date* patrick@126: & name* patrick@126: & highlight* Patrick@189: & link* patrick@0: } patrick@0: patrick@0: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub, sup ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@0: patrick@0: sup = element sup { inlines } patrick@0: patrick@0: sub = element sub { inlines } patrick@0: Patrick@189: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ date ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Patrick@189: Patrick@189: date = element date { date.attributes, date.content } Patrick@189: Patrick@189: date.attributes = Patrick@189: date.value.attribute Patrick@189: date.value.attribute = attribute value { xsd:date | xsd:gYearMonth | xsd:gYear } Patrick@189: Patrick@189: date.content = mixed { sup* } Patrick@189: patrick@126: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ name ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@126: patrick@126: name = element name { name.attributes, name.content } patrick@126: patrick@126: name.attributes = patrick@126: name.of.attribute? patrick@126: name.of.attribute = attribute of Patrick@189: { "person" | "company" | "book" | "newspaper" | "party" | "painting" } patrick@126: patrick@126: name.content = inlines patrick@126: patrick@126: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ highlight ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@126: patrick@126: highlight = element highlight { highlight.content } patrick@126: patrick@126: highlight.content = inlines patrick@126: patrick@36: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ link ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ patrick@36: patrick@36: link = element link { link.attributes, link.content } patrick@36: patrick@36: link.attributes = patrick@36: uri.attribute patrick@36: uri.attribute = attribute uri { xsd:anyURI } patrick@36: patrick@36: link.content = inlines patrick@36: patrick@0: patrick@0: # ============================================================================= patrick@20: # REMAP ATTRIBUTES patrick@0: # ============================================================================= patrick@0: patrick@0: remap.attributes = patrick@0: as.attribute? patrick@0: & attributes.attribute? patrick@97: & transform.attribute? patrick@0: as.attribute = attribute as { xsd:QName } patrick@0: attributes.attribute = patrick@0: attribute attributes {list { (xsd:token {pattern = "\c+=\S+"})+ }} patrick@97: transform.attribute = attribute transform { xsd:anyURI }