TEI META Task Force: TEI and Docbook model classes [MEW03]


This document is an informal catalogue of TEI element classes, a formal description of a proposed revision of the Docbook schema, and notes on the points of overlap. The purpose of the document is to stimulate discussion about
  1. How the TEI can improve or extend its element classes
  2. Where the TEI and Docbook might agree on intersection points

TEI classes

addrPart address contents
agent individuals or corporations?
bibl bibliographic items
biblPart contents of a bibliographic item
inter things that can appear between or within chunks
chunk blocks that can't contain themselves (contains para)
common chunk and inter (things in all bases)
data inline names, dates, numbers, measures, etc. (abbr, address, date, daterange, datestruct, expan, geogname, ...)
date date expressions
demographic elements describing demographics in a linguistic context (used person and persongroup)
dict.parts inlines elements in a dictionary entry
dict.toplevel tags for blocks in a dictionary
divBot elements that can occur at the end of a division (byline, closing, epigraph, signed, ...)
divTop elements that can occur at the start of a division (similar to divBot)
dramaFront elements that occur at the elemenets of divisions in a drama (castlist, epilog, performance, prologue, set)
edit inline for editorial corrections (deletions, edits...)
editIncl same but can be anywhere (gap)
fm.chunk frontmatter when no titlepage
front, back level of divisions in front or back matter (divGen, dramaFront)
hqInter highlighting (q, quote, cit)
hqPhrase highlighting (distinct, emph, foreign, gloss, hi, mentioned, socalled, term, title)
Incl (anchor, etc.)
lists listlike elements
listBibl biblist
metadata links, certainty, index
names persons. places, things (bloc, country, goegname, personname, region, ...)
notes notelike elements (footnote, remark)
personPart first, surname, ...
phrase inlines
phrase.verse verses
placePart names of places
seg elements used for arbitrary segmentation (clauses, phrase, morphemes, words)
sgmlKeywords att, gi
stageDirection camera, caption, move, sound, tech, view
tpParts title page parts (as in a written work)

Current Docbook class structure

namespace ctrl = "http://nwalsh.com/xmlns/schema-control/"
namespace rng  = "http://relaxng.org/ns/structure/1.0"

#Divisions are big things in books:

divisions = db.part | db.reference

#Components occur in books too:

components =
   db.dedication
 | db.preface
 | db.chapter
 | db.appendix
 | db.article
 | db.colophon

navigation.components =
   db.toc | db.index | db.glossary | db.bibliography

component.contentmodel =
  navigation.components*, blocks.or.sections, navigation.components*

id.attribute        = attribute id { xsd:ID }

xml.lang.attribute  = attribute xml:lang { text }

xml.base.attribute  = attribute xml:base { text }

remap.attribute     = attribute remap { text }

xreflabel.attribute = attribute xreflabel { text }

revisionflag.attribute =
  attribute revisionflag { "changed" | "added" | "deleted" | "off" }

effectivity.attributes =
  arch.attribute,
  condition.attribute,
  conformance.attribute,
  os.attribute,
  revision.attribute,
  security.attribute,
  userlevel.attribute,
  vendor.attribute

arch.attribute        = attribute arch        { text }
condition.attribute   = attribute condition   { text }
conformance.attribute = attribute conformance { text }
os.attribute          = attribute os          { text }
revision.attribute    = attribute revision    { text }
security.attribute    = attribute security    { text }
userlevel.attribute   = attribute userlevel   { text }
vendor.attribute      = attribute vendor      { text }

# ======================================================================

linkend.attribute  = attribute linkend { xsd:IDREF }

linkends.attribute = attribute linkends { xsd:IDREFS }

href.attribute = attribute href { text }

# ======================================================================

common.attributes =
  id.attribute?,
  xml.lang.attribute?,
  xml.base.attribute?,
  remap.attribute?,
  xreflabel.attribute?,
  revisionflag.attribute?,
  effectivity.attributes?

common.attrib.idreq =
  id.attribute,
  xml.lang.attribute?,
  xml.base.attribute?,
  remap.attribute?,
  xreflabel.attribute?,
  revisionflag.attribute?,
  effectivity.attributes?

common.linking.attributes.req =
   linkend.attribute | href.attribute

common.linking.attributes =
   (linkend.attribute | href.attribute)?

# ======================================================================

relation.attribute = attribute relation { text }?

linenumbering.attribute = attribute linenumbering { "numbered" | "unnumbered" }?

float.attribute = attribute float { text }
pgwide.attribute = attribute pgwide { "0" | "1" }

data.format.attribute = attribute format { text }?
data.fileref.attribute = attribute fileref { text }?
data.entityref.attribute = attribute entityref { xsd:ENTITY }?
data.common.attribute &=
   data.format.attribute,
   data.fileref.attribute,
   data.entityref.attribute

oo-language.attribute = attribute language { text }?

ctrl:other-attribute [ name="biblio.class.attrib"
                       enum-name="biblio.class-enum.attribute"
                       other-name="biblio.class-other.attributes" ]

biblio.class-enum.attribute =
   attribute class { "doi"
    | "isbn"
    | "issn"
    | "libraryofcongress"
    | "pubnumber"
    | "uri" }?

biblio.class-other.attributes =
   attribute class { "other" },
   attribute otherclass { xsd:NMTOKEN }

