# ...............................................................

# XML specification DTD .........................................

# ...............................................................

# $Id$

# TYPICAL INVOCATION:
# #  <!DOCTYPE spec PUBLIC
# #       "-//W3C//DTD Specification V2.10//EN"
# #       "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd">
# 
# PURPOSE:
#   This XML DTD is for W3C specifications and other technical reports.
#   It is based in part on the TEI Lite and Sweb DTDs.
# 
# COPYRIGHT:
# 
#   Copyright (C) 2000, 2001, 2002, 2003 Sun Microsystems, Inc. All Rights Reserved.
#   This document is governed by the W3C Software License[3] as
#   described in the FAQ[4].
# 
#     [1] http://www.w3.org/TR/xslt
#     [2] http://www.w3.org/XML/1998/06/xmlspec-report-v21.htm
#     [3] http://www.w3.org/Consortium/Legal/copyright-software-19980720
#     [4] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
# 
# DEPENDENCIES:
#   None.
# 
# CHANGE HISTORY:
#   The list of historical changes is at the end of the DTD. For recent changes,
#   see the CVS log.
# 
#   For all details, see the design report at:
# 
#   <http://www.w3.org/XML/1998/06/xmlspec-report-v21.htm>
# 
#   This report is now out-of-date, but no more recent report has been prepared.
# 
# #2003-06-25: nwalsh: Added translationloc, preverrataloc, rfc2119
# 
# #2003-05-28: nwalsh: Added errataloc, fixed IE bug. Added @num to prod.
# 
#              Published V2.4
# 
# #2003-03-12: nwalsh: Added local.* PEs to a number of additional
#              places to make customization layers easier.
# 
#              Published V2.3
# 
# #2002-09-04: nwalsh: Added 'phrase' to title, subtitle, version,
#              w3c-designation, w3c-doctype, day, month, year, name,
#              affiliation, email, language, role, lhs, rhs, com,
#              typename, date, loc, nt, sub, sup, term, termref,
#              titleref, xnt, xspecref, xtermref
# 
#              This is *solely* to support automated diffing. Users
#              are explicitly forbidden from using this as an escape
#              hatch to get extra markup in these contexts.
# 
# #2001-10-08: nwalsh: Added local.arg.att and local.proto.att
# 
# #2002-08-14: nwalsh: Published V2.2
# 
#   Added marked sections around element and attlist declarations and
#   added the altlocs element
# 
# MAINTAINERS:
#   Norman Walsh
#   Sun Microsystems, Inc.
#   Norman.Walsh@Sun.COM
#   voice: +1 413 256 6985
#   fax:   +1 413 256 6985
# 
#   Eve Maler
#   Sun Microsystems, Inc.
#   elm@east.sun.com
#   voice: +1 781 442 3190
#   fax:   +1 781 442 1437

# ...............................................................

# Entities for characters and symbols ...........................

# ...............................................................

# #1998-03-10: maler: Added &ldquo; and &rdquo;.
# #                   Used 8879:1986-compatible decimal character
# #                   references.
# #                   Merged charent.mod file back into main file.
# #1998-05-14: maler: Fixed ldquo and rdquo.  Gave mdash a real number.
# #1998-12-03: maler: Escaped the leading ampersands.

# ...............................................................

# Entities for classes of standalone elements ...................

# ...............................................................

# #1997-10-16: maler: Added table to %illus.class;.
# #1997-11-28: maler: Added htable to %illus.class;.
# #1997-12-29: maler: IGNOREd table.
# #1998-03-10: maler: Removed SGML Open-specific %illus.class;.
# #                   Added "local" entities for customization.
# #1998-05-14: maler: Added issue to %note.class;.
# #                   Removed %[local.]statusp.class;.
# #1998-05-21: maler: Added constraintnote to %note.class;.
# #1998-08-22: maler: Changed htable to table in %illus.class;.
# #                   Added definitions to %illus.class;.
# #2000-03-07: maler: Added proto and example to %illus.class;.

namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
namespace xlink = "http://www.w3.org/1999/xlink"

local.p.class = notAllowed
p.class = p | local.p.class
local.list.class = notAllowed
list.class = ulist | olist | slist | glist | local.list.class
local.speclist.class = notAllowed
speclist.class = orglist | blist | local.speclist.class
local.note.class = notAllowed
note.class =
  note | issue | wfcnote | vcnote | constraintnote | local.note.class
local.illus.class = notAllowed
illus.class =
  eg
  | graphic
  | scrap
  | table
  | definitions
  | proto
  | example
  | local.illus.class
# ...............................................................

# Entities for classes of phrase-level elements .................

# ...............................................................

# #1997-12-29: maler: Added xspecref to %ref.class;.
# #1998-03-10: maler: Added %ednote.class;.
# #                   Added "local" entities for customization.
# #2000-03-07: maler: Added function, var, el, att, and attval to
# #                   %tech.class;.
# #                   Added sub, sup, and phrase to %emph.class;.
local.annot.class = notAllowed
annot.class = footnote | local.annot.class
local.termdef.class = notAllowed
termdef.class = termdef | term | local.termdef.class
local.emph.class = notAllowed
emph.class =
  emph | phrase | rfc2119 | quote | sub | sup | local.emph.class
local.ref.class = notAllowed
ref.class =
  bibref
  | specref
  | termref
  | titleref
  | xspecref
  | xtermref
  | local.ref.class
local.loc.class = notAllowed
loc.class = loc | local.loc.class
local.tech.class = notAllowed
tech.class =
  kw
  | nt
  | xnt
  | code
  | function
  | var
  | el
  | att
  | attval
  | local.tech.class
local.ednote.class = notAllowed
ednote.class = ednote | local.ednote.class
# ...............................................................

# Entities for mixtures of standalone elements ..................

# ...............................................................

# #1997-09-30: maler: Created %p.mix; to eliminate p from self.
# #1997-09-30: maler: Added %speclist.class; to %obj.mix; and %p.mix;.
# #1997-09-30: maler: Added %note.class; to %obj.mix; and %p.mix;.
# #1997-10-16: maler: Created %entry.mix;.  Note that some elements
# #                   left out here are still allowed in termdef,
# #                   which entry can contain through %p.pcd.mix;.
# #1997-11-28: maler: Added %p.class; to %statusobj.mix;.
# #1998-03-10: maler: Added %ednote.class; to all mixtures, except
# #                   %p.mix; and %statusobj.mix;, because paragraphs
# #                   and status paragraphs will contain ednote
# #                   through %p.pcd.mix;.
# #1998-03-23: maler: Added %termdef.mix; (broken out from
# #                    %termdef.pcd.mix;).
# #1998-05-14: maler: Removed %statusobj.mix; and all mentions of
# #                   %statusp.mix;.
local.div.mix = notAllowed
# compensate for IE bug; suggested by ht
div.mix =
  p.class
  | list.class
  | speclist.class
  | note.class
  | illus.class
  | ednote.class
  | local.div.mix
local.obj.mix = notAllowed
# compensate for IE bug; suggested by ht
obj.mix =
  p.class
  | list.class
  | speclist.class
  | note.class
  | illus.class
  | ednote.class
  | local.obj.mix
