Licensed under
original work
This paper proposes a change of direction for the markup of the source of the TEI Guidelines; it is put forward as part of the TEI Council’s internal workgroup on the P5 revision of the TEI. We propose that:
- The ODD format should be revised to be entirely independent of the SGML/XML notation for DTDs
- The ODD format and the current TEI DTD for tag documentation
(TSD) should be combined into a single standard TEI tagset
useable as a
pizza topping . - The new notation should be based on one of the XML schema languages.
- Additional processors should be created to make not only XML DTDs (and possibly SGML as well), but also at least one XML schema format.
- Where possible, data types should be converted to use the datatype library of the W3C.
- The Pizza Chef should be rewritten to allow user choice of DTD or schema output.
[Most of this section is from a paper scheduled for delivery at the XML Europe 2002 conference by Sebastian Rahtz].
The original TEI project
concentrated on abstract models of markup, which the editors used SGML
to instantiate, that being the best method available to them at the
time. However, they did their best to insulate themselves from future
changes by formalizing the markup constraints in a small SGML-based
markup language, rather than directly writing DTD code. In this
respect, they followed the
- SGML or XML documentation for the SGML DTD modules, containing
embedded DTD fragments (in the same way that Pascal code is
intermingled with prose in the Web system); this corresponds to the
output from Knuth’s
Weave processor. - SGML or XML documentation for the elements, attributes, and other items in the markup language constituting an alphabetic reference manual.
- the actual DTD modules defining the markup language; this
corresponds to Knuth’s
Tangle processor.
The TEI literate programming system (jocularly named ODD, for One
Document Does it all
) as originally specified is documented
in an internal TEI working paper (
The ODD system consists of a small suite of additional declarations for special purpose elements which are embedded within a special subset of the same basic TEI DTD designed for authoring of new documents.
Amongst the basic building blocks of the ODD extension to TEI
markup are the
<tagDoc id=”BIBL” usage=”opt”> <gi>bibl</gi> <name>bibliographic citation</name> <desc>contains a loosely-structured bibliographic citation of which the sub-components may or may not be explicitly tagged. </desc> <attList/> <exemplum> <p class=”eg”> <bibl>Blain, Clements and Grundy: Feminist Companion to Literature in English (Yale, 1990)</bibl> </p> </exemplum> <exemplum> <p class=”eg”> <bibl> <title level=”a”>The Interesting story of the Children in the Wood</title>. In <author>Victor E Neuberg</author>, <title>The Penny Histories</title>. <publisher>OUP</publisher> <date value=”1968″>1968</date>. </bibl> </p> </exemplum> <remarks/> <part type=”base” name=”core”/> <classes names=”CLBIBL DECLABL”/> <dataDesc>Contains phrase-level elements, together with any combination of elements from the <term>biblPart</term> class</dataDesc> <elemDecl> %om.RO; (#PCDATA | %m.phrase; | %m.biblPart; | %m.Incl;)*</elemDecl> <ptr target=”COBITY”/><ptr target=”HD3″/><ptr target=”TETA”/> <ptr target=”CCAS2″/> </tagDoc>
The start of this is straightforward; a description of the element,
a list of attributes (here empty), and some examples. The next part is
more interesting, as it places
When run through the DTD generator, the following declaration is produced from this tagdoc element:
<!ELEMENT %n.bibl; %om.RO; (#PCDATA | %m.phrase; | %m.biblPart; | %m.Incl;)*> <!ATTLIST %n.bibl; %a.global; %a.declarable; TEIform CDATA ‘bibl’ >
Note here how the name of the element itself has been parameterized
(
<classDoc id=”CLBIBL” type=”model”> <class>bibl</class> <desc>bibliographic elements. </desc> <attList/> <remarks/> <part type=”base” name=”core”/> <classes names=”INTER COMMON”/> <ptr target=”COBI”/> </classDoc>
Although this defines no attributes itself, it does declare itself
to be a member of the class
An example of an element which has `local’ attributes is
<tagDoc id=”FORMULA” usage=”rwa”> <gi>formula</gi> <desc>contains a mathematical or other formula.</desc> <attList> <attDef usage=”opt”><attident>notation</attident> <desc>supplies the name of a previously defined notation used for the content of the element.</desc> <datatype>%formulaNotations;</datatype> <valDesc>The name of a formal notation previously declared in the document type declaration.</valDesc> <default>#REQUIRED</default> <remarks/> </attDef> </attList> <part type=”top” name=”ft”/> <classes names=”PHRASE”/> <dataDesc>The content model for this element is specified by the parameter entity <term>formulaContent</term>, the default value of which is <mentioned>CDATA</mentioned>.</dataDesc> <elemDecl> %om.RR; %formulaContent;</elemDecl> <ptr target=”FTFOR” type=”div1″/> </tagDoc>
The result of this in the DTD is:
<!ELEMENT %n.formula; %om.RR; %formulaContent;> <!ATTLIST %n.formula; %a.global; notation %formulaNotations; #REQUIRED TEIform CDATA ‘formula’ >
in which the
The main body of the Guidelines is a conventional TEI
document with chapters and sections which describe different
parts of the TEI in great detail. Mixed in with informal prose
are references to the
<p>The formula element itself is defined as follows: <dtdFrag id=”DFTFOR” n=”Formulae”> <tagDecl tagDoc=”FORMULA”/> </dtdFrag> </p>
This inserts a summary description of the element at this point in the text; the DTD files themselves are created by a variant on the above, e.g.
<dtdFrag id=”DVE” n=”Base Tag Set for Verse” file=”teivers2.dtd”> <commDecl>First, declare the default text structure, which is the same for verse as it is for other kinds of text. (But declare it only if verse is the only base.)</commDecl> <msection keywords=”%TEI.singleBase;”> <entDecl entDoc=”TEISTR”/> <peRef n=”TEI.structure.dtd”/> </msection> <commDecl>Finally, declare the elements specific to this base tag set</commDecl> <dtdRef dtdFrag=”DVEST”/> <dtdRef dtdFrag=”DVESE”/> </dtdFrag>
This determines in what order elements are placed in
separate files of the DTD suite, and in what marked sections
(using
It should be clear from this brief overview of TEI literate programming that the current model has three main characteristics:
- A class system for classifying elements and attributes which is essentially independent of SGML or XML;
- Markup for describing attributes and DTD files which is
expressed in XML, but is quite closely tied to DTD notation (e.g.
the datatype of
%formulaNotations; informula ) - A bottom-level element,
elemDecl , which contains literal DTD code
The original aim of the TEI editors in trying to make the scheme independent of the current SGML/XML instantiation is not, in our view, completely successful; nevertheless, it provides a plausible framework for the generation of versions of the TEI Guidelines expressed using other metalanguages.
The main difficulty with the current ODD scheme is
the
should actually be
if the DTD were to easily derived. In practice, the %n… is
added by an
If the TEI Guidelines were maintained in
The
Finally, we may note that the fact that the eventual TEI DTDs are constructed from different types of data makes it necessary for the TEI Pizza Chef to use an entirely new program (
) to e.g. remove unused elements from
subset DTDs. Ideally, we would like to do this work from the TEI
source itself, since this would allow us to construct
We propose that the content of all
- We could perform deeper validation of the TEI Guidelines
- We could representations of the constraint model in forms other than DTD much more easily
- We could write a new Pizza Chef which extracted documention and constraint subsets at the same time
- We could experiment with using other XML vocabularies alongside the TEI, by using XML namespaces; obvious examples are MathML and SVG. Selective validation should be possible.
- We would have an opportunity to add more extensive datatyping and subtler constraints than are currently possible, possibly allowing us to re-express some of the descriptive text as formal constraints.
The downsides are:
- The replacement language will be unfamiliar,
and is likely to be
much more verbose (DTD is very succinct), which imposes a burden on the TEI editors, workgroup authors, and readers - The process of getting back to where we are now (DTDs) becomes more complex and opaque (ie we can no longer directly compare the DTD with the Guidelines text)
We suggest that these are fairly short-term problems which should not stop us proceeding.
What markup should we use for the new work? We have three choices:
- Use an existing notation for specifying constraints. UML is the obvious choice.
- Use fragments of an existing schema language, such as W3C schema, or RelaxNG.
- Invent a new language of our own
The first choice imposes the most problems, as we have no prior experience
to show that we
Our natural course is to invent a new language, but it seems an intolerable burden on the TEI to replicate the many man-years of labour recently devoted to the subject in the XML community. Therefore it seems sensible to adopt the notation, if not the full panoply, of an existing language.
As a preparation for this paper, we undertook a complete conversion of the P4 sources to a form based on RelaxNG. This demonstrates the feasibility of the idea, and points towards some of the work which will have to be done. It is discussed in the following sections.
The major job in the conversion is
the extraction of
%om.RO; (#PCDATA | %m.dictionaryParts; | %m.phrase; | %m.inter; | %m.Incl;)*
to an intermediate XML form of
<schema> <group> <text/> <seqbar/> <element name=”%m.dictionaryParts;”/> <seqbar/> <element name=”%m.phrase;”/> <seqbar/> <element name=”%m.inter;”/> <seqbar/> <element name=”%m.Incl;”/> </group> <repstar/> </schema>
This can be converted, using an XSLT program, to
<rng:zeroOrMore xmlns:rng=”http://relaxng.org/ns/structure/1.0″ xmlns:ext=”http://www.tei-c.org/relaxng/1.0″> <rng:choice> <rng:text/> <rng:ref ext:class=”entity” name=”m.dictionaryParts”/> <rng:ref ext:class=”entity” name=”m.phrase”/> <rng:ref ext:class=”entity” name=”m.inter”/> <rng:ref ext:class=”entity” name=”m.Incl”/> </rng:choice> </rng:zeroOrMore>
An extra bit of data has been added here
(in its own namespace), the `rend’ attribute;
this is put in to allow us to recreate the DTD at a later stage. In
our use of RelaxNG, <rng:ref name="foo"/>
would turn
simply into the name `foo’ in a DTD, whereas
<rng:ref class="entity" name="foo"/>
turns into `%foo;’. There are a number of small inelegancies like this
in the system we have developed, dictated either by the need
to allow for back-translation to DTD, or by the presence
of partial content models like | foo | bar
.
When the fragments of content model have been put back into the
main text, we can constrast the old
declaration of the
with the new
Note the `omit’ attribute which is added to allow for recreating SGML DTDs.
The remaining task was to rewrite the existing DTD generator to
reconstruct content models from the Relax NG elements, and to write a
new processor which extracts all the Relax fragments and creates a set
of useable schema files. This was straightforward, but ugly, as we did
nothing to change the datatypes, for instance, from their SGML
notations. Similarly, the Guidelines use such SGML/XML literals as
#IMPLIED
or #REQUIRED
, which need
interpreting. Ideally, these would be re-expressed in some more
neutral form. However, a relatively simple XSLT script suffices to
produce schemas which are acceptable to the Relax NG processors. This
final stage was debugged by comparing the results with conversions of
the TEI DTDs made by James Clark’s
The TEI Consortium’s Board and Council now need to decide:
- Whether to change the markup language for P5 at all, but to continue with DTD language internally, and derive schemas from the DTDs.
- If we proceed, which schema or other language to use
- Whether the printed Guidelines should show DTD content models or schemas (or some other abstract notation)
- What timescale to use for the work
- %om.RO; ((%m.divtop; | %m.Incl;)*, (%component;, (%m.Incl;)*)+, ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ((cell|table), (%m.Incl;)*)+ (occurrences: 1)
- %om.RO; (pubPlace | publisher | date | biblScope | %m.Incl;)* (occurrences: 1)
- %om.RO; ((%m.terminologyMisc; | %m.Incl;)*, (otherForm, (gram | %m.Incl;)*), ((%m.terminologyMisc;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ( ( p, (%m.Incl;)*)+ | ( (publisher | distributor | authority | pubPlace | address | idno | availability | date ), (%m.Incl;)*)+ ) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl;)*, ( ((div7 | divGen), (%m.Incl;)*)+ | ( (%component;, (%m.Incl;)*)+, ((div7 | divGen), (%m.Incl;)*)*)), ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ( (%m.terminologyMisc; | otherForm | gram | %m.terminologyInclusions; | %m.Incl;)*, (term, (%m.terminologyMisc; | otherForm | gram | %m.terminologyInclusions; | %m.Incl;)* )+ ) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (head, (%m.Incl;)*)?,((l|lg2),(%m.Incl;)*)+) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (head, (%m.Incl;)*)?,((l|lg3),(%m.Incl;)*)+) (occurrences: 1)
- %om.RO; ((%m.terminologyMisc;| %m.terminologyInclusions; | %m.Incl;)*, (term, (gram | %m.terminologyInclusions; | %m.Incl;)*), ((%m.terminologyMisc;), (%m.terminologyInclusions; | %m.Incl;)*)*, (ofig, (%m.terminologyInclusions; | %m.Incl;)*)*) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl;)*, ( ((div1 | divGen), (%m.Incl;)*)+ | ( (%component;, (%m.Incl;)*)+, ((div1 | divGen), (%m.Incl;)*)*)), ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl;)*, ( ((div4 | divGen), (%m.Incl;)*)+ | ( (%component;, (%m.Incl;)*)+, ((div4 | divGen), (%m.Incl;)*)*)), ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl;)*, ( ((div5 | divGen), (%m.Incl;)*)+ | ( (%component;, (%m.Incl;)*)+, ((div5 | divGen), (%m.Incl;)*)*)), ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ((%m.terminologyMisc; | %m.terminologyInclusions; | %m.Incl;)*, (tig, (%m.Incl; | %m.terminologyInclusions;)*)+) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl;)*, ( ((div2 | divGen), (%m.Incl;)*)+ | ( (%component;, (%m.Incl;)*)+, ((div2 | divGen), (%m.Incl;)*)*)), ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl;)*, ( ((div3 | divGen), (%m.Incl;)*)+ | ( (%component;, (%m.Incl;)*)+, ((div3 | divGen), (%m.Incl;)*)*)), ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; %paraContent; (occurrences: 43)
- %om.RO; %phrase.seq; (occurrences: 47)
- %om.RO; %specialPara; (occurrences: 4)
- %om.RO; ( #PCDATA | %m.phrase; | %m.inter; | %m.Incl; | %m.fragmentary; )* (occurrences: 2)
- %om.RO; ( #PCDATA | %m.phrase; | %m.inter; | %m.dictionaryParts; | %m.Incl; )* (occurrences: 1)
- %om.RO; ( #PCDATA | %m.phrase; | %m.inter; | usg | lbl | %m.Incl; )* (occurrences: 1)
- %om.RO; ( #PCDATA | %m.phrase; | %m.inter; | usg | lbl | def | trans | tr | %m.morphInfo; | eg | xr | %m.Incl; )* (occurrences: 1)
- %om.RO; ( #PCDATA | sense | %m.dictionaryTopLevel; | %m.phrase; | %m.Incl; )* (occurrences: 1)
- %om.RO; ( (%m.Incl;)*, (lem, (%m.Incl;)*, (wit, (%m.Incl;)*)? )?, ( (rdg, (%m.Incl;)*, (wit, (%m.Incl;)*)? ) | (rdgGrp, (%m.Incl;)*, (wit, (%m.Incl;)*)? ) )+) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl;)*, ( ((div6 | divGen), (%m.Incl;)*)+ | ( (%component;, (%m.Incl;)*)+, ((div6 | divGen), (%m.Incl;)*)*)), ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ( channel, constitution, derivation, domain, factuality, interaction, preparedness, purpose+ ) (occurrences: 1)
- %om.RO; ( codedCharSet*, baseWsd*, entitySet*, exceptions? ) (occurrences: 1)
- %om.RO; ( q | quote | cit | %m.dictionaryParts; | %m.formPointers; )+ (occurrences: 1)
- %om.RO; (#PCDATA | line | col)* (occurrences: 1)
- %om.RO; (#PCDATA | line)* (occurrences: 1)
- %om.RO; (#PCDATA | title | editor | respStmt | biblScope | %m.Incl;)* (occurrences: 1)
- %om.RO; (#PCDATA) (occurrences: 19)
- %om.RO; (%m.featureVal;) (occurrences: 1)
- %om.RO; (( (%m.Incl;)*, (( (author | editor | respStmt), (author | editor | respStmt | %m.Incl;)*, (title, (%m.Incl;)*)+, ( (editor | respStmt), (%m.Incl;)* )* ) |( (title, (%m.Incl;)*)+, ((author | editor | respStmt), (%m.Incl;)*)* )))?, ((note | meeting), (%m.Incl;)*)*, (edition, (editor | respStmt | %m.Incl;)*)*, imprint, (imprint | extent | biblScope | %m.Incl;)* ) (occurrences: 1)
- %om.RO; ((%component.seq;) | (symbol+)) (occurrences: 1)
- %om.RO; ((form?, entry+)| dictScrap) (occurrences: 1)
- %om.RO; ((fs | f | fAlt), iff, (fs | f | fAlt)) (occurrences: 1)
- %om.RO; ((fs | f | fAlt), then, (fs | f | fAlt)) (occurrences: 1)
- %om.RO; ((tagDoc | entDoc | classDoc)+) (occurrences: 1)
- %om.RO; (character*) (occurrences: 1)
- %om.RO; (desc*, form+, note*) (occurrences: 1)
- %om.RO; (desc+, (figure | extFigure)*, note*) (occurrences: 1)
- %om.RO; (hand*) (occurrences: 1)
- %om.RO; (teiHeader+) (occurrences: 1)
- %om.RO; (teiHeader, TEI.2+) (occurrences: 1)
- %om.RO; (teiHeader, text) (occurrences: 1)
- %om.RO; EMPTY (occurrences: 67)
- %om.RO; ( (%m.front; | %m.Incl;)*, ( ( (%m.divtop;), (%m.divtop; | titlePage | %m.Incl;)*) | ( div, (div | %m.front; | %m.Incl;)*) | ( div1, (div1 | %m.front; | %m.Incl;)*) )?, (trailer | closer)* ) (occurrences: 1)
- %om.RO; ( (%m.front; | %m.Incl;)*, (( (%m.fmchunk;), (%m.fmchunk; | titlePage | %m.Incl;)*) | ( div, (div | %m.front; | %m.Incl;)* ) | ( div1, (div1 | %m.front; | %m.Incl; )*))?) (occurrences: 1)
- %om.RO; ( #PCDATA | %m.dictionaryParts; | %m.phrase; | %m.inter; | %m.Incl; )* (occurrences: 2)
- %om.RO; ( #PCDATA | date | time | name | address | %m.Incl; )* (occurrences: 1)
- %om.RO; ( (%m.Incl;)*, ( (addrLine, (%m.Incl;)*)+ | ((%m.addrPart;), (%m.Incl;)*)* ) ) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl; )*, (((div|divGen), (%m.Incl;)*)+ | ((%component;, (%m.Incl;)*)+, ((div|divGen), (%m.Incl;)*)*)), ((%m.divbot;),(%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ( (%m.divtop; | %m.Incl;)*, ( ( ((%component;), (%m.Incl;)*)+, ((divGen, (%m.Incl;)*)*, ( (div, (div|divGen|%m.Incl;)*) | (div0, (div0|divGen|%m.Incl;)*) | (div1, (div1|divGen|%m.Incl;)*) )? )) | ((divGen, (%m.Incl;)*)*, ((div, (div|divGen|%m.Incl;)*) | (div0, (div0|divGen|%m.Incl;)*) | (div1, (div1|divGen|%m.Incl;)*) ))), ((%m.divbot;), (%m.Incl;)*)* ) (occurrences: 1)
- %om.RO; ( (edition, respStmt*) | p+ ) (occurrences: 1)
- %om.RO; ( (title+, (idno | respStmt)*) | p+ ) (occurrences: 1)
- %om.RO; ( hom | sense | %m.dictionaryTopLevel; | %m.Incl; )+ (occurrences: 1)
- %om.RO; ( null | ( plus | minus | any | none | dft | uncertain | sym | nbr | msr | rate | str | vAlt | alt | fs )* ) (occurrences: 1)
- %om.RO; ( p+ | ( (person | personGrp)+, particLinks? ) ) (occurrences: 1)
- %om.RO; ( p+ | ((correction | normalization | quotation | hyphenation | interpretation | segmentation | stdVals)+, p*)) (occurrences: 1)
- %om.RO; ( sense | %m.dictionaryTopLevel; )* (occurrences: 1)
- %om.RO; (#PCDATA | %m.phrase; | %m.biblPart; | %m.Incl;)* (occurrences: 1)
- %om.RO; (#PCDATA | %m.phrase; | argument | byline | dateline | epigraph | salute | signed | %m.Incl;)* (occurrences: 1)
- %om.RO; (#PCDATA | %m.phrase; | docAuthor | %m.Incl;)* (occurrences: 1)
- %om.RO; (#PCDATA | %m.phrase; | pubPlace | docDate | publisher | %m.Incl;)* (occurrences: 1)
- %om.RO; (#PCDATA | %m.phrase; | textDesc )* (occurrences: 1)
- %om.RO; (#PCDATA | role | roleDesc | actor | %m.phrase; | %m.Incl; )* (occurrences: 1)
- %om.RO; (#PCDATA | signed | dateline | salute | %m.phrase; | %m.Incl;)* (occurrences: 1)
- %om.RO; (%component.seq;) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, ( (rdgGrp, (%m.Incl;)*) | (rdg, (%m.Incl;)*, (wit, (%m.Incl;)*)?) )+) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (%m.tpParts;), (%m.tpParts; | %m.Incl;)*) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (analytic, (%m.Incl;)*)?, ((monogr, (%m.Incl;)*), (series, (%m.Incl;)*)*)+, ((note, (%m.Incl;)*) | (idno, (%m.Incl;)*))*) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (head, (%m.Incl;)*)?,((l|lg4),(%m.Incl;)*)+) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (head, (%m.Incl;)*)?,((l|lg5),(%m.Incl;)*)+) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (head, (%m.Incl;)*)?,(l,(%m.Incl;)*)+) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (speaker, (%m.Incl;)*)?, ((p | l | lg | ab | seg | stage), (%m.Incl;)*)+) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (titlePart, (%m.Incl;)*)+) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (titleStmt, (%m.Incl;)*), (editionStmt, (%m.Incl;)*)?, (extent, (%m.Incl;)*)?, (publicationStmt, (%m.Incl;)*), (seriesStmt, (%m.Incl;)*)?, (notesStmt, (%m.Incl;)*)?, (sourceDesc, (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ((%m.Incl;)*, (witness, (%m.Incl;)*)+) (occurrences: 1)
- %om.RO; ((%m.divtop; | %m.Incl;)*, (l | lg), (l | lg | %m.Incl;)*, ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ((%m.divtop; | %m.Incl;)*, ((text | group), (text|group|%m.Incl;)*), ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RO; ((title+, (author | editor | sponsor | funder | principal | respStmt)*)) (occurrences: 1)
- %om.RO; (attDef*) (occurrences: 1)
- %om.RO; (attName, rs?, desc, (datatype, (valList | valDesc)?), default, eg?, remarks?, equiv*) (occurrences: 1)
- %om.RO; (author | editor | respStmt | title | %m.Incl;)* (occurrences: 1)
- %om.RO; (class, rs?, desc, attList?, remarks?, part?, classes?, files?, ptr*, equiv*) (occurrences: 1)
- %om.RO; (date, respStmt+, item) (occurrences: 1)
- %om.RO; (note+) (occurrences: 1)
- %om.RO; (p | language)+ (occurrences: 1)
- %om.RO; (p+ | relation+) (occurrences: 1)
- %om.RO; (p+ | (%m.demographic;)* ) (occurrences: 2)
- %om.RO; (p+ | setting+) (occurrences: 1)
- %om.RO; (p+ | step+ | state+) (occurrences: 1)
- %om.RO; (p+) (occurrences: 11)
- %om.RO; (rendition*, tagUsage*) (occurrences: 1)
- %om.RO; (resp | name | %m.Incl;)+ (occurrences: 1)
- %om.RO; (term+ | list) (occurrences: 1)
- %om.RR; %paraContent; (occurrences: 16)
- %om.RR; %phrase.seq; (occurrences: 40)
- %om.RR; %specialPara; (occurrences: 6)
- %om.RR; ( #PCDATA | %m.phrase; | %m.inter; | %m.formInfo; | %m.Incl; )* (occurrences: 1)
- %om.RR; (#PCDATA | %m.temporalExpr; | %m.Incl;)* (occurrences: 2)
- %om.RR; (#PCDATA | oRef)* (occurrences: 1)
- %om.RR; (#PCDATA | pRef)* (occurrences: 1)
- %om.RR; (#PCDATA | page | vol)* (occurrences: 1)
- %om.RR; (#PCDATA | page)* (occurrences: 1)
- %om.RR; (#PCDATA) (occurrences: 17)
- %om.RR; ((fs | f | fAlt), then, (%m.featureVal;) ) (occurrences: 1)
- %om.RR; (cond | bicond)* (occurrences: 1)
- %om.RR; (creation?, langUsage*, textDesc*,particDesc*, settingDesc*, handList*, textClass*) (occurrences: 1)
- %om.RR; (fDescr?, vRange, vDefault?) (occurrences: 1)
- %om.RR; (fsDescr?, fDecl+, fsConstraints?) (occurrences: 1)
- %om.RR; (language, script, direction*, characters, note*) (occurrences: 1)
- %om.RR; %formulaContent; (occurrences: 1)
- %om.RR; ( (( node, (%m.Incl;)* )+, ( arc, (%m.Incl;)* )*) | (( arc, (%m.Incl;)* )+, ( node, (%m.Incl;)* )+)) (occurrences: 1)
- %om.RR; ( #PCDATA | %m.Incl; )* (occurrences: 1)
- %om.RR; ( #PCDATA | %m.personPart; | %m.phrase; | %m.Incl; )* (occurrences: 1)
- %om.RR; ( #PCDATA | %m.placePart; | %m.phrase; | %m.Incl; )* (occurrences: 1)
- %om.RR; ( #PCDATA | orgTitle | orgType | orgDivn | %m.phrase; | %m.Incl; )* (occurrences: 1)
- %om.RR; ( #PCDATA | sense | %m.dictionaryTopLevel; | %m.phrase; | %m.Incl; )* (occurrences: 1)
- %om.RR; ( (q | quote | %m.bibl; | %m.loc; | %m.Incl; )+) (occurrences: 1)
- %om.RR; (#PCDATA | %m.phrase; | %m.comp.spoken; | %m.Incl;)* (occurrences: 1)
- %om.RR; (#PCDATA | %m.phrase; | %m.inter; | %m.gramInfo; | %m.Incl;)* (occurrences: 1)
- %om.RR; (#PCDATA | geog | name | %m.Incl; )* (occurrences: 1)
- %om.RR; (#PCDATA | seg | c | %m.Incl;)* (occurrences: 1)
- %om.RR; (#PCDATA | seg | w | m | c | %m.Incl;)* (occurrences: 1)
- %om.RR; (%component.seq;) (occurrences: 1)
- %om.RR; ((%m.Incl;)*, (head, (%m.Incl;)*)?, (p, (%m.Incl;)*)*, (figDesc, (%m.Incl;)*)?, (text, (%m.Incl;)*)?) (occurrences: 1)
- %om.RR; ((%m.Incl;)*, (front, (%m.Incl;)*)?, (body | group), (%m.Incl;)*, (back, (%m.Incl;)*)?) (occurrences: 1)
- %om.RR; ((%m.Incl;)*, (head, (%m.Incl;)*)?, ((castItem | castGroup), (%m.Incl;)*)+, (trailer, (%m.Incl;)*)?) (occurrences: 1)
- %om.RR; ((%m.Incl;)*, (head, (%m.Incl;)*)?, (bibl | biblStruct | biblFull), (bibl | biblStruct | biblFull | %m.Incl;)*, (trailer, (%m.Incl;)*)?) (occurrences: 1)
- %om.RR; ((%m.Incl;)*, (head, (%m.Incl;)*)?, ( ( (item, (%m.Incl;)*)*) | ((headLabel, (%m.Incl;)*)?, (headItem, (%m.Incl;)*)?, (label, (%m.Incl;)*, item, (%m.Incl;)*)+))) (occurrences: 1)
- %om.RR; ((%m.Incl;)*, (head?, %component.seq;)) (occurrences: 1)
- %om.RR; ((%m.Incl;)*, head?, %component.seq;) (occurrences: 1)
- %om.RR; ((%m.divtop; | %m.Incl;)*, ((%component;), (%m.Incl;)*)*, ((castItem | castGroup), (%m.Incl;)*)+, ((%component;), (%m.Incl;)*)*) (occurrences: 1)
- %om.RR; ((%m.divtop; | %m.Incl;)*, ((%component;), (%m.Incl;)*)+, ((%m.divbot;), (%m.Incl;)*)*) (occurrences: 3)
- %om.RR; ((%m.featureVal;)+ | if+) (occurrences: 1)
- %om.RR; ((alt | ptr | xptr)*) (occurrences: 1)
- %om.RR; ((classCode | catRef | keywords)* ) (occurrences: 1)
- %om.RR; ((eTree | triangle | eLeaf )*) (occurrences: 1)
- %om.RR; ((eTree | triangle | eLeaf)*) (occurrences: 1)
- %om.RR; ((f | fAlt | alt)*) (occurrences: 1)
- %om.RR; ((f | fAlt)*) (occurrences: 1)
- %om.RR; ((f | fs | fAlt), (f | fs | fAlt)+) (occurrences: 1)
- %om.RR; ((forest)+) (occurrences: 1)
- %om.RR; ((fs | vAlt)*) (occurrences: 1)
- %om.RR; ((head | %m.Incl;)*, (row, (%m.Incl;)*)+) (occurrences: 1)
- %om.RR; ((interp)*) (occurrences: 1)
- %om.RR; ((join | ptr | xptr)*) (occurrences: 1)
- %om.RR; ((leaf | iNode)*, root, (leaf | iNode)*) (occurrences: 1)
- %om.RR; ((plus | minus | any | none | dft | uncertain | null | sym | nbr | msr | rate | str | vAlt)*) (occurrences: 1)
- %om.RR; ((plus | minus | any | none | dft | uncertain | null | sym | nbr | msr | rate | str | vAlt | fs), (plus | minus | any | none | dft | uncertain | null | sym | nbr | msr | rate | str | vAlt | fs)+) (occurrences: 1)
- %om.RR; ((span)*) (occurrences: 1)
- %om.RR; ((tree | eTree | triangle)+) (occurrences: 1)
- %om.RR; ((val,desc)*) (occurrences: 1)
- %om.RR; (catDesc, category*) (occurrences: 1)
- %om.RR; (category+ | ((bibl | biblStruct | biblFull), category*)) (occurrences: 1)
- %om.RR; (entName, rs?, desc, remarks?, string, ptr*, equiv*) (occurrences: 1)
- %om.RR; (fileDesc, encodingDesc*, profileDesc*, revisionDesc?) (occurrences: 1)
- %om.RR; (gi, rs?, desc, attList?, exemplum*, remarks?, part?, classes?, files?, dataDesc?, parents?, children?, elemDecl, attlDecl?, ptr*, equiv*) (occurrences: 1)
- %om.RR; (link | ptr | xptr)+ (occurrences: 1)
- %om.RR; (list | change+) (occurrences: 1)
- %om.RR; (p | bibl | biblFull | biblStruct | listBibl | scriptStmt | recordingStmt )+ (occurrences: 1)
- %om.RR; (p*, eg, p*) (occurrences: 1)
- %om.RR; (p+ | (name | time | date | locale | activity)* ) (occurrences: 1)
- %om.RR; (p+ | (respStmt | equipment | broadcast | date)*) (occurrences: 1)
- %om.RR; (p+ | bibl | biblFull | biblStruct) (occurrences: 1)
- %om.RR; (p+ | bibl | biblStruct | biblFull | recording) (occurrences: 1)
- %om.RR; (p+ | recording+ ) (occurrences: 1)
- %om.RR; (projectDesc*, samplingDecl*, editorialDecl*, tagsDecl?, refsDecl*, classDecl*, metDecl*, fsdDecl*, variantEncoding*, p* ) (occurrences: 1)
- %om.RR; (taxonomy+) (occurrences: 1)
- %om.RR; (teiHeader, fsDecl+) (occurrences: 1)
- %om.RR; (titleStmt, editionStmt?, extent?, publicationStmt, seriesStmt?, notesStmt?, sourceDesc+ ) (occurrences: 1)
- %om.RR; (when)+ (occurrences: 1)
- %ISO-date; (occurrences: 6)
- %extPtr; (occurrences: 4)
- %formulaNotations; (occurrences: 1)
- ( Y | N ) (occurrences: 1)
- ( Y | N | U ) (occurrences: 1)
- ( YES | NO ) (occurrences: 1)
- ( all | one | none ) (occurrences: 1)
- ( all | some | none ) (occurrences: 1)
- ( free | unknown | restricted ) (occurrences: 1)
- ( light | sound | prop | block ) (occurrences: 1)
- ( m | f | u ) (occurrences: 1)
- ( m | f | u | x ) (occurrences: 1)
- ( none | some | all ) (occurrences: 1)
- ( silent | tags ) (occurrences: 1)
- ( y | n | u ) (occurrences: 5)
- ( yes | no ) (occurrences: 1)
- (Y | N | I | M | F) (occurrences: 4)
- (Y | N | U) (occurrences: 1)
- (Y | N | partial) (occurrences: 1)
- (Y | N) (occurrences: 3)
- (Y|N) (occurrences: 2)
- (a | m | j | s | u) (occurrences: 1)
- (am | pm | 24hour | descriptive) (occurrences: 1)
- (audio | video) (occurrences: 1)
- (closed | semi | open) (occurrences: 1)
- (composite | uniform) (occurrences: 1)
- (data | rend | std | nonstd | unknown) (occurrences: 1)
- (eq|ne) (occurrences: 1)
- (eq|ne|gt|ge|lt|le) (occurrences: 1)
- (eq|ne|lt|le|gt|ge) (occurrences: 2)
- (eq|ne|sb|ns) (occurrences: 2)
- (eq|ne|sb|ns|lt|le|gt|ge) (occurrences: 1)
- (excl|incl) (occurrences: 2)
- (fiction|fact|mixed|inapplicable) (occurrences: 1)
- (high | medium | low | unknown) (occurrences: 2)
- (horizontal | vertical) (occurrences: 1)
- (initial | medial | final | unknown | complete) (occurrences: 1)
- (internal | external) (occurrences: 1)
- (int|real) (occurrences: 3)
- (lexical | punc | lexpunc | digit | space | DL | LD | dia | joiner | other) (occurrences: 1)
- (location-referenced | double-end-point | parallel-segmentation) (occurrences: 1)
- (model | atts | both) (occurrences: 1)
- (new | update) (occurrences: 1)
- (none|partial|complete|inapplicable) (occurrences: 1)
- (pe | ge) (occurrences: 1)
- (perc|real) (occurrences: 2)
- (req|mwa|rec|rwa|opt) (occurrences: 2)
- (role | list) (occurrences: 1)
- (root | branches) (occurrences: 1)
- (s | w | ws | sw | m | x) (occurrences: 1)
- (silent | tags) (occurrences: 1)
- (single | composite | frags | unknown) (occurrences: 1)
- (single|set|bag|list) (occurrences: 1)
- (smooth | latching | overlap | pause) (occurrences: 1)
- (tei | iso | national | private | none) (occurrences: 1)
- (tempo | loud | pitch | tension | rhythm | voice) (occurrences: 1)
- (to|from|both|none) (occurrences: 2)
- (unit | set | bag | list) (occurrences: 1)
- (y | n | unspecified) (occurrences: 1)
- (y | n) (occurrences: 1)
- (yes | abb | init) (occurrences: 3)
- (yes | no) (occurrences: 1)
- (yes|no) (occurrences: 2)
- CDATA (occurrences: 326)
- ENTITIES (occurrences: 2)
- ENTITY (occurrences: 4)
- ID (occurrences: 2)
- IDREF (occurrences: 73)
- IDREFS (occurrences: 34)
- NAME (occurrences: 1)
- NMTOKEN (occurrences: 3)
- NMTOKENS (occurrences: 1)
- #IMPLIED (occurrences: 364)
- #REQUIRED (occurrences: 57)
- %INHERITED; (occurrences: 43)
- ‘unspecified’ (occurrences: 1)
- 1 (occurrences: 2)
- DITTO (occurrences: 2)
- N (occurrences: 4)
- NO (occurrences: 1)
- ROOT (occurrences: 1)
- TEI.2 (occurrences: 1)
- U (occurrences: 2)
- Y (occurrences: 3)
- all (occurrences: 1)
- apparatus (occurrences: 1)
- audio (occurrences: 1)
- complete (occurrences: 1)
- data (occurrences: 2)
- editor (occurrences: 1)
- eq (occurrences: 6)
- excl (occurrences: 1)
- full (occurrences: 2)
- lexical (occurrences: 1)
- main (occurrences: 2)
- met real (occurrences: 1)
- n (occurrences: 4)
- new (occurrences: 1)
- normal (occurrences: 1)
- open (occurrences: 1)
- opt (occurrences: 2)
- perc (occurrences: 1)
- personal (occurrences: 1)
- role (occurrences: 1)
- root (occurrences: 1)
- sb (occurrences: 1)
- silent (occurrences: 2)
- simple (occurrences: 1)
- single (occurrences: 1)
- smooth (occurrences: 1)
- some (occurrences: 1)
- text (occurrences: 1)
- u (occurrences: 1)
- uniform (occurrences: 1)
- unit (occurrences: 1)
- unknown (occurrences: 3)
- unremarkable (occurrences: 2)
- unspecified (occurrences: 1)
- x (occurrences: 1)
- yes (occurrences: 7)
- %ISO-date; (occurrences: 6)
- %extPtr; (occurrences: 4)
- %formulaNotations; (occurrences: 1)
- ( Y | N ) (occurrences: 1)
- ( Y | N | U ) (occurrences: 1)
- ( YES | NO ) (occurrences: 1)
- ( all | one | none ) (occurrences: 1)
- ( all | some | none ) (occurrences: 1)
- ( free | unknown | restricted ) (occurrences: 1)
- ( light | sound | prop | block ) (occurrences: 1)
- ( m | f | u ) (occurrences: 1)
- ( m | f | u | x ) (occurrences: 1)
- ( none | some | all ) (occurrences: 1)
- ( silent | tags ) (occurrences: 1)
- ( y | n | u ) (occurrences: 5)
- ( yes | no ) (occurrences: 1)
- (Y | N | I | M | F) (occurrences: 4)
- (Y | N | U) (occurrences: 1)
- (Y | N | partial) (occurrences: 1)
- (Y | N) (occurrences: 3)
- (Y|N) (occurrences: 2)
- (a | m | j | s | u) (occurrences: 1)
- (am | pm | 24hour | descriptive) (occurrences: 1)
- (audio | video) (occurrences: 1)
- (closed | semi | open) (occurrences: 1)
- (composite | uniform) (occurrences: 1)
- (data | rend | std | nonstd | unknown) (occurrences: 1)
- (eq|ne) (occurrences: 1)
- (eq|ne|gt|ge|lt|le) (occurrences: 1)
- (eq|ne|lt|le|gt|ge) (occurrences: 2)
- (eq|ne|sb|ns) (occurrences: 2)
- (eq|ne|sb|ns|lt|le|gt|ge) (occurrences: 1)
- (excl|incl) (occurrences: 2)
- (fiction|fact|mixed|inapplicable) (occurrences: 1)
- (high | medium | low | unknown) (occurrences: 2)
- (horizontal | vertical) (occurrences: 1)
- (initial | medial | final | unknown | complete) (occurrences: 1)
- (internal | external) (occurrences: 1)
- (int|real) (occurrences: 3)
- (lexical | punc | lexpunc | digit | space | DL | LD | dia | joiner | other) (occurrences: 1)
- (location-referenced | double-end-point | parallel-segmentation) (occurrences: 1)
- (model | atts | both) (occurrences: 1)
- (new | update) (occurrences: 1)
- (none|partial|complete|inapplicable) (occurrences: 1)
- (pe | ge) (occurrences: 1)
- (perc|real) (occurrences: 2)
- (req|mwa|rec|rwa|opt) (occurrences: 2)
- (role | list) (occurrences: 1)
- (root | branches) (occurrences: 1)
- (s | w | ws | sw | m | x) (occurrences: 1)
- (silent | tags) (occurrences: 1)
- (single | composite | frags | unknown) (occurrences: 1)
- (single|set|bag|list) (occurrences: 1)
- (smooth | latching | overlap | pause) (occurrences: 1)
- (tei | iso | national | private | none) (occurrences: 1)
- (tempo | loud | pitch | tension | rhythm | voice) (occurrences: 1)
- (to|from|both|none) (occurrences: 2)
- (unit | set | bag | list) (occurrences: 1)
- (y | n | unspecified) (occurrences: 1)
- (y | n) (occurrences: 1)
- (yes | abb | init) (occurrences: 3)
- (yes | no) (occurrences: 1)
- (yes|no) (occurrences: 2)
- CDATA (occurrences: 326)
- ENTITIES (occurrences: 2)
- ENTITY (occurrences: 4)
- ID (occurrences: 2)
- IDREF (occurrences: 73)
- IDREFS (occurrences: 34)
- NAME (occurrences: 1)
- NMTOKEN (occurrences: 3)
- NMTOKENS (occurrences: 1)