biblio.class.attrib = (biblio.class-enum.attribute | biblio.class-other.attributes)

significance.attribute = attribute significance { "normal" | "preferred" }
zone.attribute = attribute zone { xsd:IDREFS }
pagenum.attribute = attribute pagenum { text }
scope.attribute = attribute scope { "all" | "global" | "local" }

# ======================================================================

ubiq.inlines     = db.inlinemediaobject | db.anchor | db.indexterm | db.remark

text.replaceable = element replaceable { docbook.text }
text.phrase      = element phrase      { docbook.text }

docbook.text     = (text | ubiq.inlines | text.phrase | text.replaceable)*

# ======================================================================

inlines = text | ubiq.inlines | general.inlines | domain.inlines

blocks in para?
paraContent

general.inlines =
   publishing.inlines
 | product.inlines
 | bibliography.inlines
 | glossary.inlines
 | graphic.inlines
 | indexing.inlines
 | link.inlines

domain.inlines =
   technical.inlines
 | error.inlines
 | os.inlines
 | programming.inlines
 | markup.inlines
 | math.inlines
 | gui.inlines
 | keyboard.inlines

technical.inlines =
  db.replaceable | db.systemitem | db.option | db.optional

error.inlines =
  db.errorcode | db.errortext | db.errorname | db.errortype

oo.inlines = db.ooclass | db.ooexception | db.oointerface

# TEI: code, programlisting (x.data)

programming.inlines =
   db.function
 | db.parameter
 | db.varname
 | db.returnvalue
 | db.type
 | db.classname
 | db.exceptionname
 | db.interfacename
 | db.methodname
 | db.modifier
 | db.initializer
 | oo.inlines

# TEI: names

product.inlines =
   db.productnumber
 | db.productname
 | db.database
 | db.application
 | db.hardware
 | db.trademark

# TEI: data

os.inlines =
   db.prompt
 | db.envar
 | db.filename
 | db.command
 | db.computeroutput
 | db.userinput

# TEI: sgmlKeywords, ident

markup.inlines =
   db.xmltag
 | db.markup
 | db.token
 | db.symbol
 | db.literal
 | db.constant

# TEI: no class

bibliography.inlines =
   db.citation
 | db.citerefentry
 | db.citetitle
 | db.citebiblioid
 | db.author
 | db.personname
 | db.editor

# TEI: no class

glossary.inlines =
   db.firstterm
 | db.glossterm

# TEI: hqPhrase

publishing.inlines =
   db.abbrev
 | db.acronym
 | db.emphasis
 | db.footnote
 | db.footnoteref
 | db.foreignphrase
 | db.phrase
 | db.quote
 | db.subscript
 | db.superscript
 | db.wordasword

# TEI: formula

math.inlines = db.inlineequation

# TEI: figure

graphic.inlines = db.inlinemediaobject

# TEI: metadata

indexing.inlines = db.indexterm

# TEI: 

gui.inlines =
   db.guiicon
 | db.guibutton
 | db.guimenuitem
 | db.guimenu
 | db.guisubmenu
 | db.guilabel
 | db.menuchoice
 | db.mousebutton

keyboard.inlines =
   db.keycombo
 | db.keycap
 | db.keycode
 | db.keysym
 | db.shortcut
 | db.accel

link.inlines =
   db.xref
 | db.uri
 | db.anchor

# ======================================================================

blocks =
   list.blocks
 | admonition.blocks
 | para.blocks
 | formal.blocks
 | informal.blocks
 | publishing.blocks
 | graphic.blocks
 | technical.blocks
 | verbatim.blocks
 | synopsis.blocks
 | db.indexterm
 | db.bridgehead
 | db.remark

formal.blocks =
   db.equation
 | db.example
 | db.figure
 | db.table

informal.blocks =
   db.informalequation
 | db.informalexample
 | db.informalfigure
 | db.informaltable

publishing.blocks =
   db.sidebar
 | db.blockquote
 | db.address
 | db.epigraph

graphic.blocks = db.mediaobject | db.screenshot

technical.blocks = db.procedure

admonition.blocks =
   db.caution
 | db.important
 | db.note
 | db.tip
 | db.warning

list.blocks =
   db.itemizedlist
 | db.orderedlist
 | db.procedure
 | db.simplelist
 | db.variablelist

verbatim.blocks =
   db.programlisting
 | db.screen
 | db.literallayout
 | db.synopsis

synopsis.blocks =
   db.cmdsynopsis
 | db.funcsynopsis
 | db.classsynopsis
 | db.methodsynopsis
 | db.constructorsynopsis
 | db.destructorsynopsis
 | db.fieldsynopsis

# ======================================================================

db.title = element title { inlines* }

db.titleabbrev = element titleabbrev { inlines* }

db.subtitle = element subtitle { inlines* }

docbook.title = db.title? & db.titleabbrev? & db.subtitle?
docbook.titlereq = db.title & db.titleabbrev? & db.subtitle?

info.elements =
  db.biblioid
  | db.artpagenums
  | db.copyright
  | db.subjectset
  | db.keywordset
  | db.subjectset
  | db.keywordset
  | db.itermset
  | db.abstract
  | db.authorgroup
  | db.author
  | db.editor
  | db.othercredit
  | db.bibliocoverage
  | db.bibliomisc
  | db.bibliomset
  | db.bibliorelation
  | db.biblioset
  | db.collab
  | db.confgroup
  | db.date
  | db.pubdate
  | db.edition
  | db.volumenum
  | db.seriesvolnums
  | db.pagenums
  | db.legalnotice
  | db.publisher
  | db.releaseinfo
  | db.revhistory
  | db.printhistory