local.p.mix = notAllowed
# compensate for IE bug; suggested by ht
p.mix =
  list.class | speclist.class | note.class | illus.class | local.p.mix
# compensate for IE bug; suggested by ht
local.hdr.mix = notAllowed
# compensate for IE bug; suggested by ht
hdr.mix = p.class | list.class | ednote.class | local.hdr.mix
local.termdef.mix = notAllowed
# compensate for IE bug; suggested by ht
termdef.mix = note.class | illus.class | local.termdef.mix
# ...............................................................

# Entities for mixtures of #PCDATA and phrase-level elements ....

# ...............................................................

# Note that %termdef.pcd.mix contains %note.class;
# and %illus.class;, considered standalone elements.

# #1997-09-30: maler: Added scrap and %note.class; to %termdef.pcd.mix;.
# #1997-11-28: maler: Added %loc.class; to %p.pcd.mix;.
# #1998-03-10: maler: Added %ednote.class; to all mixtures.
# #1998-03-23: maler: Moved some %termdef.pcd.mix; stuff out to
# #                   %termdef.mix;.
# #1998-05-14: maler: Removed %statusp.pcd.mix;.
# #1998-05-21: maler: Added constraint element to %eg.pcd.mix;.
# #1999-07-02: maler: Added %loc.class; to %head.pcd.mix;,
# #                   %label.pcd.mix;, %eg.pcd.mix;, %termdef.pcd.mix;,
# #                   %tech.pcd.mix; (net: all PCD mixes have it).
# #                   Removed unused %loc.pcd.mix;.
local.p.pcd.mix = notAllowed
# compensate for IE bug; suggested by ht
p.pcd.mix =
  text
  | annot.class
  | termdef.class
  | emph.class
  | ref.class
  | tech.class
  | loc.class
  | ednote.class
  | local.p.pcd.mix
local.head.pcd.mix = notAllowed
# compensate for IE bug; suggested by ht
head.pcd.mix =
  text
  | annot.class
  | emph.class
  | tech.class
  | loc.class
  | ednote.class
  | local.head.pcd.mix
local.label.pcd.mix = notAllowed
# compensate for IE bug; suggested by ht
label.pcd.mix =
  text
  | annot.class
  | termdef.class
  | emph.class
  | tech.class
  | loc.class
  | ednote.class
  | local.label.pcd.mix
local.eg.pcd.mix = notAllowed
# compensate for IE bug; suggested by ht
eg.pcd.mix =
  text
  | annot.class
  | emph.class
  | loc.class
  | ednote.class
  | constraint
  | local.eg.pcd.mix
local.termdef.pcd.mix = notAllowed
# compensate for IE bug; suggested by ht
termdef.pcd.mix =
  text
  | term
  | emph.class
  | ref.class
  | tech.class
  | loc.class
  | ednote.class
  | local.termdef.pcd.mix
local.bibl.pcd.mix = notAllowed
# compensate for IE bug; suggested by ht
bibl.pcd.mix =
  text
  | emph.class
  | ref.class
  | loc.class
  | ednote.class
  | local.bibl.pcd.mix
local.tech.pcd.mix = notAllowed
# compensate for IE bug; suggested by ht
tech.pcd.mix =
  text
  | loc.class
  | ednote.class
  | phrase
  | rfc2119
  | local.tech.pcd.mix
# ...............................................................

# Entities for customizable content models ......................

# ...............................................................

# #1998-03-10: maler: Added customization entities.
# #1998-05-14: maler: Allowed prevlocs and latestloc in either order.
# #1999-07-02: maler: Made version optional; added copyright element.
# #2000-03-07: maler: Allowed status and abstract in opposite order.
spec.mdl = header, front?, body, back?
header.mdl =
  title,
  subtitle?,
  version?,
  w3c-designation,
  w3c-doctype,
  pubdate,
  notice*,
  publoc,
  altlocs?,
  ((prevlocs, latestloc?) | (latestloc, prevlocs?))?,
  authlist,
  errataloc?,
  preverrataloc?,
  translationloc?,
  copyright?,
  ((status, abstract) | (abstract, status)),
  pubstmt?,
  sourcedesc?,
  langusage,
  revisiondesc
pubdate.mdl = day?, month, year
# ...............................................................

# Entities for common attributes ................................

# ...............................................................

# #2000-03-07: maler: Added %argtypes;.

# argtypes:
# Values for function prototype argument datatypes.
argtypes =
  "boolean"
  | "expression"
  | "location-set"
  | "node-set"
  | "number"
  | "object"
  | "point"
  | "range"
  | "string"
# key attribute:
# Optionally provides a sorting or indexing key, for cases when
# the element content is inappropriate for this purpose.
key.att = attribute key { text }?
# def attribute:
# Points to the element where the relevant definition can be
# found, using the IDREF mechanism.  %def.att; is for optional
# def attributes, and %def-req.att; is for required def
# attributes.
def-req.att = attribute def { xsd:IDREF }
# ref attribute:
# Points to the element where more information can be found,
# using the IDREF mechanism.  %ref.att; is for optional
# ref attributes, and %ref-req.att; is for required ref
# attributes.
ref-req.att = attribute ref { xsd:IDREF }
# #1998-03-23: maler: Added show and actuate attributes to href.
# #                   Added semi-common xml:space attribute.
# #1998-08-22: maler: Used new xlink:form and #IMPLIED features.
# #1999-07-02: maler: Reorganized XLink-related entities completely;
# #                   added xmlns:xlink attribute to the mix.
# #2000-03-07: maler: Updated XLink usage to February 2000 draft,
# #                   except that href still has no namespace prefix.

# xmlns:xlink and xlink:type attributes:
# xmlns:xlink declares the association of the xlink prefix
# with the namespace created by the XLink specification.
# xlink:type identifies an element as an XLink "simple" linking
# element.
simple-xlink.att =
  [ a:defaultValue = "simple" ]
  attribute xlink:type { string "simple" }?
# href attributes:
# The href attribute locates the remote-resource half of a
# simple link; the element on which the href appears is the
# local-resource half.  Some elements are usable links only if
# the author chooses to supply a functional href.  The attribute
# name should really be xlink:href, but is kept without the
# prefix for now in order to be backwards-compatible.
href.att = attribute href { text }?
href-req.att = attribute href { text }
# xlink:show and xlink:actuate attributes:
# These attributes offer instructions to the display engine
# about how to handle traversal to resource indicated by an
# href locator.
auto-embed.att =
  [ a:defaultValue = "embed" ] attribute xlink:show { string "embed" }?,
  [ a:defaultValue = "onLoad" ]
  attribute xlink:actuate { string "onLoad" }?
user-replace.att =
  [ a:defaultValue = "replace" ]
  attribute xlink:show { string "replace" }?,
  [ a:defaultValue = "onRequest" ]
  attribute xlink:actuate { string "onRequest" }?
user-new.att =
  [ a:defaultValue = "new" ] attribute xlink:show { string "new" }?,
  [ a:defaultValue = "onRequest" ]
  attribute xlink:actuate { string "onRequest" }?
# xml:space attribute:
# Indicates that the element contains whitespace that the
# formatter or other application should retain, as appropriate
# to its function.
xmlspace.att =
  [ a:defaultValue = "preserve" ] attribute xml:space { "preserve" }?
