# revised DTD for the RFC document series, draft of 2008-03-06 # Typical invocation: # # or # # Contents # # Character entities # # DTD data types # # The top-level # # Front matter # # The Body # # Back matter # Character entities # DTD data types: # # entity description # ====== =============================================== # NUMBER [0-9]+ # NUMBERS a comma-separated list of NUMBER # # DAY the day of the month, e.g., "1" # MONTH the month of the year, e.g., "January" # YEAR a four-digit year, e.g., "1999" # # URI e.g., "http://invisible.net/" # # ATEXT/CTEXT printable ASCII text (no line-terminators) # # TEXT character data namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" NUMBER = string NUMBERS = string DAY = string MONTH = string YEAR = string URI = string ATEXT = string CTEXT = text TEXT = text # The top-level # attributes for the "rfc" element are supplied by the RFC # editor. when preparing drafts, authors should leave them blank. # # the "seriesNo" attribute is used if the category is, e.g., BCP. rfc = element rfc { attlist.rfc, front, middle, back? } attlist.rfc &= attribute number { NUMBER }?, [ a:defaultValue = "" ] attribute obsoletes { NUMBERS }?, [ a:defaultValue = "" ] attribute updates { NUMBERS }?, attribute category { "std" | "bcp" | "info" | "exp" | "historic" }?, attribute seriesNo { NUMBER }?, attribute ipr { "full2026" | "noDerivativeWorks2026" | "none" | "full3667" | "noModification3667" | "noDerivatives3667" | "full3978" | "noModification3978" | "noDerivatives3978" | "trust200811" | "noModificationTrust200811" | "noDerivativesTrust200811" | "trust200902" | "noModificationTrust200902" | "noDerivativesTrust200902" | "pre5378Trust200902" }?, attribute iprExtract { xsd:IDREF }?, [ a:defaultValue = "IETF" ] attribute submissionType { "IETF" | "independent" }?, attribute docName { ATEXT }?, [ a:defaultValue = "en" ] attribute xml:lang { ATEXT }? # Front matter front = element front { attlist.front, title, author+, date, area*, workgroup*, keyword*, abstract?, note* } attlist.front &= empty # the "abbrev" attribute is used for headers, etc. title = element title { attlist.title, CTEXT } attlist.title &= attribute abbrev { ATEXT }? author = element author { attlist.author, organization, address? } attlist.author &= attribute initials { ATEXT }?, attribute surname { ATEXT }?, attribute fullname { ATEXT }?, attribute role { "editor" }? organization = element organization { attlist.organization, CTEXT } attlist.organization &= attribute abbrev { ATEXT }? address = element address { attlist.address, postal?, phone?, facsimile?, email?, uri? } attlist.address &= empty # this content model should be more strict: # at most one of each the city, region, code, and country # elements may be present postal = element postal { attlist.postal, street+, (city | region | code | country)* } attlist.postal &= empty street = element street { attlist.street, CTEXT } attlist.street &= empty city = element city { attlist.city, CTEXT } attlist.city &= empty region = element region { attlist.region, CTEXT } attlist.region &= empty code = element code { attlist.code, CTEXT } attlist.code &= empty country = element country { attlist.country, CTEXT } attlist.country &= empty phone = element phone { attlist.phone, CTEXT } attlist.phone &= empty facsimile = element facsimile { attlist.facsimile, CTEXT } attlist.facsimile &= empty email = element email { attlist.email, CTEXT } attlist.email &= empty uri = element uri { attlist.uri, CTEXT } attlist.uri &= empty date = element date { attlist.date, empty } attlist.date &= attribute day { DAY }?, attribute month { MONTH }?, attribute year { YEAR }? # meta-data... area = element area { attlist.area, CTEXT } attlist.area &= empty workgroup = element workgroup { attlist.workgroup, CTEXT } attlist.workgroup &= empty keyword = element keyword { attlist.keyword, CTEXT } attlist.keyword &= empty abstract = element abstract { attlist.abstract, t+ } attlist.abstract &= empty note = element note { attlist.note, t+ } attlist.note &= attribute title { ATEXT } # The body middle = element middle { attlist.middle, section+ } attlist.middle &= empty section = element section { attlist.section, (t | figure | texttable | iref)*, section* } attlist.section &= attribute anchor { xsd:ID }?, attribute title { ATEXT }, [ a:defaultValue = "default" ] attribute toc { "include" | "exclude" | "default" }? # use of is deprecated... # # # use of
is deprecated... t = element t { attlist.t, (TEXT | \list | figure | xref | eref | iref | cref | spanx | vspace)* } attlist.t &= attribute anchor { xsd:ID }?, attribute hangText { ATEXT }? # the value of the style attribute is inherited from the closest # parent \list = element list { attlist.list, t+ } attlist.list &= attribute style { ATEXT }?, attribute hangIndent { NUMBER }?, attribute counter { ATEXT }? xref = element xref { attlist.xref, CTEXT } attlist.xref &= attribute target { xsd:IDREF }, [ a:defaultValue = "false" ] attribute pageno { "true" | "false" }?, [ a:defaultValue = "default" ] attribute format { "counter" | "title" | "none" | "default" }? eref = element eref { attlist.eref, CTEXT } attlist.eref &= attribute target { URI } iref = element iref { attlist.iref, empty } attlist.iref &= attribute item { ATEXT }, [ a:defaultValue = "" ] attribute subitem { ATEXT }?, [ a:defaultValue = "false" ] attribute primary { "true" | "false" }? cref = element cref { attlist.cref, CTEXT } attlist.cref &= attribute anchor { xsd:ID }?, attribute source { ATEXT }? spanx = element spanx { attlist.spanx, CTEXT } attlist.spanx &= [ a:defaultValue = "preserve" ] attribute xml:space { "default" | "preserve" }?, [ a:defaultValue = "emph" ] attribute style { ATEXT }? vspace = element vspace { attlist.vspace, empty } attlist.vspace &= [ a:defaultValue = "0" ] attribute blankLines { NUMBER }? figure = element figure { attlist.figure, iref*, preamble?, artwork, postamble? } attlist.figure &= attribute anchor { xsd:ID }?, [ a:defaultValue = "" ] attribute title { ATEXT }?, [ a:defaultValue = "false" ] attribute suppress-title { "true" | "false" }?, attribute src { URI }?, [ a:defaultValue = "left" ] attribute align { "left" | "center" | "right" }?, [ a:defaultValue = "" ] attribute alt { ATEXT }?, [ a:defaultValue = "" ] attribute width { ATEXT }?, [ a:defaultValue = "" ] attribute height { ATEXT }? preamble = element preamble { attlist.preamble, (TEXT | xref | eref | iref | cref | spanx)* } attlist.preamble &= empty artwork = element artwork { attlist.artwork, TEXT* } attlist.artwork &= [ a:defaultValue = "preserve" ] attribute xml:space { "default" | "preserve" }?, [ a:defaultValue = "" ] attribute name { ATEXT }?, [ a:defaultValue = "" ] attribute type { ATEXT }?, attribute src { URI }?, [ a:defaultValue = "left" ] attribute align { "left" | "center" | "right" }?, [ a:defaultValue = "" ] attribute alt { ATEXT }?, [ a:defaultValue = "" ] attribute width { ATEXT }?, [ a:defaultValue = "" ] attribute height { ATEXT }? postamble = element postamble { attlist.postamble, (TEXT | xref | eref | iref | cref | spanx)* } attlist.postamble &= empty texttable = element texttable { attlist.texttable, preamble?, ttcol+, c*, postamble? } attlist.texttable &= attribute anchor { xsd:ID }?, [ a:defaultValue = "" ] attribute title { ATEXT }?, [ a:defaultValue = "false" ] attribute suppress-title { "true" | "false" }?, [ a:defaultValue = "center" ] attribute align { "left" | "center" | "right" }?, [ a:defaultValue = "full" ] attribute style { "all" | "none" | "headers" | "full" }? ttcol = element ttcol { attlist.ttcol, CTEXT } attlist.ttcol &= attribute width { ATEXT }?, [ a:defaultValue = "left" ] attribute align { "left" | "center" | "right" }? c = element c { attlist.c, (TEXT | xref | eref | iref | cref | spanx)* } attlist.c &= empty # Back matter # sections, if present, are appendices back = element back { attlist.back, references*, section* } attlist.back &= empty references = element references { attlist.references, reference+ } attlist.references &= [ a:defaultValue = "References" ] attribute title { ATEXT }? reference = element reference { attlist.reference, front, seriesInfo*, format*, annotation* } attlist.reference &= attribute anchor { xsd:ID }?, attribute target { URI }? seriesInfo = element seriesInfo { attlist.seriesInfo, empty } attlist.seriesInfo &= attribute name { ATEXT }, attribute value { ATEXT } format = element format { attlist.format, empty } attlist.format &= attribute target { URI }?, attribute type { ATEXT }, attribute octets { NUMBER }? annotation = element annotation { attlist.annotation, (TEXT | xref | eref | iref | cref | spanx)* } attlist.annotation &= empty start = rfc