bibliographic.elements =
   info.elements
 | db.abbrev
 | db.title
 | db.titleabbrev
 | db.subtitle
 | db.citetitle
 | db.address
 | db.affiliation
 | db.personblurb
 | db.authorinitials
 | db.personname
 | db.orgname
 | db.productname
 | db.productnumber
 | db.publishername

db.biblioentry = element biblioentry { bibliographic.elements+ }

db.bibliomixed = element bibliomixed { (text | bibliographic.elements)* }

db.info = element info { docbook.title, info.elements* }
db.info.titlereq = element info { docbook.titlereq, info.elements* }
db.info.titleforbidden = element info { info.elements* }

docbook.info = (docbook.titlereq?, db.info.titleforbidden?) | db.info?
docbook.info.titlereq = (docbook.titlereq, db.info.titleforbidden?) | db.info.titlereq
docbook.info.titleforbidden = db.info.titleforbidden?

ctrl:alternate-define [
   name="docbook.title"
   rng:optional [
      rng:ref [ name = "db.title" ]
   ]
   rng:optional [
      rng:ref [ name = "db.titleabbrev" ]
   ]
   rng:optional [
      rng:ref [ name = "db.subtitle" ]
   ]
]

ctrl:alternate-define [
   name="docbook.titlereq"
   rng:ref [ name="db.title" ]
   rng:optional [
      rng:ref [ name = "db.titleabbrev" ]
   ]
   rng:optional [
      rng:ref [ name = "db.subtitle" ]
   ]
]

ctrl:alternate-define [
   name="db.info"
   rng:element [
      name="info"
      rng:zeroOrMore [
         rng:choice [
            rng:ref [ name = "docbook.title" ]
            rng:ref [ name = "info.elements" ]
         ]
      ]
   ]
]

ctrl:alternate-define [
   name = "docbook.info"
   rng:optional [
      rng:ref [ name = "db.info" ]
   ]
]

ctrl:alternate-define [
   name = "docbook.info.titlereq"
   rng:ref [ name = "docbook.titlereq" ]
   rng:optional [
      rng:ref [ name = "db.info" ]
   ]
]

ctrl:alternate-define [
   name = "docbook.info.titleforbidden"
   rng:optional [
      rng:ref [ name = "db.info" ]
   ]
]

biblioset.relation.attrib = relation.attribute
db.biblioset = element biblioset { bibliographic.elements+ }

bibliomset.relation.attrib = relation.attribute
db.bibliomset = element bibliomset { (docbook.text | bibliographic.elements)* }

db.bibliomisc = element bibliomisc { docbook.text }

subjectset.scheme.attrib = attribute scheme { text }?
db.subjectset = element subjectset { db.subject+ }

subject.weight.attrib = attribute weight { text }?
db.subject = element subject { db.subjectterm+ }

db.subjectterm = element subjectterm { docbook.text }

db.keywordset = element keywordset { db.keyword+ }

db.keyword = element keyword { docbook.text }

db.itermset = element itermset { db.indexterm+ }

task.info = docbook.info.titlereq

db.task = element task { task.info,
                         db.tasksummary?,
			 db.taskprerequisites?,
			 db.procedure,
			 db.example*,
			 db.taskrelated? }

tasksummary.info = docbook.info

db.tasksummary = element tasksummary { tasksummary.info, blocks+ }

taskprerequisites.info = docbook.info

db.taskprerequisites = element taskprerequisites { taskprerequisites.info, blocks+ }

taskrelated.info = docbook.info

db.taskrelated = element taskrelated { taskrelated.info, blocks+ }

qandaset.defaultlabel.attrib = attribute defaultlabel { "none" | "number" | "qanda" }?
qandaset.info = docbook.info
db.qandaset =
   element qandaset { qandaset.info, blocks*, (db.qandadiv | db.qandaentry)+ }

qandadiv.info = docbook.info
db.qandadiv =
   element qandadiv { qandadiv.info, blocks*, (db.qandadiv | db.qandaentry)+ }

qandaentry.info = docbook.info
db.qandaentry =
   element qandaentry { qandaentry.info, db.question, db.answer* }

db.question = element question { db.label?, blocks+ }

db.answer = element answer { db.label?, blocks+ }

db.label = element label { docbook.text }

table.choice = notAllowed
table.contentmodel = notAllowed

db.table = table.choice

informaltable.tabstyle.attrib = notAllowed?
informaltable.orient.attrib = notAllowed?
informaltable.colsep.attrib = notAllowed?
informaltable.rowsep.attrib = notAllowed?
informaltable.frame.attrib = notAllowed?
informaltable.pgwide.attrib = notAllowed?

informaltable.info = db.info.titleforbidden
db.informaltable = element informaltable { informaltable.info?, table.contentmodel }

procedure.info = docbook.info
db.procedure = element procedure { procedure.info, blocks*, db.step+ }

step.performance.attrib = attribute performance { "optional" | "required" }?

step.info = docbook.info
db.step = element step { step.info, blocks*, db.substeps?, blocks* }