# #2000-03-07: maler: Added common diff attribute.  Made %role.att;.

# diff attribute:
# Indicates in what way the element has changed.  When a value
# is not provided, that subelement should inherit a value from
# its parent.  If the root element has no value supplied,
# assume "off".
diff.att = attribute diff { "chg" | "add" | "del" | "off" }?
# role attribute:
# Extends the useful life of the DTD by allowing authors to
# make a subtype of any element.  No default.
role.att = attribute role { xsd:NMTOKEN }?
# Common attributes:
# Every element has an ID attribute for links, a role
# attribute, and a diff attribute. %common.att; is for
# common attributes where the ID is optional, and
# %common-idreq.att; is for common attributes where the
# ID is required.
local.common.att = empty
common.att =
  attribute id { xsd:ID }?,
  role.att,
  diff.att,
  local.common.att
local.common-idreq.att = empty
common-idreq.att =
  attribute id { xsd:ID },
  role.att,
  diff.att,
  local.common-idreq.att
# ...............................................................

# Common elements ...............................................

# ...............................................................

# head: Title on divisions, productions, and the like
head = element head { attlist.head, head.pcd.mix* }
attlist.head &= common.att
# ...............................................................

# Major specification structure .................................

# ...............................................................

# #1998-03-10: maler: Made spec content model easily customizable.
# #1999-07-02: maler: Added doctype atts and status att.
# #2000-03-07: maler: Added cr, issues, and dispcmts to w3c-doctype.
spec = element spec { attlist.spec, spec.mdl }
# w3c-doctype attributes:
# Indicates the type of document, so that the appropriate
# stylesheet or workflow routing can be applied.  Should
# *not* generate any text (such as the "REC-" or "NOTE-"
# prefix on the W3C designation content).  No default.  If
# w3c-doctype is "other", other-doctype should be filled in.
# 
# status attribute:
# Indicates the stage of review of the document.  May affect
# the stylesheet's treatment of ednotes (e.g., whether to
# output them).  No default.
local.spec.att = empty
attlist.spec &=
  common.att,
  local.spec.att,
  attribute w3c-doctype {
    "cr"
    | "dispcmts"
    | "issues"
    | "wgnote"
    | "memsub"
    | "teamsub"
    | "note"
    | "other"
    | "pr"
    | "per"
    | "rec"
    | "wd"
    | "review"
  }?,
  attribute other-doctype { text }?,
  attribute status { "int-review" | "ext-review" | "final" }?
front = element front { attlist.front, div1+ }
attlist.front &= common.att
body = element body { attlist.body, div1+ }
attlist.body &= common.att
# #1997-09-30: maler: Added inform-div1 to back content.
back =
  element back {
    attlist.back,
    ((div1+, inform-div1*) | inform-div1+)
  }
attlist.back &= common.att
div1 = element div1 { attlist.div1, head, div.mix*, div2* }
attlist.div1 &= common.att
# #1997-09-30: maler: Added inform-div1 declarations.
# #2000-03-07: maler: Added div5 level.

# inform-div1: Non-normative division in back matter
inform-div1 =
  element inform-div1 { attlist.inform-div1, head, div.mix*, div2* }
attlist.inform-div1 &= common.att
div2 = element div2 { attlist.div2, head, div.mix*, div3* }
attlist.div2 &= common.att
div3 = element div3 { attlist.div3, head, div.mix*, div4* }
attlist.div3 &= common.att
div4 = element div4 { attlist.div4, head, div.mix*, div5* }
attlist.div4 &= common.att
div5 = element div5 { attlist.div5, head, div.mix* }
attlist.div5 &= common.att
# ...............................................................

# Specification header ..........................................

# ...............................................................

# #1998-03-10: maler: Made header content model easily customizable.
header = element header { attlist.header, header.mdl }
attlist.header &= common.att
# Example of title: "Extensible Cheese Language (XCL)"
title = element title { attlist.title, (text | phrase)* }
attlist.title &= common.att
# Example of subtitle: "A Cheesy Specification"
subtitle = element subtitle { attlist.subtitle, (text | phrase)* }
attlist.subtitle &= common.att
# Example of version: "Version 666.0"
version = element version { attlist.version, (text | phrase)* }
attlist.version &= common.att
# Example of w3c-designation: "WD-xcl-19991231"
w3c-designation =
  element w3c-designation { attlist.w3c-designation, (text | phrase)* }
attlist.w3c-designation &= common.att
# Example of w3c-doctype: "W3C Working Draft"
w3c-doctype =
  element w3c-doctype { attlist.w3c-doctype, (text | phrase)* }
attlist.w3c-doctype &= common.att
# #1998-03-10: maler: Made pubdate content model easily customizable.
pubdate = element pubdate { attlist.pubdate, pubdate.mdl }
attlist.pubdate &= common.att
day = element day { attlist.day, (text | phrase)* }
attlist.day &= common.att
month = element month { attlist.month, (text | phrase)* }
attlist.month &= common.att
year = element year { attlist.year, (text | phrase)* }
attlist.year &= common.att
# #1999-07-02: maler: Declared copyright element.
copyright = element copyright { attlist.copyright, hdr.mix+ }
attlist.copyright &= common.att
# Example of notice: "This draft is for public comment..."
notice = element notice { attlist.notice, hdr.mix+ }
attlist.notice &= common.att
# #2000-03-07: maler: Broadened models of *loc to %p.pcd.mix;.
publoc = element publoc { attlist.publoc, p.pcd.mix* }
attlist.publoc &= common.att
# #2002-08-15: nwalsh: Added altlocs element.
#   The semantics of the altlocs are equivalent to the Dublin Core relation element
#   with type="hasVersion". Each of the loc elements inside altlocs should identify
#   an alternate version of the resource described by the document, for example
#   HTML, XML, and PDF forms.
altlocs = element altlocs { attlist.altlocs, loc+ }
attlist.altlocs &= common.att
prevlocs = element prevlocs { attlist.prevlocs, p.pcd.mix* }
attlist.prevlocs &= common.att
# #2005-10-13: nwalsh: restrict latestloc content model.
#   New pubrules allows for multiple latestlocs. For some reason, this element
#   used to allow PCDATA. Now it allows only loc elements. If this causes
#   trouble, tell Norm.
latestloc = element latestloc { attlist.latestloc, loc+ }
attlist.latestloc &= common.att
errataloc = element errataloc { attlist.errataloc, empty }
attlist.errataloc &= common.att, simple-xlink.att, href-req.att
preverrataloc = element preverrataloc { attlist.preverrataloc, empty }
attlist.preverrataloc &= common.att, simple-xlink.att, href-req.att
translationloc =
  element translationloc { attlist.translationloc, empty }
attlist.translationloc &= common.att, simple-xlink.att, href-req.att
# loc (defined in "Phrase-level elements" below)
authlist = element authlist { attlist.authlist, author+ }
attlist.authlist &= common.att
# #1997-09-30: maler: Made affiliation optional.
# #1998-03-10: maler: Made email optional.
author = element author { attlist.author, name, affiliation?, email? }
attlist.author &= common.att
name = element name { attlist.name, (text | phrase)* }
attlist.name &= common.att, key.att
affiliation =
  element affiliation { attlist.affiliation, (text | phrase)* }
attlist.affiliation &= common.att
# #1999-07-02: maler: Added show/actuate attributes and default values.
email = element email { attlist.email, (text | phrase)* }
# href attribute:
#         email functions as a hypertext reference through this
#         required attribute.  Typically the reference would use
#         the mailto: scheme.  E.g.:
# 
# <email href="mailto:elm@arbortext.com">elm@arbortext.com</email>
attlist.email &=
  common.att, simple-xlink.att, href-req.att, user-new.att
# #1998-05-15: maler: Changed status content from %statusobj.mix;
# #                   to plain %obj.mix;.  statusp is obsolete.
status = element status { attlist.status, obj.mix+ }
attlist.status &= common.att
abstract = element abstract { attlist.abstract, hdr.mix* }
attlist.abstract &= common.att
pubstmt = element pubstmt { attlist.pubstmt, hdr.mix+ }
attlist.pubstmt &= common.att
sourcedesc = element sourcedesc { attlist.sourcedesc, hdr.mix+ }
attlist.sourcedesc &= common.att
langusage = element langusage { attlist.langusage, language+ }
attlist.langusage &= common.att
language = element language { attlist.language, (text | phrase)* }
attlist.language &= common.att
revisiondesc = element revisiondesc { attlist.revisiondesc, hdr.mix+ }
attlist.revisiondesc &= common.att
# ...............................................................

# Paragraph .....................................................

# ...............................................................

# #1997-09-30: maler: Changed from %obj.mix; to %p.mix;.
# #1997-12-29: maler: Changed order of %p.mix; and %p.pcd.mix;
# #                   references.
# #1997-12-29: maler: Changed order of %statusobj.mix; and
# #                   %statusp.pcd.mix; references.
# #1998-05-14: maler: Removed statusp declarations.
p = element p { attlist.p, (p.pcd.mix | p.mix)* }
attlist.p &= common.att
# ...............................................................

# Regular lists .................................................

# ...............................................................

# ulist: Unordered list, typically bulleted.
ulist = element ulist { attlist.ulist, item+ }
# spacing attribute:
# Use "normal" to get normal vertical spacing for items;
# use "compact" to get less spacing.  The default is dependent
# on the stylesheet.
attlist.ulist &=
  common.att,
  attribute spacing { "normal" | "compact" }?
# olist: Ordered list, typically numbered.
olist = element olist { attlist.olist, item+ }
# spacing attribute:
# Use "normal" to get normal vertical spacing for items;
# use "compact" to get less spacing.  The default is dependent
# on the stylesheet.
attlist.olist &=
  common.att,
  attribute spacing { "normal" | "compact" }?
item = element item { attlist.item, obj.mix+ }
attlist.item &= common.att
# slist: Simple list, typically with no mark.
slist = element slist { attlist.slist, sitem+ }
attlist.slist &= common.att
sitem = element sitem { attlist.sitem, p.pcd.mix* }
attlist.sitem &= common.att
# glist: Glossary list, typically two-column.
glist = element glist { attlist.glist, gitem+ }
attlist.glist &= common.att
gitem = element gitem { attlist.gitem, label, def }
attlist.gitem &= common.att
label = element label { attlist.label, label.pcd.mix* }
attlist.label &= common.att
def = element def { attlist.def, obj.mix* }
attlist.def &= common.att
# ...............................................................

# Special lists .................................................

# ...............................................................

# blist: Bibliography list.
blist = element blist { attlist.blist, bibl+ }
attlist.blist &= common.att
# #1999-07-02: maler: Added show/actuate attributes and default values.
bibl = element bibl { attlist.bibl, bibl.pcd.mix* }
# href attribute:
# bibl optionally functions as a hypertext reference to the
# referred-to resource through this attribute.  E.g.:
# 
# <bibl href="http://www.my.com/doc.htm">My Document</bibl>
attlist.bibl &=
  common.att, simple-xlink.att, href.att, user-replace.att, key.att
# orglist: Organization member list.
orglist = element orglist { attlist.orglist, member+ }
attlist.orglist &= common.att
# #1997-09-30: maler: Added optional affiliation.
member = element member { attlist.member, name, affiliation?, role? }
attlist.member &= common.att
# name (defined in "Specification header" above)

# affiliation (defined in "Specification header" above)
role = element role { attlist.role, (text | phrase)* }
attlist.role &= common.att
# ...............................................................

# Notes .........................................................

# ...............................................................
note = element note { attlist.note, obj.mix+ }
attlist.note &= common.att
# #1998-05-14: maler: Declared issue element.
# #2000-03-07: maler: Added head, source, resolution, and status.
issue =
  element issue { attlist.issue, head?, source*, obj.mix+, resolution? }
# status attribute:
# Indicates whether the issue is open or closed.  Note that
# the lack of a resolution element does not necessarily mean
# that the issue is still open.
attlist.issue &=
  attribute id { xsd:ID },
  role.att,
  diff.att,
  [ a:defaultValue = "open" ] attribute status { "open" | "closed" }?
source = element source { attlist.source, p.pcd.mix* }
attlist.source &= common.att
resolution = element resolution { attlist.resolution, obj.mix+ }
attlist.resolution &= common.att
# wfcnote: Well-formedness constraint note.
wfcnote = element wfcnote { attlist.wfcnote, head, obj.mix+ }
# ID attribute:
# wfcnote must have an ID so that it can be pointed to
# from a wfc element in a production.
attlist.wfcnote &= common-idreq.att
# vcnote: Validity constraint note.
vcnote = element vcnote { attlist.vcnote, head, obj.mix+ }
# ID attribute:
# vcnote must have an ID so that it can be pointed to
# from a vc element in a production.
attlist.vcnote &= common-idreq.att
# #1998-05-21: maler: Declared generic constraintnote element.

# constraintnote: Generic constraint note.
constraintnote =
  element constraintnote { attlist.constraintnote, head, obj.mix+ }
# ID attribute:
# constraintnote must have an ID so that it can be
# pointed to from a constraint element in a production.

# type attribute:
# constraintnote must have a type value keyword so that
# it can be correctly characterized in the specification.
attlist.constraintnote &=
  common-idreq.att,
  attribute type { xsd:NMTOKEN }
# ...............................................................

# Basic display elements ........................................

# ...............................................................

# #1998-03-23: maler: Added xml:space attribute.

# eg: Example element, with whitespace respected.
eg = element eg { attlist.eg, eg.pcd.mix* }
attlist.eg &= common.att, xmlspace.att
# #2000-03-07: maler: Removed the xml:attributes attribute.
# #                   Added %local.graphic.att;.

# graphic: Displayed graphic.  Graphic data should be
# displayed at the point where it is referenced.  Not
# actually conforming to XLink right now.
graphic = element graphic { attlist.graphic, empty }
# source attribute:
# The graphic data must reside at the location pointed to.
local.graphic.att = empty
attlist.graphic &=
  common.att,
  simple-xlink.att,
  attribute source { text },
  auto-embed.att,
  attribute alt { text }?,
  local.graphic.att
# #2000-03-07: maler: Added proto element structure.

# proto: Function prototype, in the XPath/XPointer style.
proto = element proto { attlist.proto, arg* }
local.proto.att = empty
attlist.proto &=
  common.att,
  local.proto.att,
  attribute name { xsd:NMTOKEN },
  attribute return-type { argtypes }