substeps.performance.attrib = attribute performance { "optional" | "required" }?

db.substeps = element substeps { db.step+ }

sidebar.info = docbook.info

db.sidebar = element sidebar { sidebar.info, blocks+ }

abstract.info = docbook.info
db.abstract = element abstract { abstract.info, para.blocks+ }

personblurb.info = docbook.info
db.personblurb = element personblurb { personblurb.info, para.blocks+ }

blockquote.info = docbook.info
db.blockquote = element blockquote { blockquote.info, db.attribution?, blocks+ }

db.attribution = element attribution { (docbook.text | db.personname) }

db.bridgehead = element bridgehead { inlines* }

db.remark = element remark { docbook.text }

epigraph.info = docbook.info

db.epigraph =
   element epigraph {
      epigraph.info,
      db.attribution?,
      (para.blocks | db.literallayout)+
   }

db.footnote = element footnote { blocks* }

db.highlights = element highlights { blocks* }

para.blocks =
   db.para
 | db.formalpara
 | db.simpara

formalpara.info = docbook.info.titlereq
db.formalpara = element formalpara { formalpara.info, db.para }

para.info = docbook.info.titleforbidden
db.para = element para { para.info, (inlines | blocks)* }

simpara.info = docbook.info.titleforbidden
db.simpara = element simpara { simpara.info, inlines* }

# admonitions are not excluded from themselves
admonition.contentmodel = docbook.info, blocks+

db.caution = element caution { admonition.contentmodel }

db.important = element important { admonition.contentmodel }

db.note = element note { admonition.contentmodel }

db.tip = element tip { admonition.contentmodel }

db.warning = element warning { admonition.contentmodel }

db.glosslist = element glosslist { db.glossentry+ }

glossentry.sortas.attrib = sortas.attribute?
db.glossentry =
   element glossentry {
      db.glossterm,
      db.acronym?,
      db.abbrev?,
      (db.glosssee | db.glossdef+)
   }

glossdef.subject.attrib = attribute subject { text }?
db.glossdef = element glossdef { blocks+, db.glossseealso* }

glosssee.otherterm.attrib = attribute otherterm { xsd:IDREF }?
db.glosssee = element glosssee { inlines* }

glossseealso.otherterm.attrib = attribute otherterm { xsd:IDREF }?
db.glossseealso = element glossseealso { inlines* }

itemizedlist.mark.attrib = attribute mark { text }?
itemizedlist.spacing.attrib = attribute spacing { "compact" | "normal" }?

itemizedlist.info = docbook.info
db.itemizedlist = element itemizedlist { itemizedlist.info, blocks*, db.listitem+ }

orderedlist.inheritnum.attrib = attribute inheritnum { "ignore" | "inherit" }?
orderedlist.spacing.attrib = attribute spacing { "compact" | "normal" }?
orderedlist.continuation.attrib = attribute continuation { "continues" | "restarts" }?
orderedlist.numeration.attrib = attribute numeration { text }?

orderedlist.info = docbook.info
db.orderedlist = element orderedlist { orderedlist.info, blocks*, db.listitem+ }

listitem.override.attrib = attribute override { text }?
db.listitem = element listitem { blocks+ }

segmentedlist.info = docbook.info
db.segmentedlist = element segmentedlist { segmentedlist.info,
                                           db.segtitle+,
                                           db.seglistitem+ }

db.segtitle = element segtitle { inlines* }

db.seglistitem = element seglistitem { db.seg+ }

db.seg = element seg { (inlines | blocks)* }

simplelist.type.attrib = attribute type { "horiz" | "inline" | "vert" }?

db.simplelist = element simplelist { db.member+ }

db.member = element member { inlines* }

variablelist.termlength.attrib = attribute termlength { text }?
variablelist.info = db.info

db.variablelist = element variablelist { variablelist.info, blocks*, db.varlistentry+ }

db.varlistentry = element varlistentry { db.term+, db.listitem }

db.term = element term { inlines* }

example.info = db.info.titlereq
db.example = element example { example.info, blocks+ }

informalexample.info = db.info.titleforbidden
db.informalexample = element informalexample { informalexample.info, blocks+ }

verbatim.inlines = inlines | db.lineannotation

verbatim.contentmodel = docbook.info.titleforbidden, verbatim.inlines*

programlisting.linenumbering.attrib = linenumbering.attribute
db.programlisting = element programlisting { verbatim.contentmodel }

literallayout.linenumbering.attrib = linenumbering.attribute
literallayout.class.attrib = attribute class { "monospaced" | "normal" }
db.literallayout = element literallayout { verbatim.contentmodel }

screen.linenumbering.attrib = linenumbering.attribute
db.screen = element screen { verbatim.contentmodel }

screenshot.block = db.mediaobject

screenshot.info = docbook.info
db.screenshot =
   element screenshot { screenshot.info, screenshot.block }

figure.float.attrib = float.attribute?
figure.pgwide.attrib = pgwide.attribute?
figure.info = db.info.titlereq
db.figure = element figure { figure.info, blocks+ }

informalfigure.float.attrib = float.attribute?
informalfigure.pgwide.attrib = pgwide.attribute?
informalfigure.info = db.info.titleforbidden
db.informalfigure = element informalfigure { informalfigure.info, blocks+ }