local.arg.att = empty
arg = element arg { attlist.arg, empty }
attlist.arg &=
  common.att,
  local.arg.att,
  attribute type { argtypes },
  attribute occur { "opt" | "req" }?
# #2000-03-07: maler: Added example element.
example = element example { attlist.example, head?, obj.mix+ }
attlist.example &= common.att
# ...............................................................

# EBNF ..........................................................

# ...............................................................

# #1997-11-28: maler: Added prodgroup to scrap and defined it.
# #1998-05-21: maler: Added constraint to prod.
# #1999-07-02: maler: Added prodrecap to scrap; broadened scrap model.
# #                   Added headstyle attribute to scrap.

# scrap: Collection of EBNF language productions.
scrap =
  element scrap {
    attlist.scrap, head, (prodgroup | prod | bnf | prodrecap)+
  }
# lang attribute:
# The scrap can link to a description of the language used,
# found in a language element in the header.
# headstyle attribute:
# Allows a scrap title to be suppressed from output.  To be
# used only when a scrap title directly next to a section
# title is distracting or repetetive.
attlist.scrap &=
  common.att,
  attribute lang { xsd:IDREF }?,
  [ a:defaultValue = "show" ]
  attribute headstyle { "show" | "suppress" }?
# prodgroup: Sub-collection of productions, needed for
# formatting reasons.
prodgroup = element prodgroup { attlist.prodgroup, prod+ }
# pcw<n> attributes:
# Presentational attributes to control the width
# of the "pseudo-table" columns used to output
# groups of productions.
attlist.prodgroup &=
  common.att,
  attribute pcw1 { text }?,
  attribute pcw2 { text }?,
  attribute pcw3 { text }?,
  attribute pcw4 { text }?,
  attribute pcw5 { text }?
# prod: EBNF language production.
prod =
  element prod {
    attlist.prod,
    lhs,
    (rhs, (com | wfc | vc | constraint)*)+
  }
# ID attribute:
# The production must have an ID so that cross-references
# (specref) and mentions of nonterminals (nt) can link to
# it.
attlist.prod &=
  common-idreq.att,
  attribute num { text }?
# lhs: Left-hand side of production.
lhs = element lhs { attlist.lhs, (text | phrase)* }
attlist.lhs &= common.att
# rhs: Right-hand side of production; may have many
# "right-hand sides," one to a line.
rhs = element rhs { attlist.rhs, (text | phrase | nt | xnt | com)* }
attlist.rhs &= common.att
# nt and xnt (defined in "Phrase-level elements" below)

# #1997-11-28: maler: Added loc and bibref to com content.

# com: Production comment.
com = element com { attlist.com, (text | phrase | loc | bibref)* }
attlist.com &= common.att
# wfc: Reference to a well-formedness constraint; should
# generate the head of the wfcnote pointed to.
wfc = element wfc { attlist.wfc, empty }
# def attribute:
# Each well formedness tagline in a production must link to the
# wfcnote that defines it.
attlist.wfc &= def-req.att, common.att
# vc: Reference to a validity constraint; should generate
# the head of the vcnote pointed to.
vc = element vc { attlist.vc, empty }
# def attribute:
# Each validity tagline in a production must link to the vcnote
# that defines it.
attlist.vc &= def-req.att, common.att
# #1998-05-21: maler: Declared generic constraint element.

# constraint: Reference to a generic constraint; should
# generate the head of the constraintnote pointed to.
constraint = element constraint { attlist.constraint, empty }
# def attribute:
# Each constraint tagline in a production must link to the
# constraint note that defines it.
attlist.constraint &= def-req.att, common.att
# #1998-03-23: maler: Added xml:space attribute.

# bnf: Un-marked-up EBNF production, with whitespace
# respected.
bnf = element bnf { attlist.bnf, eg.pcd.mix* }
attlist.bnf &= common.att, xmlspace.att
# #1999-07-02: maler: Declared prodrecap.

# prodrecap: Reference to production or bnf that appears
# in its "normative" form elsewhere in the spec; should
# generate a copy of the original production, without
# a production number next to it.
prodrecap = element prodrecap { attlist.prodrecap, empty }
attlist.prodrecap &= common.att, ref-req.att
# ...............................................................

# Table .........................................................

# ...............................................................

# #1997-10-16: maler: Added table mechanism.
# #1997-11-28: maler: Added non-null system ID to entity declaration.
# #                   Added HTML table module.
# #1997-12-29: maler: IGNOREd SGML Open table model.
# #1998-03-10: maler: Removed SGML Open table model.
# #                   Merged html-tbl.mod file into main file.
# #                   Added %common.att; to all HTML table elements.
# #1998-05-14: maler: Replaced table model with full HTML 4.0 model.
# #                   Removed htable in favor of table.
# #                   Removed htbody in favor of tbody.
cellhalign.att =
  attribute align { "left" | "center" | "right" | "justify" | "char" }?,
  attribute char { text }?,
  attribute charoff { text }?
cellvalign.att =
  attribute valign { "top" | "middle" | "bottom" | "baseline" }?
thtd.att =
  attribute abbr { text }?,
  attribute axis { text }?,
  attribute headers { xsd:IDREFS }?,
  attribute scope { "row" | "col" | "rowgroup" | "colgroup" }?,
  [ a:defaultValue = "1" ] attribute rowspan { xsd:NMTOKEN }?,
  [ a:defaultValue = "1" ] attribute colspan { xsd:NMTOKEN }?
width.att = attribute width { text }?
span.att = [ a:defaultValue = "1" ] attribute span { xsd:NMTOKEN }?
# table: HTML-based geometric table model.
table =
  element table {
    attlist.table, caption?, (col* | colgroup*), thead?, tfoot?, tbody+
  }
attlist.table &=
  common.att,
  width.att,
  attribute summary { text }?,
  attribute border { text }?,
  attribute frame {
    "void"
    | "above"
    | "below"
    | "hsides"
    | "lhs"
    | "rhs"
    | "vsides"
    | "box"
    | "border"
  }?,
  attribute rules { "none" | "groups" | "rows" | "cols" | "all" }?,
  attribute cellspacing { text }?,
  attribute cellpadding { text }?
caption = element caption { attlist.caption, p.pcd.mix* }
attlist.caption &= common.att
col = element col { attlist.col, empty }
attlist.col &=
  common.att, span.att, width.att, cellhalign.att, cellvalign.att
colgroup = element colgroup { attlist.colgroup, col* }
attlist.colgroup &=
  common.att, span.att, width.att, cellhalign.att, cellvalign.att
thead = element thead { attlist.thead, tr+ }
attlist.thead &= common.att, cellhalign.att, cellvalign.att
tfoot = element tfoot { attlist.tfoot, tr+ }
attlist.tfoot &= common.att, cellhalign.att, cellvalign.att
tbody = element tbody { attlist.tbody, tr+ }
attlist.tbody &= common.att, cellhalign.att, cellvalign.att
tr = element tr { attlist.tr, (th | td)+ }
attlist.tr &= common.att, cellhalign.att, cellvalign.att
th = element th { attlist.th, (p.pcd.mix | p.mix)* }
attlist.th &= common.att, thtd.att, cellhalign.att, cellvalign.att
td = element td { attlist.td, (p.pcd.mix | p.mix)* }
attlist.td &= common.att, thtd.att, cellhalign.att, cellvalign.att
# ...............................................................