mediaobject.info = db.info
db.mediaobject =
   element mediaobject {
      mediaobject.info,
      (db.videoobject | db.audioobject | db.imageobject | db.textobject)+
   }

inlinemediaobject.info = db.info
db.inlinemediaobject =
   element inlinemediaobject {
      inlinemediaobject.info,
      (db.videoobject | db.audioobject | db.imageobject | db.textobject)+
   }

videoobject.info = db.info
db.videoobject = element videoobject { videoobject.info, db.videodata }

audioobject.info = db.info
db.audioobject = element audioobject { audioobject.info, db.audiodata }

imageobject.info = db.info
db.imageobject = element imageobject { imageobject.info, db.imagedata }

textobject.info = db.info
db.textobject =
   element textobject { textobject.info, (db.phrase | db.textdata | blocks+) }

videodata.data.attrib = data.common.attribute
db.videodata = element videodata { db.info.titleforbidden? }

audiodata.data.attrib = data.common.attribute
db.audiodata = element audiodata { db.info.titleforbidden? }

imagedata.data.attrib = data.common.attribute
imagedata.align.attrib =
  attribute align { "center" | "char" | "justify" | "left" | "right" }?
imagedata.valign.attrib = attribute valign { "bottom" | "middle" | "top" }?
imagedata.width.attrib = attribute width { text }?
imagedata.contentwidth.attrib = attribute contentwidth { text }?
imagedata.scalefit.attrib = attribute scalefit { "0" | "1" }?
imagedata.depth.attrib = attribute depth { text }?
imagedata.contentdepth.attrib = attribute contentdepth { text }?

db.imagedata = element imagedata { db.info.titleforbidden? }

textdata.data.attrib = data.common.attribute
textdata.encoding.attrib = attribute encoding { text }?

db.textdata = element textdata { db.info.titleforbidden? }

db.caption = element caption { inlines* | blocks+ }

equation.content = db.mediaobject

equation.info = docbook.info.titlereq
db.equation = element equation { equation.info, equation.content+ }

informalequation.info = db.info.titleforbidden

db.informalequation =
   element informalequation {
      informalequation.info,
      equation.content+
   }

inlineequation.content = db.inlinemediaobject

db.inlineequation = element inlineequation { inlineequation.content+ }

db.alt = element alt { text }

synopsis.linenumbering.attrib = linenumbering.attribute
db.synopsis = element synopsis { verbatim.contentmodel }

cmdsynopsis.sepchar.attrib = attribute sepchar { text }?
cmdsynopsis.cmdlength.attrib = attribute cmdlength { text }?

cmdsynopsis.info = db.info
db.cmdsynopsis =
   element cmdsynopsis {
      cmdsynopsis.info,
      (db.command | db.arg | db.group | db.sbr)+,
      db.synopfragment*
   }

rep.attribute = attribute rep { "norepeat" | "repeat" }
choice.attribute = attribute choice { "opt" | "plain" | "req" }

arg.rep.attrib = rep.attribute
arg.choice.attrib = choice.attribute

db.arg =
   element arg {
      (docbook.text
       | db.arg
       | db.group
       | db.option
       | db.synopfragmentref
       | db.sbr)*
   }


group.rep.attrib = rep.attribute
group.choice.attrib = choice.attribute

db.group =
   element group {
      (db.arg | db.group | db.option | db.synopfragmentref | db.sbr)+
   }

db.sbr = element sbr { empty }

ctrl:common-attributes [ element="synopfragment" attributes="common.attrib.idreq" ]

db.synopfragment = element synopfragment { (db.arg | db.group)+ }

synopfragmentref.linkend.attrib = linkend.attribute
db.synopfragmentref = element synopfragmentref { docbook.text }

funcsynopsis.info = db.info
db.funcsynopsis =
   element funcsynopsis {
      funcsynopsis.info,
      (db.funcsynopsisinfo | db.funcprototype)+
   }

funcsynopsisinfo.linenumbering.attrib = linenumbering.attribute
db.funcsynopsisinfo = element funcsynopsisinfo { verbatim.contentmodel }

db.funcprototype =
   element funcprototype {
      db.funcdef,
      (db.void | db.varargs | db.paramdef+)
   }

db.funcdef = element funcdef { (docbook.text | db.type | db.function)* }

db.void = element void { empty }

db.varargs = element varargs { empty }

db.paramdef =
   element paramdef { (docbook.text | db.type | db.parameter | db.funcparams)* }

db.funcparams = element funcparams { inlines* }

oo-method.synopsis.blocks =
  db.methodsynopsis | db.constructorsynopsis | db.destructorsynopsis

oo-field.synopsis.blocks = db.fieldsynopsis

classsynopsis.language.attrib = oo-language.attribute
classsynopsis.class.attrib = attribute class { "class" | "interface" }
db.classsynopsis =
   element classsynopsis {
      oo.inlines+,
      (db.classsynopsisinfo
       | oo-method.synopsis.blocks
       | oo-field.synopsis.blocks)*
   }

classsynopsisinfo.linenumbering.attrib = linenumbering.attribute
db.classsynopsisinfo = element classsynopsisinfo { verbatim.contentmodel }

db.ooclass = element ooclass { db.modifier*, db.classname }

db.oointerface = element oointerface { db.modifier*, db.interfacename }

db.ooexception = element ooexception {db.modifier*, db.exceptionname  }

db.modifier = element modifier { docbook.text }