# IDL structures for DOM specifications .........................

# ...............................................................

# ...............................................................

# Specialized entities for classes ..............................
idl-desc.class = p | note
idl-tdef.class = typedef | constant | exception | reference | group
idl-mod.class = module | interface
idl-struct.class = struct | enum | sequence | union | typename
idl-meth.class = method | \attribute
# ...............................................................

# Specialized entities for mixtures .............................

# Quick reference to content model mixtures:
# 
#                         desc tdef mod struct meth
# group                     x    x   x    x      x
# definitions, module       x    x   x
# interface                 x    x               x
# typedef, case, component                x
idl-grp.mix =
  idl-desc.class
  | idl-tdef.class
  | idl-mod.class
  | idl-struct.class
  | idl-meth.class
idl-defn.mix = idl-desc.class | idl-tdef.class | idl-mod.class
idl-intfc.mix = idl-desc.class | idl-tdef.class | idl-meth.class
idl-type.mix = idl-struct.class
# ...............................................................

# Specialized entities for common attributes ....................

# name attribute:
# Provides a name.  Required.
idl-name.att = attribute name { text }
# type attribute:
# Provides a type.  Required.
idl-type.att = attribute type { text }
# ...............................................................

# Common IDL element ............................................
descr = element descr { attlist.descr, obj.mix* }
attlist.descr &= common.att
# ...............................................................

# IDL definition elements .......................................

# definitions: Top-level element for definitions.
definitions = element definitions { attlist.definitions, idl-defn.mix+ }
attlist.definitions &= common.att
# group: Element used to group a set of definitions.
group = element group { attlist.group, descr, idl-grp.mix* }
attlist.group &= common.att, idl-name.att
# interface: Definition of an interface.
interface =
  element interface { attlist.interface, descr, idl-intfc.mix* }
attlist.interface &=
  common.att,
  idl-name.att,
  attribute inherits { text }?
# module: Definition of a module.
module = element module { attlist.module, descr, idl-defn.mix* }
attlist.module &= common.att, idl-name.att
# reference: Reference to some other declaration.
reference = element reference { attlist.reference, empty }
attlist.reference &=
  common.att,
  attribute declaration { xsd:IDREF }
# typedef: Definition of a named type.
typedef = element typedef { attlist.typedef, descr, idl-type.mix }
attlist.typedef &=
  common.att,
  idl-name.att,
  attribute array.size { xsd:NMTOKEN }?
# struct: Declaration of a struct type.
struct = element struct { attlist.struct, descr, component+ }
attlist.struct &= common.att, idl-name.att
# component: Declaration of a structural member.
component = element component { attlist.component, idl-type.mix }
attlist.component &= common.att, idl-name.att
# union: Declaration of a union type.
union = element union { attlist.union, descr, case+ }
attlist.union &=
  common.att,
  idl-name.att,
  attribute switch.type { text }
case = element case { attlist.case, descr, idl-type.mix }
attlist.case &=
  common.att,
  attribute labels { text }
# enum: Declaration of an enum type.
enum = element enum { attlist.enum, descr, enumerator+ }
attlist.enum &= common.att, idl-name.att
enumerator = element enumerator { attlist.enumerator, descr }
attlist.enumerator &= common.att, idl-name.att
# sequence: Declaration of a sequence type (not named).
sequence = element sequence { attlist.sequence, sequence* }
attlist.sequence &=
  common.att,
  idl-type.att,
  attribute size { xsd:NMTOKEN }?
# constant: Declaration of a named constant.
constant = element constant { attlist.constant, descr }
attlist.constant &=
  common.att,
  idl-name.att,
  idl-type.att,
  attribute value { text }
# exception: Declaration of an exception.
exception = element exception { attlist.exception, descr, component* }
attlist.exception &= common.att, idl-name.att
#  component (defined under struct, above)

# attribute: Declaration of an attribute (data member).
\attribute = element attribute { attlist.attribute, descr }
attlist.attribute &=
  common.att,
  idl-name.att,
  idl-type.att,
  [ a:defaultValue = "no" ] attribute readonly { "yes" | "no" }?
# method: Declaration of a method.
method =
  element method { attlist.method, descr, parameters, returns, raises }
attlist.method &= common.att, idl-name.att
parameters = element parameters { attlist.parameters, param* }
attlist.parameters &= common.att
param = element param { attlist.param, descr }
attlist.param &=
  common.att,
  idl-name.att,
  idl-type.att,
  [ a:defaultValue = "inout" ]
  attribute attr { "in" | "out" | "inout" }?
returns = element returns { attlist.returns, descr }
attlist.returns &= common.att, idl-type.att
raises = element raises { attlist.raises, exception* }
attlist.raises &= empty
#  exception (defined under constant, above)
typename = element typename { attlist.typename, (text | phrase)* }
attlist.typename &= common.att
# ...............................................................

# Phrase-level elements .........................................

# ...............................................................

# #2000-03-07: maler: Added att and attval elements.

# att: Attribute name.
att = element att { attlist.att, tech.pcd.mix* }
attlist.att &= common.att
# attval: Attribute value.
attval = element attval { attlist.attval, tech.pcd.mix* }
attlist.attval &= common.att
# bibref: Reference to a bibliography list entry; should
# generate, in square brackets, "key" on bibl.
bibref = element bibref { attlist.bibref, empty }
# ref attribute:
# A bibliography reference must link to the bibl element that
# describes the resource.
attlist.bibref &= common.att, ref-req.att
code = element code { attlist.code, tech.pcd.mix* }
attlist.code &= common.att
# #1998-03-10: maler: Declared ednote and related elements.
# #1999-07-02: maler: Changed edtext content from #PCDATA to %p.pcd.mix;.

# ednote: Editorial note for communication among editors.
ednote = element ednote { attlist.ednote, name?, date?, edtext }
attlist.ednote &= common.att
date = element date { attlist.date, (text | phrase)* }
attlist.date &= common.att
edtext = element edtext { attlist.edtext, p.pcd.mix* }
attlist.edtext &= common.att
# #2000-03-07: maler: Added el element.

# el: Element type name (GI).
el = element el { attlist.el, tech.pcd.mix* }
attlist.el &= common.att
# #2000-03-07: maler: Expanded emph to %p.pcd.mix;.
emph = element emph { attlist.emph, p.pcd.mix* }
attlist.emph &= common.att
# footnote: Both footnote content and call to footnote.
footnote = element footnote { attlist.footnote, obj.mix+ }
attlist.footnote &= common.att
# #2000-03-07: maler: Added function and gave it content of
# #                   %tech.pcd.mix; instead of XPath's #PCDATA.
function = element function { attlist.function, tech.pcd.mix* }
attlist.function &= common.att
kw = element kw { attlist.kw, tech.pcd.mix* }
attlist.kw &= common.att
# #1999-07-02: maler: Added show/actuate attributes and default values.

# loc: Generic link to a Web resource, similar to HTML's A.
loc = element loc { attlist.loc, (text | phrase)* }
# href attribute:
#         The purpose of a loc element is to function as a A-like
#         hypertext link to a resource.  (Ideally, the content of loc
#         will also mention the URI of the resource, so that readers of
#         the printed version will be able to locate the resource.) E.g.:
# 
# <loc href="http://www.my.com/doc.htm">http://www.my.com/doc.htm</loc>
attlist.loc &=
  common.att, simple-xlink.att, href-req.att, user-replace.att
# nt: Mention of a nonterminal in text, along with a link to
# the production in the current document that defines it.
nt = element nt { attlist.nt, (text | phrase)* }
# def attribute:
# The nonterminal must link to the production that defines
# it.
attlist.nt &= common.att, def-req.att
# #2000-03-07: maler: Declared phrase.

# phrase: "Attribute hanger" for small bits of (e.g.) differenced
# text in a paragraph or similar, when another element isn't handy.
# Beware that its content model may allow more nested elements than
# would normally be allowed in some contexts.
phrase = element phrase { attlist.phrase, p.pcd.mix* }
attlist.phrase &= common.att
# #2003-06-25: nwalsh: RFC2119 elements
rfc2119 = element rfc2119 { attlist.rfc2119, (text | phrase)* }
attlist.rfc2119 &= common.att
# #1998-03-10: maler: Declared quote.

# quote: Scare quotes and other purely presentational quotes.
quote = element quote { attlist.quote, p.pcd.mix* }
attlist.quote &= common.att
# specref: Reference to a div, olist item, prod, or issue
# in the current document; should generate italic "[n.n],
# Section Title" for div, "n" for numbered item, "[n]" for
# production, or "Issue id" for issue.
specref = element specref { attlist.specref, empty }
# ref attribute:
# The purpose of a specref element is to link to a div, item
# in an olist, or production in the current spec.
attlist.specref &= common.att, ref-req.att
# #2000-03-07: maler: Added sub and sup.

# sub: Subscript.
sub = element sub { attlist.sub, (text | phrase)* }
attlist.sub &= common.att
# sup: Superscript.
sup = element sup { attlist.sup, (text | phrase)* }
attlist.sup &= common.att
# term: The term in text that is being defined in text.
term = element term { attlist.term, (text | phrase)* }
attlist.term &= common.att
# termdef: Definition of a term in text.
termdef =
  element termdef { attlist.termdef, (termdef.pcd.mix | termdef.mix)* }
# ID attribute:
# A term definition must have an ID so that it can be linked
# to from termref elements.

# term attribute:
# The canonical form of the term or phrase being defined must
# appear in this attribute, even if the term or phrase also
# appears in the element content in identical form (e.g., in
# the term element).
attlist.termdef &=
  common-idreq.att,
  attribute term { text }
# termref: Mention of a term, along with a link to the
# definition in the current document.
termref = element termref { attlist.termref, (text | phrase)* }
# ref attribute:
# A term reference must link to the termdef element that
# defines the term.
attlist.termref &= common.att, def-req.att
# #1999-07-02: maler: Added show/actuate attributes and default values.

# titleref: Citation of another document, which can also
# link to that document if it is a Web resource.
titleref = element titleref { attlist.titleref, (text | phrase)* }
# href attribute:
#         A title reference can optionally function as a hypertext
#         link to the resource with this title.  E.g.:
# 
# <loc href="http://www.my.com/doc.htm">http://www.my.com/doc.htm</loc>
attlist.titleref &= common.att, simple-xlink.att, href.att, user-new.att
# #2000-03-07: maler: Added var.

# var: String standing for a variable value that the user
# or system will supply.  For example: "For each node
# <var>x</var> in this node-set..."
var = element var { attlist.var, tech.pcd.mix* }
attlist.var &= common.att
# #1999-07-02: maler: Added show/actuate attributes and default values.

# xnt: Mention of a nonterminal in text, along with a link to
# the production in another document that defines it.
xnt = element xnt { attlist.xnt, (text | phrase)* }
# href attribute:
#         The nonterminal must hyperlink to a resource that serves
#         to define it (e.g., a production in a related XML
#         specification).  E.g.:
# 
# <xnt href="http://www.w3.org/TR/spec.htm#prod3">Name</xnt>
attlist.xnt &= common.att, simple-xlink.att, href-req.att, user-new.att
# #1997-12-29: maler: Declared xspecref.
# #1999-07-02: maler: Added show/actuate attributes and default values.

# xspecref: Reference to a div, olist item, prod, or issue
# in a related specification document; should generate
# no special text.
xspecref = element xspecref { attlist.xspecref, (text | phrase)* }
# href attribute:
#         The spec reference must hyperlink to the resource to
#         cross-refer to (e.g., a section in a related XML
#         specification).  E.g.:
# 
# <xspecref href="http://www.w3.org/TR/spec.htm#sec2">
# the section on constraints</xspecref>
attlist.xspecref &=
  common.att, simple-xlink.att, href-req.att, user-new.att
# #1999-07-02: maler: Added show/actuate attributes and default values.

# termref: Mention of a term, along with a link to the
# definition in a related document.
xtermref = element xtermref { attlist.xtermref, (text | phrase)* }
# href attribute:
#         The term reference must hyperlink to the resource that
#         serves to define the term (e.g., a term definition in
#         a related XML specification).  E.g.:
# 
# <xtermref href="http://www.w3.org/TR/spec.htm#term5">
# entity
# </xtermref>
attlist.xtermref &=
  common.att, simple-xlink.att, href-req.att, user-new.att
# ...............................................................

# Unused elements for ADEPT .....................................

# ...............................................................

# #1997-09-30: maler: Added unusued elements.
# #1997-10-14: maler: Fixed div to move nested div to the mixture.
# #1998-05-14: maler: Added key-term, htable, and htbody.
# #1998-11-30: maler: Added para, listitem, itemizedlist, and orderedlist.

# The following elements are purposely declared but never
# referenced.  Declaring them allows them to be pasted from
# an HTML document, an earlier version of an XMLspec document,
# or a DocBook document into a document using this DTD in ADEPT.
# The ATD Context Transformation mechanism will try to convert
# them to the appropriate element for this DTD.  While this
# conversion will not work for all fragments, it does allow many
# cases to work reasonably well.
\div =
  element div {
    attlist.div,
    head?,
    (div.mix | ul | ol | h1 | h2 | h3 | h4 | h5 | h6 | \div)*
  }
attlist.div &= empty
h1 = element h1 { attlist.h1, (head.pcd.mix | em | a)* }
attlist.h1 &= empty
h2 = element h2 { attlist.h2, (head.pcd.mix | em | a)* }
attlist.h2 &= empty
h3 = element h3 { attlist.h3, (head.pcd.mix | em | a)* }
attlist.h3 &= empty
h4 = element h4 { attlist.h4, (head.pcd.mix | em | a)* }
attlist.h4 &= empty
h5 = element h5 { attlist.h5, (head.pcd.mix | em | a)* }
attlist.h5 &= empty
h6 = element h6 { attlist.h6, (head.pcd.mix | em | a)* }
attlist.h6 &= empty
pre = element pre { attlist.pre, (eg.pcd.mix | em)* }
attlist.pre &= empty
ul = element ul { attlist.ul, (item | li)* }
attlist.ul &= empty
ol = element ol { attlist.ol, (item | li)* }
attlist.ol &= empty
li = element li { attlist.li, (text | obj.mix)* }
attlist.li &= empty
em = element em { attlist.em, text* }
attlist.em &= empty
a = element a { attlist.a, text* }
attlist.a &= empty
key-term = element key-term { attlist.key-term, text* }
attlist.key-term &= empty
htable =
  element htable {
    attlist.htable, caption?, (col* | colgroup*), thead?, tfoot?, tbody+
  }