db.interfacename = element interfacename { docbook.text }

db.exceptionname = element exceptionname { docbook.text }

fieldsynopsis.language.attrib = oo-language.attribute
db.fieldsynopsis =
   element fieldsynopsis {
      db.modifier*,
      db.type?,
      db.varname,
      db.initializer?
   }

db.initializer = element initializer { docbook.text }

constructorsynopsis.language.attrib = oo-language.attribute
db.constructorsynopsis =
   element constructorsynopsis {
      db.modifier*,
      db.methodname?,
      (db.methodparam+ | db.void),
      db.exceptionname*,
      db.modifier*
   }

destructorsynopsis.language.attrib = oo-language.attribute
db.destructorsynopsis =
   element destructorsynopsis {
      db.modifier*,
      db.methodname?,
      (db.methodparam+ | db.void),
      db.exceptionname*,
      db.modifier*
   }

methodsynopsis.language.attrib = oo-language.attribute
db.methodsynopsis =
   element methodsynopsis {
      db.modifier*,
      (db.type | db.void)?,
      db.methodname,
      (db.methodparam+ | db.void),
      db.exceptionname*,
      db.modifier*
   }

db.methodname = element methodname { docbook.text }

methodparam.rep.attrib = rep.attribute
methodparam.choice.attrib = choice.attribute

db.methodparam =
   element methodparam {
      db.modifier*,
      db.type?,
      ((db.parameter, db.initializer?) | db.funcparams),
      db.modifier*
   }

db.ackno = element ackno { inlines* }

# TEI: addrPart

address.linenumbering.attrib = linenumbering.attribute
db.address =
   element address {
      (docbook.text
       | db.personname
       | db.pob
       | db.street
       | db.city
       | db.state
       | db.postcode
       | db.country
       | db.phone
       | db.fax
       | db.email)*
   }

db.street = element street { docbook.text }
db.pob = element pob { docbook.text }
db.postcode = element postcode { docbook.text }
db.city = element city { docbook.text }
db.state = element state { docbook.text }
db.country = element country { docbook.text }
db.phone = element phone { docbook.text }
db.fax = element fax { docbook.text }

db.affiliation =
   element affiliation {
      db.shortaffil?,
      db.jobtitle*,
      db.orgname?,
      db.orgdiv?,
      db.address*
   }

db.shortaffil = element shortaffil { inlines* }

db.jobtitle = element jobtitle { docbook.text }

orgname.class.attrib =
   attribute class {
      "consortium"
    | "corporation"
    | "informal"
    | "nonprofit"
    | "other"
   }?

db.orgname = element orgname { inlines* }

db.orgdiv = element orgdiv { inlines* }

db.artpagenums = element artpagenums { docbook.text }

db.personname =
   element personname {
      (docbook.text
       | (db.honorific
        | db.firstname
        | db.surname
        | db.lineage
        | db.othername)+)
   }

person.author =
   db.personname,
   (db.personblurb
    | db.affiliation
    | db.email
    | db.address
    | db.contrib)*

org.author =
   db.orgname,
   (db.orgdiv
    | db.affiliation
    | db.email
    | db.address
    | db.contrib)*

credit.contentmodel = person.author | org.author

db.author = element author { credit.contentmodel }

db.authorgroup = element authorgroup { (db.author | db.editor | db.othercredit)+ }

db.collab = element collab { (db.personname | db.orgname)+, db.affiliation* }

db.authorinitials = element authorinitials { docbook.text }

db.confgroup =
   element confgroup {
      (db.confdates
       | db.conftitle
       | db.confnum
       | db.confsponsor
       | db.address)*
   }

db.confdates = element confdates { docbook.text }

db.conftitle = element conftitle { inlines* }

db.confnum = element confnum { docbook.text }

db.confsponsor = element confsponsor { inlines* }

db.contractnum = element contractnum { inlines* }

db.contractsponsor = element contractsponsor { inlines* }

db.copyright = element copyright { db.year+, db.holder* }

db.year = element year { docbook.text }

db.holder = element holder { docbook.text }

db.date = element date { docbook.text }

db.edition = element edition { docbook.text }

db.editor = element editor { credit.contentmodel }

biblioid.class.attrib = biblio.class.attrib
db.biblioid = element biblioid { docbook.text }

citebiblioid.class.attrib = biblio.class.attrib
db.citebiblioid =
   element citebiblioid { docbook.text }

bibliosource.class.attrib = biblio.class.attrib
db.bibliosource = element bibliosource { docbook.text }

bibliorelation.class.attrib = biblio.class.attrib

ctrl:other-attribute [ name="bibliorelation.type.attrib"
                       enum-name="bibliorelation.type-enum.attribute"
                       other-name="bibliorelation.type-other.attributes" ]

bibliorelation.type-enum.attribute =
   attribute type { "hasformat"
    | "haspart"
    | "hasversion"
    | "isformatof"
    | "ispartof"
    | "isreferencedby"
    | "isreplacedby"
    | "isrequiredby"
    | "isversionof"
    | "othertype"
    | "references"
    | "replaces"
    | "requires" }?

bibliorelation.type-other.attributes =
   attribute type { "othertype" },
   attribute othertype { xsd:NMTOKEN }

bibliorelation.type.attrib =
   (bibliorelation.type-enum.attribute | bibliorelation.type-other.attributes)