attlist.htable &= empty
htbody = element htbody { attlist.htbody, tr+ }
attlist.htbody &= empty
statusp = element statusp { attlist.statusp, (p.pcd.mix | p.mix)* }
attlist.statusp &= empty
itemizedlist = element itemizedlist { attlist.itemizedlist, listitem* }
attlist.itemizedlist &= empty
orderedlist = element orderedlist { attlist.orderedlist, listitem* }
attlist.orderedlist &= empty
listitem = element listitem { attlist.listitem, para* }
attlist.listitem &= empty
para = element para { attlist.para, text* }
attlist.para &= empty
start =
  itemizedlist
  | htable
  | htbody
  | spec
  | pre
  | orderedlist
  | key-term
  | statusp
# ...............................................................

# Change history ................................................

# ...............................................................

# #This revision history is no longer being maintained. See the CVS log
# #for detailed revisions history.
# #####################################################################
# #1997-08-18: maler
# #- Did a major revision.
# #1997-09-10: maler
# #- Updated FPI.
# #- Removed namekey element and put key attribute on name element.
# #- Made statusp element and supporting entities.
# #- Added slist element with sitem+ content.
# #- Required head on scrap and added new bnf subelement.
# #- Added an xnt element and allowed it and nt in regular text and rhs.
# #- Removed the ntref element.
# #- Added back the com element to the content of rhs.
# #- Added a key attribute to bibl.
# #- Removed the ident element.
# #- Added a term element to be used inside termdef.
# #- Added an xtermref element parallel to termref.
# #- Beefed up DTD comments.
# #1997-09-12: maler
# #- Allowed term element in general text.
# #- Changed bibref to EMPTY.
# #- Added ref.class to termdef.pcd.mix.
# #1997-09-14: maler
# #- Changed main attribute of xtermref from def to href.
# #- Added termdef.class to label contents.
# #1997-09-30: maler
# #- Added character entity module and added new entities.
# #- Removed p from appearing directly in self; created %p.mix;.
# #- Added inform-div (non-normative division) element.
# #- Fixed xtermref comment to mention href, not ref.
# #- Extended orglist model to allow optional affiliation.
# #- Modified author to make affiliation optional.
# #- Added %speclist.class; and %note.class; to %obj.mix; and %p.mix;.
# #- Added %note.class; and %illus.class; to %termdef.pcd.mix;.
# #- Added unused HTML elements.
# #- Put empty system ID next to public ID in entity declarations.
# #1997-10-14: maler
# #- Fixed "unused" div content model to move nested div to mixture.
# #1997-10-16: maler
# #- Added SGML Open Exchange tables.
# #1997-11-28: maler
# #- Added support for prodgroup and its attributes.
# #- Added support for HTML tables.
# #- Added loc and bibref to content of com.
# #- Added loc to general p content models.
# #- Allowed p as alternative to statusp in status.
# #- Added non-null system IDs to external parameter entity declarations.
# #- (Modified the SGML Open table module to make it XML-compliant.)
# #- (Modified the character entity module.)
# #1997-12-29: maler
# #- Moved #PCDATA occurrences to come before GIs in content models.
# #- Removed use of the SGML Open table module.
# #- Added xspecref element.
# #- Ensured that all FPIs contain 4-digit year.
# #- (Modified the character entity module.)
# #1998-03-10: maler
# #- Merged the character entity and table modules into the main file.
# #- Added ldquo and rdquo entities.
# #- Added common attributes to prodgroup.
# #- Made the email element in header optional.
# #- Removed reference to the SGML Open table model.
# #- Added ednote element.
# #- Added quote element.
# #- Updated XLink usage to reflect 3 March 1998 WD.
# #- Added "local" entities to the class entities for customization.
# #- Parameterized several content models to allow for customization.
# #1998-03-23: maler
# #- Cleaned up some comments and removed some others.
# #- Added xml:space semi-common attribute to eg and bnf elements.
# #- Added show and embed attributes on all the uses of href.
# #- Added %common.att; to all HTML table elements.
# #- Added a real URI to the "typical invocation" comment.
# #1998-05-14: maler
# #- Fixed mdash, ldquo, and rdquo character entities.
# #- Switched to the full HTML 4.0 table model.
# #- Removed htable/htbody elements and replaced them with table/tbody.
# #- Added issue element to %note.class; and declared it.
# #- Allowed prevlocs and latestloc in either order.
# #- Added key-term, htable, htbody, and statusp as unused elements.
# #- Removed real statusp element in favor of plain p.
# #1998-05-21: maler
# #- Declared generic constraint and constraintnote elements.
# #- Added constraintnote to %note.class;.
# #- Added constraint to %eg.pcd.mix; and prod content model.
# #1998-08-22: maler
# #- Fixed %illus.class; to mention table instead of htable.
# #- Added definitions to %illus.class; for DOM model.
# #- Added DOM definitions element and its substructure.
# #- Updated XLink usage in %href.att; to use xlink:form and #IMPLIED.
# #- Added clarifying comments to href-using elements.
# #1998-11-30: maler
# #- Added new unused elements to support DocBook translation.
# #- Updated maler phone numbers.
# #1998-12-3: maler
# #- Fixed character entities with respect to escaping of ampersands.
# #- Added many more explanatory comments.
# #1999-07-02: maler
# #- Added %loc.class; to all PCD mixes that didn't already have it.
# #- Removed unused %loc.pcd.mix;.
# #- Made version in spec header optional.
# #- Added three new attributes to spec.
# #- Broadened content of edtext.
# #- Added optional copyright element to header.
# #- Reorganized XLink-related parameter entities; added xmlns:xlink.
# #- Changed edtext content from #PCDATA to %p.pcd.mix;.
# #- Added show/actuate atts and default values to all href elements.
# #- Changed versioning scheme from 8-digit dates to version numbers.
# #- Added w3c-doctype, other-doctype, status atts to spec element.
# #- Added prodrecap element inside scrap.
# #- Added headstyle attribute to scrap.
# #2000-03-07: maler
# #- Added proto element, its arg subelement, and the %argtypes; entity.
# #- Added function, var, sub, sup, phrase, el, att, attval elements.
# #- Expanded emph to %p.pcd.mix;.
# #- Allowed status and abstract to appear in the opposite order.
# #- Updated XLink usage to the latest WD, except for href and source.
# #- Removed the xml:attributes attribute from graphic.
# #- Added %local.graphic.att; to graphic.
# #- Added common diff attribute.
# #- Added div5 element.
# #- Broadened content models of publoc, prevlocs, and latestloc.
# #- Added head, source, resolution, and status attribute to issue.
# #- Added cr, issues, and dispcmts to w3c-doctype attribute on spec.
# #- Added example element.

# ...............................................................

# End of XML specification DTD ..................................

# ...............................................................