db.bibliorelation = element bibliorelation { docbook.text }

ctrl:other-attribute [ name="bibliocoverage.spatial.attrib"
                       enum-name="bibliocoverage.spatial-enum.attribute"
                       other-name="bibliocoverage.spatial-other.attributes" ]

bibliocoverage.spatial-enum.attribute =
   attribute spatial {
      "dcmipoint" | "iso3166" | "dcmibox" | "tgn"
   }?

bibliocoverage.spatial-other.attributes =
   attribute spatial { "otherspatial" },
   attribute otherspacial { xsd:NMTOKEN }

bibliocoverage.spatial.attrib =
   (bibliocoverage.spatial-enum.attribute | bibliocoverage.spatial-other.attributes)

ctrl:other-attribute [ name="bibliocoverage.temporal.attrib"
                       enum-name="bibliocoverage.temporal-enum.attribute"
                       other-name="bibliocoverage.temporal-other.attributes" ]

bibliocoverage.temporal-enum.attribute =
   attribute temporal {
      "dcmiperiod" | "w3c-dtf"
   }?

bibliocoverage.temporal-other.attributes =
   attribute temporal { "othertemporal" },
   attribute othertemporal { xsd:NMTOKEN }

bibliocoverage.temporal.attrib =
   (bibliocoverage.temporal-enum.attribute | bibliocoverage.temporal-other.attributes)

db.bibliocoverage = element bibliocoverage { docbook.text }

legalnotice.info = docbook.info
db.legalnotice = element legalnotice { legalnotice.info, blocks+ }

db.othercredit = element othercredit { credit.contentmodel }

db.pagenums = element pagenums { docbook.text }

db.contrib = element contrib { docbook.text }

db.honorific = element honorific { docbook.text }

db.firstname = element firstname { docbook.text }

db.surname = element surname { docbook.text }

db.lineage = element lineage { docbook.text }

db.othername = element othername { docbook.text }

db.printhistory = element printhistory { para.blocks+ }

db.productname = element productname { docbook.text }

db.productnumber = element productnumber { docbook.text }

db.pubdate = element pubdate { docbook.text }

db.publisher = element publisher { (docbook.text | (db.publishername, db.address*)) }

db.publishername = element publishername { docbook.text }

db.releaseinfo = element releaseinfo { docbook.text }

revhistory.info = docbook.info
db.revhistory = element revhistory { revhistory.info, db.revision+ }

db.revision =
   element revision {
      db.revnumber,
      db.date,
      (db.authorinitials | db.author)*,
      (db.revremark | db.revdescription)?
   }

db.revnumber = element revnumber { docbook.text }

db.revremark = element revremark { inlines* }

db.revdescription = element revdescription { blocks* }

db.seriesvolnums = element seriesvolnums { docbook.text }

db.volumenum = element volumenum { docbook.text }

db.accel  = element accel { docbook.text }

application.class.attrib = attribute class { "hardware" | "software" }?
db.application = element application { docbook.text }

db.classname = element classname { docbook.text }

db.command = element command { inlines* }

computeroutput.inlines = inlines

db.computeroutput = element computeroutput { computeroutput.inlines* }

database.class.attrib =
   attribute class {
      "field" | "key1" | "key2" | "name" | "record" | "table"
   }?
db.database = element database { docbook.text }

db.email = element email { docbook.text }

db.envar = element envar { docbook.text }

db.errorcode = element errorcode { docbook.text }

db.errorname = element errorname { docbook.text }

db.errortext = element errortext { inlines* }

db.errortype = element errortype { docbook.text }

filename.path.attrib = attribute path { text }?
filename.class.attrib =
   attribute class {
      "devicefile"
    | "directory"
    | "extension"
    | "headerfile"
    | "libraryfile"
    | "partition"
    | "symlink"
   }?
db.filename = element filename { docbook.text }

db.function = element function { docbook.text }

db.guibutton = element guibutton { docbook.text }

db.guiicon = element guiicon { docbook.text }

db.guilabel = element guilabel { docbook.text }

db.guimenu = element guimenu { docbook.text }

db.guimenuitem =  element guimenuitem { docbook.text }

db.guisubmenu = element guisubmenu { docbook.text }

db.hardware = element hardware { docbook.text }

db.keycap = element keycap { docbook.text }

db.keycode = element keycode { docbook.text }

ctrl:other-attribute [ name="keycombo.action.attrib"
                       enum-name="keycombo.action-enum.attribute"
                       other-name="keycombo.action-other.attributes" ]

keycombo.action-enum.attribute =
  attribute action {
    "click" | "double-click" | "press" | "seq" | "simul"
  }?

keycombo.action-other.attributes =
   attribute action { "other" },
   attribute otheraction { xsd:NMTOKEN }

keycombo.action.attrib =
   (keycombo.action-enum.attribute | keycombo.action-other.attributes)

db.keycombo = element keycombo { docbook.text }

db.keysym = element keysym { docbook.text }

db.lineannotation = element lineannotation { inlines* }

db.literal = element literal { inlines* }

db.constant = element constant { docbook.text }

db.varname = element varname { docbook.text }

db.markup = element markup { docbook.text }

db.menuchoice = element menuchoice { docbook.text }

shortcut.action.attrib = keycombo.action.attrib

db.shortcut = element shortcut { docbook.text }

db.mousebutton = element mousebutton { docbook.text }

db.option = element option { docbook.text }

db.optional = element optional { inlines* }

parameter.class.attrib = attribute class { "command" | "function" | "option" }?
db.parameter = element parameter { docbook.text }

prompt.inlines = docbook.text

db.prompt = element prompt { prompt.inlines* }

db.replaceable = element replaceable { docbook.text }

db.returnvalue = element returnvalue { docbook.text }

xmltag.class.attrib =
  attribute class {
    "attribute"
    | "attvalue"
    | "element"
    | "emptytag"
    | "endtag"
    | "genentity"
    | "numcharref"
    | "paramentity"
    | "pi"
    | "sgmlcomment"
    | "starttag"
    | "xmlpi"
  }?
db.xmltag = element xmltag { docbook.text }

db.symbol = element symbol { docbook.text }

systemitem.class.attrib =
   attribute class {
      "domainname"
    | "etheraddress"
    | "event"
    | "eventhandler"
    | "filesystem"
    | "fqdomainname"
    | "groupname"
    | "ipaddress"
    | "library"
    | "macro"
    | "netmask"
    | "newsgroup"
    | "osname"
    | "resource"
    | "systemname"
    | "username"
  }?

systemitem.inlines = docbook.text

db.systemitem = element systemitem { systemitem.inlines* }

db.uri = element uri { docbook.text }

db.token = element token { docbook.text }

db.type = element type { docbook.text }

db.userinput = element userinput { inlines* }

db.abbrev = element abbrev { docbook.text }

db.acronym = element acronym { docbook.text }

db.citation = element citation { docbook.text }

db.citerefentry = element citerefentry { db.refentrytitle, db.manvolnum? }

db.refentrytitle = element refentrytitle { inlines* }

db.manvolnum = element manvolnum { docbook.text }

citetitle.pubwork.attrib =
   attribute pubwork {
      "article"
    | "book"
    | "chapter"
    | "journal"
    | "manuscript"
    | "part"
    | "refentry"
    | "section"
    | "series"
    | "set"
   }?

db.citetitle = element citetitle { inlines* }

db.emphasis = element emphasis { inlines* }

firstterm.baseform.attrib = glossterm.baseform.attrib
db.firstterm = element firstterm { docbook.text }

db.foreignphrase = element foreignphrase { inlines* }

glossterm.baseform.attrib = attribute baseform { text }?
db.glossterm = element glossterm { docbook.text }

db.phrase = element phrase { inlines* }

db.quote = element quote { inlines* }

db.subscript = element subscript { docbook.text }

db.superscript = element superscript { docbook.text }

trademark.class.attrib =
   attribute class { "copyright" | "registered" | "service" | "trade" }?

db.trademark = element trademark { docbook.text }

db.wordasword = element wordasword { docbook.text }

db.footnoteref = element footnoteref { empty }

ctrl:common-linking [ element="xref" attributes="common.linking.attributes.req" ]

xref.xrefstyle.attrib = attribute xrefstyle { text }
db.xref = element xref { empty }

db.uri = element uri { docbook.text }

ctrl:common-linking [ element="anchor" suppress="yes" ]

db.anchor = element anchor { empty }

indexterm.singular.significance.attrib = significance.attribute?
indexterm.startofrange.significance.attrib = significance.attribute?
indexterm.endofrange.significance.attrib = significance.attribute?

indexterm.singular.zone.attrib = zone.attribute?
indexterm.startofrange.zone.attrib = zone.attribute?
indexterm.endofrange.zone.attrib = zone.attribute?

indexterm.singular.pagenum.attrib = pagenum.attribute?
indexterm.startofrange.pagenum.attrib =  pagenum.attribute?
indexterm.endofrange.pagenum.attrib =  pagenum.attribute?

indexterm.singular.scope.attrib = scope.attribute?
indexterm.startofrange.scope.attrib = scope.attribute?
indexterm.endofrange.scope.attrib = scope.attribute?

indexterm.singular.class.attrib = attribute class { "singular" }?
indexterm.startofrange.class.attrib = attribute class { "startofrange" }
indexterm.endofrange.class.attrib = attribute class { "endofrange" }

indexterm.endofrange.startref.attrib = attribute startref { xsd:IDREF }?

indexterm.contentmodel =
   db.primary?,
   ((db.secondary,
      ((db.tertiary, (db.see | db.seealso+)?)
       | db.see
       | db.seealso+)?)
    | db.see
    | db.seealso+)?

indexterm.singular =
   element indexterm {
      indexterm.contentmodel
   }

indexterm.startofrange =
   element indexterm {
      indexterm.contentmodel
   }

indexterm.endofrange =
   element indexterm {
      indexterm.contentmodel
   }

db.indexterm = (indexterm.singular|indexterm.startofrange|indexterm.endofrange)

sortas.attribute = attribute sortas { text }?

primary.sortas.attrib = sortas.attribute?
db.primary = element primary { inlines* }

secondary.sortas.attrib = sortas.attribute?
db.secondary = element secondary { inlines* }

tertiary.sortas.attrib = sortas.attribute?
db.tertiary = element tertiary { inlines* }

db.see = element see { inlines* }

db.seealso = element seealso { inlines* }

Last recorded change to this page: 2007-09-16  •  For corrections or updates, contact webmaster AT tei-c DOT org