summaryrefslogtreecommitdiff
path: root/test/valid/dtds
diff options
context:
space:
mode:
authorMike Hommey <mh@glandium.org>2004-03-25 06:59:32 +0000
committerMike Hommey <mh@glandium.org>2004-03-25 06:59:32 +0000
commitd09ab089457ae3c20cc98f9afa03379c6ebf9598 (patch)
treef34702d634972abbc1b478a4529149b548a1cd4c /test/valid/dtds
downloadlibxml2-upstream/2.6.8.tar.gz
[svn-inject] Installing original source versionupstream/2.6.8
Diffstat (limited to 'test/valid/dtds')
-rw-r--r--test/valid/dtds/127772.dtd7
-rw-r--r--test/valid/dtds/NewsMLv1.0.dtd1578
-rw-r--r--test/valid/dtds/destfoo.ent1
-rw-r--r--test/valid/dtds/nitf-2-5.dtd1004
-rwxr-xr-xtest/valid/dtds/spec.dtd972
-rw-r--r--test/valid/dtds/xhtml-lat1.ent196
-rw-r--r--test/valid/dtds/xhtml-special.ent79
-rw-r--r--test/valid/dtds/xhtml-symbol.ent242
-rw-r--r--test/valid/dtds/xhtml.cat14
-rw-r--r--test/valid/dtds/xhtml1-frameset.dtd1223
-rw-r--r--test/valid/dtds/xhtml1-strict.dtd986
-rw-r--r--test/valid/dtds/xhtml1-transitional.dtd1194
-rw-r--r--test/valid/dtds/xhtml1.dcl179
-rw-r--r--test/valid/dtds/xmlspec.dtd1102
14 files changed, 8777 insertions, 0 deletions
diff --git a/test/valid/dtds/127772.dtd b/test/valid/dtds/127772.dtd
new file mode 100644
index 0000000..873fb35
--- /dev/null
+++ b/test/valid/dtds/127772.dtd
@@ -0,0 +1,7 @@
+<!ELEMENT a (b*)>
+
+<!ELEMENT b (#PCDATA)>
+<!ATTLIST b xmlns:xlink CDATA #FIXED 'http://www.w3.org/1999/xlink'
+ xlink:type (simple) #FIXED 'simple'
+ xlink:href CDATA #IMPLIED>
+
diff --git a/test/valid/dtds/NewsMLv1.0.dtd b/test/valid/dtds/NewsMLv1.0.dtd
new file mode 100644
index 0000000..5799b29
--- /dev/null
+++ b/test/valid/dtds/NewsMLv1.0.dtd
@@ -0,0 +1,1578 @@
+<!--
+ ===========================================
+ NewsML Document Type Definition Version 1.0
+ ===========================================
+ International Press Telecommunications Council
+ 6 October 2000
+ Copyright (c) IPTC, 2000
+ All rights reserved
+ NewsML is a trademark of IPTC
+
+ ======================================
+ DO NOT REMOVE THESE LICENCE CONDITIONS
+ ======================================
+ LICENCE OF THE IPTC NewsML TRADEMARK TO NON-MEMBERS OF THE IPTC
+
+Use of the IPTC trademark shall be licensed by the IPTC ("the Licensor") to a
+Non-Member ("the Licensee") in consideration of the following obligations
+undertaken by the Licensee under the terms of this contract.
+
+ 1. The Licensee recognises the Licensor as the sole owner of the intellectual
+ property protected by the trademark.
+
+ 2. The Licensee recognises that the Licensor has the right to grant licenses
+ of the intellectual property protected by the trademark and has agreed to
+ grant such a licence to the Licensee in the terms set out in this contract.
+
+ 3. The Licensee shall not during the subsistence of this contract or at any
+ future time register to use in its own name as proprietor any of the
+ intellectual property protected by the trademark.
+
+ 4. The Licensee shall not claim any right title or interest in the
+ intellectual property or any part of it save as is granted by this contract.
+
+ 5. The Licensee shall immediately call to the attention of the Licensor the use
+ of any part of the intellectual property by any third party or any activity
+ of any third party which might in the opinion of the Licensee amount to
+ infringement of the rights protected by the trademark.
+
+ 6. The Licensee shall not assign the benefit of this contract or grant any
+ sub-licence without the prior written consent of the Licensor.
+
+ 7. Use of the IPTC trademark is licensed only to those Licensees who comply
+ with the requirements of the official published description of NewsML.
+
+ 8. The Licensee promises to respect the integrity and quality standard of the
+ trademark and shall refrain from all acts and omissions which threaten the
+ integrity of the trademark as a mark of quality.
+
+ 9. The Licensee shall communicate immediately to the IPTC any instances of
+ actual or suspected misuse or non-compliance with the official published
+ description of NewsML which come to the attention of the Licensee.
+
+10. The Licensee shall, at the request of the IPTC Management Committee acting
+ unanimously, accede to any reasonable request of the IPTC to inspect the
+ address of the Licensee to verify compliance and each Licensee shall afford
+ to the IPTC such assistance as is requested by the IPTC in response to the
+ latter's reasonable enquiries in instances of suspected non-compliance with
+ the official published description of NewsML requirements.
+
+The Licensee shall from time to time provide the IPTC with the full address of
+its place of business and that place will be deemed the Licensee's address.
+
+The IPTC reserves the right to terminate the use of the trademark by the
+Licensee at any time without notice or without the need to give reasons to the
+Licensee for such termination.
+
+This contract shall be governed and construed in accordance with the laws of
+England and Wales whose courts shall be courts of competent jurisdiction.
+-->
+<!--
+ ================
+ NOTE ON SPELLING
+ ================
+NewsML element and attribute names use US-English spellings. With this
+exception, this DTD and its accompanying specification use British English
+spellings.
+-->
+<!--
+ =============================
+ PARAMETER ENTITY DECLARATIONS
+ =============================
+-->
+<!--
+================================================================================
+ Attribute sets
+================================================================================
+-->
+<!--
+================================== assignment ==================================
+AssignedBy
+==========
+An identifier for the party assigning a piece of metadata. This can be a
+string that designates the party informally (for example, a person's name),
+or a pointer in the form a fragment identifier consisting of a # character
+followed by the Duid of a Topic corresponding to the party.
+
+Importance
+==========
+An indication of the importance the party assigning a piece of metadata
+attaches to it. The value of the Importance attribute is a formal name for a
+level of importance. Its meaning and permitted values are determined by a
+controlled vocabulary.
+
+Confidence
+==========
+An indication of the confidence with which a piece of metadata has been
+assigned. The value of the Confidence attribute is a formal name for a
+degree of confidence. Its meaning and permitted values are determined by a
+controlled vocabulary.
+
+HowPresent
+==========
+An indication of the way in which a piece of metadata applies. The value of
+the HowPresent attribute is a formal name for the way the metadata applies.
+Its meaning and permitted values are determined by a controlled vocabulary.
+
+DateAndTime
+===========
+The date and (optionally) time at which a piece of metadata was assigned.
+
+Uses the format CCYYMMDDTHHMMSS{+or-}HHMM (century, year, month, day, time
+separator, hours, minutes, seconds, timezone separator, hours, minutes). If
+only the Date is needed, then the substring from T onwards may be omitted.
+
+This is the Basic Format defined by ISO 8601. CCYY is a 4-digit year number.
+MM is a 2-digit month number. DD is a 2-digit day number. T is the letter 'T'.
+HH is a 2-digit hour number (using a 24-hour clock). MM is a 2 digit minute
+number. (Note that midnight may be represented as 2400 or 240000 on the date
+of the day that is ending, or as 0000 or 000000 on the date of the day that is
+beginning.)
+
+{+or-} is the '+' character or the '-' character, and the following HHMM are
+hours and minutes of offset from Universal Co-ordinated Time (UTC) as defined
+by ISO 8601. If the time is being expressed in UTC, then the timezone offset
+may be '+0000' or '-0000'. If the time is behind UTC, the timezone separator
+is '-'. If the time is ahead of UTC the timezone separator is '+'.
+
+Example: 10:27 p.m. in New York on 31 December 2000 would be expressed as
+"20001231T222700-0500" as New York is five hours behind UTC in winter.
+At the same moment in London, the date and time would be expressed as
+time would be expressed as "20010101T032700+0000" or as , "20010101T00+0000", as
+in London, it is now 3:27 a.m. on 1 January 2001. At the same moment in Paris,
+the date and time would be expressed as "20010101T042700+0100", as Paris is one
+hour ahead of UTC in winter, and it is now 4:27 a.m. on 1 January 2001.
+================================================================================
+
+-->
+<!ENTITY % assignment " AssignedBy CDATA #IMPLIED
+ Importance CDATA #IMPLIED
+ Confidence CDATA #IMPLIED
+ HowPresent CDATA #IMPLIED
+ DateAndTime CDATA #IMPLIED">
+
+<!--
+================================= formalname ===================================
+
+FormalName
+==========
+A string of characters whose meaning is determined by a controlled vocabulary.
+
+Vocabulary
+==========
+The Vocabulary attribute, if present, provides a pointer to a TopicSet which is
+the controlled vocabulary that can be used to resolve the meaning of the
+FormalName. The value of the Vocabulary attribute is an http URL or a NewsML
+URN, or the # character followed by the value of the Duid attribute of the a
+TopicSet in the current document.
+
+If there is no Vocabulary attribute, then the controlled vocabulary to be used
+is located by the following algorithm:
+- Proceed to the parent of the current element.
+- If it has a Catalog element as its immediate child, see whether that Catalog
+ contains a Resource element whose DefaultVocabularyFor child contains an XPath
+ pattern that is matched by the current element. If so, then the controlled
+ vocabulary is the resource identified by that Resource element.
+- If the parent does not meet the above condition, proceed to its parent and
+ check the same condition.
+- Continue until a vocabulary is found, or no further parent elements are
+ available because the root element has been reached and it too fails to meet
+ the condition.
+
+If there is no Vocabulary attribute and the above algorithm fails to identify
+a resource that serves as the controlled vocabulary, there is an error, which
+the NewsML system may signal to the user.
+
+The NewsML system may also signal an error if a vocabulary is successfully
+identified, but it contains no item that matches the value of the FormalName
+whose meaning is sought.
+
+Scheme
+======
+The Scheme attribute, if present, serves to distinguish which of possibly
+multiple naming schemes in the controlled vocabulary is the one that governs
+this FormalName. For a match to be obtained within the controlled vocabulary,
+the rule is that the FormalName and the Scheme must both match. If there is
+no Scheme attribute on the current element, the match will be to an item in
+the vocabulary that has the current formal name and no scheme. If there is a
+Scheme attribute on the current element, then both the formal name and the
+scheme in the controlled vocabulary must match.
+================================================================================
+-->
+<!ENTITY % formalname " FormalName CDATA #REQUIRED
+ Vocabulary CDATA #IMPLIED
+ Scheme CDATA #IMPLIED">
+
+<!--
+=================================== localid ====================================
+
+Duid
+====
+Duid is a "Document-unique Identifier". It must satisfy the rules for XML ID
+attributes: it must only contain name characters, and it must start with a
+name-start character (not a digit). Its value must be unique within any NewsML
+document.
+
+Every NewsML element type has Duid as an optional attribute. Combined with the
+Identifier element, providing a value for the Duid of any element in a NewsML
+document makes the element globally identifiable. The Identifier element gives
+global identification to the document, and the Duid provides local
+identification for the element within the document.
+
+Euid
+====
+Euid is an "Element-unique Identifier". Its value must be unique among elements
+of the same element-type and having the same parent element.
+
+Use of Euid attribute makes it possible to identify any NewsML element within
+the context of its local branch of the NewsML document tree. This makes it
+possible to copy, or include by reference, subtrees into new combinations in
+ways that would break the uniqueness of Duids (thereby forcing new Duids to be
+allocated), but still being able to retain the identity of each element. If
+Euids are maintained at every level, it is possible to identify, for example
+"The ContentItem whose Euid is abc within the NewsComponent whose Euid is def".
+Such identification patterns would be preserved even after "pruning and
+grafting" of subtrees.
+================================================================================
+-->
+<!ENTITY % localid " Duid ID #IMPLIED
+ Euid CDATA #IMPLIED">
+
+<!--
+================================================================================
+ Content Models
+================================================================================
+-->
+<!--
+===================================== data =====================================
+Where data is included, it may be directly in the form of a DataContent element,
+or in the form of DataContent wrapped in an Encoding element, or by reference
+through an Href attribute, in which case neither a DataContent nor an Encoding
+element will be present.
+================================================================================
+-->
+<!ENTITY % data " (Encoding
+ | DataContent )?">
+
+<!--
+==================================== party =====================================
+Person, organisation or company playing a specific role in the
+news workflow. The role being played is determined by the parent element. More
+information about it can be provided in the optional Comment subelements.
+================================================================================
+
+-->
+<!ENTITY % party " (Comment*
+ , Party+ )">
+
+<!--
+ =========================
+ ELEMENT TYPE DECLARATIONS
+ =========================
+-->
+<!--
+============================ AdministrativeMetadata ============================
+Information about the provenance of a NewsComponent.
+================================================================================
+-->
+<!ELEMENT AdministrativeMetadata (Catalog? , FileName? , SystemIdentifier? , Provider? , Creator? , Source* , Contributor* , Property* )>
+<!ATTLIST AdministrativeMetadata %localid; >
+<!--
+
+================================ AssociatedWith ================================
+A reference to a NewsItem with which this one is associated (for example, a
+series of articles, or a collection of photos, of which it is a part). The
+NewsItem attribute identifies the relevant NewsItem. Its value can be an
+http URL or a NewsML URN as described in the comment to PublicIdentifier. The
+Comment can be used to indicate the nature of the association.
+================================================================================
+
+-->
+<!ELEMENT AssociatedWith (Comment* )>
+<!ATTLIST AssociatedWith %localid;
+ NewsItem CDATA #IMPLIED >
+<!--
+================================ BasisForChoice ================================
+The content of this element is an XPath statement or element-type name
+identifying information within each NewsComponent or ContentItem that can be
+used as a basis for choice between equivalent NewsComponents or ContentItems.
+The root of the XPath corresponds to the NewsComponent or ContentItem itself.
+The optional Rank attribute allows providers to place a numerical order on the
+importance they think should be attached to the different bases for choice.
+Smaller numbers represent higher importance.
+================================================================================
+-->
+<!ELEMENT BasisForChoice (#PCDATA )>
+<!ATTLIST BasisForChoice %localid;
+ Rank CDATA #IMPLIED >
+<!--
+
+==================================== ByLine ====================================
+A natural-language statement of the author/creator information.
+================================================================================
+-->
+<!ELEMENT ByLine (#PCDATA | Origin )*>
+<!ATTLIST ByLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+=================================== Catalog ====================================
+A container for Resource and TopicUse elements. Resource elements map URNs to
+URLs and indicate default vocabularies which apply to the formal names of
+certain elements within the subtree that begins with the immediate parent of
+the Catalog element. TopicUse elements indicate where in the NewsML document
+certain Topics are used. The optional Href attribute provides a pointer to
+a Catalog element elsewhere in this or another document. Its value consists of
+a # character followed by the value of the Duid attribute of the referenced
+Catalog element and preceded, if the referenced Catalog is not in the current
+document, by an http URL or a NewsML URN identifying the document or NewsItem
+in which the Catalog appears. If the Href attribute is present on a Catalog
+element, then that element should be empty. If it contains subelements, the
+NewsML system may signal an error.
+================================================================================
+-->
+<!ELEMENT Catalog (Resource* , TopicUse* )>
+<!ATTLIST Catalog %localid;
+ Href CDATA #IMPLIED >
+<!--
+=============================== Characteristics ================================
+Information about the physical characteristics of a ContentItem.
+================================================================================
+-->
+<!ELEMENT Characteristics (SizeInBytes? , Property* )>
+<!ATTLIST Characteristics %localid; >
+<!--
+=================================== Comment ====================================
+A natural-language description of, or statement about, the current element. The
+optional TranslationOf attribute is a pointer to another Comment element, of
+which this one is a direct translation.
+================================================================================
+-->
+<!ELEMENT Comment (#PCDATA )>
+<!ATTLIST Comment %localid;
+ xml:lang CDATA #IMPLIED
+ TranslationOf IDREF #IMPLIED >
+<!--
+================================= ContentItem ==================================
+A news object that carries or identifies content intended for presentation to
+humans.
+================================================================================
+-->
+<!ELEMENT ContentItem (Comment* , Catalog? , MediaType? , Format? , MimeType? , Notation? , Characteristics? , %data; )>
+<!ATTLIST ContentItem %localid;
+ Href CDATA #IMPLIED >
+<!--
+================================= Contributor ==================================
+An individual and/or company or organisation that modified or enhanced a news
+object after its creation.
+================================================================================
+-->
+<!ELEMENT Contributor (%party; )>
+<!ATTLIST Contributor %localid; >
+<!--
+================================== Copyright ===================================
+The copyright that pertains to a news object.
+================================================================================
+-->
+<!ELEMENT Copyright (Comment* , CopyrightHolder , CopyrightDate )>
+<!ATTLIST Copyright %localid;
+ %assignment; >
+<!--
+================================ CopyrightDate =================================
+A natural-language statement of the copyright date.
+================================================================================
+
+-->
+<!ELEMENT CopyrightDate (#PCDATA | Origin )*>
+<!ATTLIST CopyrightDate %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+=============================== CopyrightHolder ================================
+A natural-language statement indicating who owns the copyright.
+================================================================================
+-->
+<!ELEMENT CopyrightHolder (#PCDATA | Origin )*>
+<!ATTLIST CopyrightHolder %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+================================ CopyrightLine =================================
+A natural-language statement of the copyright information.
+================================================================================
+-->
+<!ELEMENT CopyrightLine (#PCDATA | Origin )*>
+<!ATTLIST CopyrightLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+=================================== Creator ====================================
+An individual and/or company or organisation that created a news object.
+================================================================================
+-->
+<!ELEMENT Creator (%party; )>
+<!ATTLIST Creator %localid; >
+<!--
+================================== CreditLine ==================================
+A natural-language statement of credit information.
+================================================================================
+-->
+<!ELEMENT CreditLine (#PCDATA | Origin )*>
+<!ATTLIST CreditLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+================================= DataContent ==================================
+The data that carries the content of a ContentItem.
+================================================================================
+-->
+<!ELEMENT DataContent ANY>
+<!ATTLIST DataContent %localid; >
+<!--
+================================= DateAndTime ==================================
+A formal representation of a date and, optionally, time, expressed in ISO 8601
+Basic Format, as described in the comment to the DateAndTime attribute within
+the assignment ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT DateAndTime (#PCDATA )>
+<!ATTLIST DateAndTime %localid; >
+<!--
+==================================== DateId ====================================
+A date identifier of a NewsItem in short ISO 8601 Basic Format (CCYYMMDD), as
+described in the comment to the DateAndTime attribute within the assignment
+ENTITY declaration above. The DateId is part of the formal identification of the
+NewsItem, and must remain the same through successive revisions of the same
+NewsItem.
+================================================================================
+-->
+<!ELEMENT DateId (#PCDATA )>
+
+<!--
+================================== DateLabel ===================================
+A string representation of a date or date and time, used by human users to help
+identify a NewsItem.
+================================================================================
+-->
+<!ELEMENT DateLabel (#PCDATA )>
+<!ATTLIST DateLabel %localid; >
+<!--
+=================================== DateLine ===================================
+A natural-language statement of the date and/or place of creation.
+================================================================================
+-->
+<!ELEMENT DateLine (#PCDATA | Origin )*>
+<!ATTLIST DateLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+============================ DefaultVocabularyFor ==============================
+An indication that the parent Resource provides the default vocabulary that
+determines the meanings and permitted values of the data occurring in a
+particular part of a NewsML document subtree. The Context attribute is an
+XPath statement identifying the data to which the default vocabulary applies.
+The optional Scheme attribute identifies the relevant naming scheme if the
+Resource contains more than one naming scheme. If the Resource is a NewsML
+TopicSet, then the meaning of the data identified by the Context is provided
+by the Topic whose FormalName subelement matches that data. If the Resource is
+not a NewsML TopicSet, then the way in which it is interpreted in order to
+provide a meaning for the data is not defined by NewsML but by the authority
+that governs whatever format the Resource uses.
+
+Example:
+<DescriptiveMetadata>
+ <Catalog>
+ <Resource Duid="resource1">
+ <Urn>urn:newsml:iptc.org:20001006:Ranking:1</Urn>
+ <Url>www.iptc.com/vocabularies/iptc-rank.xml</Url>
+ <DefaultVocabularyFor Context="@Confidence"/>
+ <DefaultVocabularyFor Context="@Importance"/>
+ </Resource>
+ <Resource Duid="resource2">
+ <Urn>urn:newsml:iptc.org:20001006:TopicTypes:1</Urn>
+ <Url>www.iptc.com/vocabularies/iptc-topictype.xml</Url>
+ <DefaultVocabularyFor Context="TopicType@FormalName"/>
+ </Resource>
+ </Catalog>
+ <TopicSet>
+ <Topic Duid="topic1">
+ <TopicType FormalName="Person">
+ <Description Variant="Name">Bill Clinton</Description>
+ <Description Variant="Position">President of the USA</Description>
+ </Topic>
+ </TopicSet>
+ <TopicOccurrence
+ AssignedBy="Desk Editor"
+ Confidence="High"
+ HowPresent="principal subject"
+ Topic="#topic1"/>
+</DescriptiveMetadata>
+================================================================================
+-->
+<!ELEMENT DefaultVocabularyFor EMPTY>
+<!ATTLIST DefaultVocabularyFor %localid;
+ Context CDATA #REQUIRED
+ Scheme CDATA #IMPLIED >
+<!--
+==================================== Delete ====================================
+An instruction to delete an element within a NewsItem. The NewsItem is
+the previous revision of the current one, and the element to be deleted is the
+one whose Duid value is equal to the value of the Delete element's DuidRef
+attribute.
+================================================================================
+-->
+<!ELEMENT Delete EMPTY>
+<!ATTLIST Delete %localid;
+ DuidRef CDATA #REQUIRED >
+<!--
+================================= DerivedFrom ==================================
+A reference to an NewsItem from which this one is derived. The NewsItem attribute
+identifies the relevant NewsItem. Its value can be an http URL or a NewsML URN
+as described in the comment to PublicIdentifier.
+================================================================================
+-->
+<!ELEMENT DerivedFrom (Comment* )>
+<!ATTLIST DerivedFrom %localid;
+ NewsItem CDATA #IMPLIED >
+<!--
+================================= Description ==================================
+A description that identifies a Topic, thereby indicating the meaning of a
+formal name associated with that Topic. The xml:lang attribute indicates what
+language the description is in. The optional Variant attribute allows multiple
+descriptions to be given in the same language, and meaningfully distinguished
+from one another.
+================================================================================
+-->
+<!ELEMENT Description (#PCDATA )>
+<!ATTLIST Description %localid;
+ xml:lang CDATA #IMPLIED
+ Variant CDATA #IMPLIED >
+<!--
+============================= DescriptiveMetadata ==============================
+Information describing the content of a NewsComponent.
+================================================================================
+-->
+<!ELEMENT DescriptiveMetadata (Catalog? , Language* , Genre? , SubjectCode* , OfInterestTo* , TopicOccurrence* , Property* )>
+<!ATTLIST DescriptiveMetadata %localid;
+ %assignment; >
+<!--
+=================================== Encoding ===================================
+The encoding of the data comprising the content of a ContentItem.
+================================================================================
+-->
+<!ELEMENT Encoding %data;>
+<!ATTLIST Encoding %localid;
+ Notation CDATA #REQUIRED >
+<!--
+=================================== EndDate ====================================
+A natural-language statement of the date at which specified usage rights come
+to an end.
+================================================================================
+-->
+<!ELEMENT EndDate (#PCDATA | Origin )*>
+<!ATTLIST EndDate %localid;
+ xml:lang CDATA #IMPLIED
+ %assignment; >
+<!--
+=================================== FileName ===================================
+The suggested or actual storage file name for a NewsItem.
+================================================================================
+-->
+<!ELEMENT FileName (#PCDATA )>
+<!ATTLIST FileName %localid; >
+<!--
+================================= FirstCreated =================================
+The date and, optionally, time at which a NewsItem was first created, expressed
+in ISO 8601 Basic Format, as described in the comment to the DateAndTime
+attribute within the assignment ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT FirstCreated (#PCDATA )>
+<!ATTLIST FirstCreated %localid; >
+<!--
+================================= FormalName ===================================
+A string of characters whose meaning is determined by a naming scheme within a
+controlled vocabulary. The controlled vocabulary may (but is not required to)
+take the form of a NewsML TopicSet. The optional Scheme attribute determines
+which naming scheme applies, when several exist within the same controlled
+vocabulary.
+================================================================================
+-->
+<!ELEMENT FormalName (#PCDATA )>
+<!ATTLIST FormalName %localid;
+ Scheme CDATA #IMPLIED >
+<!--
+==================================== Format ====================================
+An indication of the format of a ContentItem. The value of the FormalName
+attribute is a formal name for the Format. Its meaning and permitted values are
+determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Format EMPTY>
+<!ATTLIST Format %localid;
+ %formalname; >
+<!--
+================================= FutureStatus =================================
+An indication of the status a NewsItem will have at a specified future date. The
+value of the FormalName attribute is a formal name for the FutureStatus. Its
+meaning is determined by a controlled vocabulary as described in the comment
+to the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT FutureStatus EMPTY>
+<!ATTLIST FutureStatus %localid;
+ %formalname; >
+<!--
+==================================== Genre =====================================
+An indication of the Genre of a NewsComponent. The value of the FormalName
+attribute is a formal name for the Genre. Its meaning and permitted values are
+determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Genre EMPTY>
+<!ATTLIST Genre %localid;
+ %formalname;
+ %assignment; >
+<!--
+================================== Geography ===================================
+A natural-language statement of the geographical area or areas to which
+specified usage rights apply.
+================================================================================
+-->
+<!ELEMENT Geography (#PCDATA | Origin )*>
+<!ATTLIST Geography %localid;
+ xml:lang CDATA #IMPLIED
+ %assignment; >
+<!--
+=================================== HeadLine ===================================
+A displayable headline.
+================================================================================
+-->
+<!ELEMENT HeadLine (#PCDATA | Origin )*>
+<!ATTLIST HeadLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+================================ Identification ================================
+Identification information for the NewsItem.
+================================================================================
+-->
+<!ELEMENT Identification (NewsIdentifier , NameLabel? , DateLabel? , Label* )>
+<!ATTLIST Identification %localid; >
+<!--
+================================= InsertAfter ==================================
+An instruction to insert content after a designated element within a NewsItem.
+The content to be inserted is the content of the InsertAfter element. The
+NewsItem into which it is to be inserted is the previous revision of the current
+one, and the element after which it is to be inserted is the one whose Duid
+value is equal to the value of the InsertAfter element's DuidRef attribute.
+================================================================================
+-->
+<!ELEMENT InsertAfter ANY>
+<!ATTLIST InsertAfter %localid;
+ DuidRef CDATA #REQUIRED >
+<!--
+================================= InsertBefore =================================
+An instruction to insert content before a designated element within a NewsItem.
+The content to be inserted is the content of the InsertBefore element. The
+NewsItem into which it is to be inserted is the previous revision of the current
+one, and the element before which it is to be inserted is the one whose Duid
+value is equal to the value of the InsertBefore element's DuidRef attribute.
+================================================================================
+-->
+<!ELEMENT InsertBefore ANY>
+<!ATTLIST InsertBefore %localid;
+ DuidRef CDATA #REQUIRED >
+<!--
+================================= Instruction ==================================
+An instruction from a news provider to the recipient of a NewsItem. A special
+case of Instruction is an indication of the effect the current revision of a
+NewsItem has on the status of any previous revisions of the NewsItem that may
+still be on the recipient's system. In this case, it will contain one or more
+RevisionStatus elements. Otherwise, the value of the FormalName attribute is a
+formal name for the Instruction, and its meaning is determined by a controlled
+vocabulary as described in the comment to the formalname ENTITY declaration
+above.
+================================================================================
+-->
+<!ELEMENT Instruction (RevisionStatus* )>
+<!ATTLIST Instruction %localid;
+ %formalname; >
+<!--
+================================= KeywordLine ==================================
+A displayable set of keywords relevant to a news object. This can be used by a
+NewsML system to assist manual or automated searches.
+================================================================================
+-->
+<!ELEMENT KeywordLine (#PCDATA | Origin )*>
+<!ATTLIST KeywordLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+==================================== Label =====================================
+A human-readable label for a NewsItem.
+================================================================================
+-->
+<!ELEMENT Label (LabelType , LabelText )>
+<!ATTLIST Label %localid; >
+<!--
+=================================== LabelText ==================================
+The text that constitutes a Label of a given LabelType.
+================================================================================
+-->
+<!ELEMENT LabelText (#PCDATA )>
+<!ATTLIST LabelText %localid; >
+<!--
+================================= LabelType ====================================
+A user-defined type of label. The value of the FormalName attribute is a formal
+name for the LabelType. Its meaning and permitted values are determined by a
+controlled vocabulary as described in the comment to the formalname ENTITY
+declaration above.
+================================================================================
+-->
+<!ELEMENT LabelType EMPTY>
+<!ATTLIST LabelType %localid;
+ %formalname; >
+<!--
+=================================== Language ===================================
+An indication of the, or a, language used in a content item. The value of the
+FormalName attribute is a formal name for the Language. Its meaning and
+permitted values are determined by a controlled vocabulary as described in the
+comment to the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Language EMPTY>
+<!ATTLIST Language %localid;
+ %formalname;
+ %assignment; >
+<!--
+================================= Limitations ==================================
+A natural-language statement of the terms and conditions that apply to the
+specified usage rights.
+================================================================================
+-->
+<!ELEMENT Limitations (#PCDATA | Origin )*>
+<!ATTLIST Limitations %localid;
+ xml:lang CDATA #IMPLIED
+ %assignment; >
+<!--
+================================== MediaType ===================================
+An indication of the media type of a ContentItem. The value of the FormalName
+attribute is a formal name for the MediaType. Its meaning and permitted values
+are determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT MediaType EMPTY>
+<!ATTLIST MediaType %localid;
+ %formalname; >
+<!--
+=================================== Metadata ===================================
+An container for a user-defined type of metadata.
+================================================================================
+-->
+<!ELEMENT Metadata (Catalog? , MetadataType , Property+ )>
+<!ATTLIST Metadata %localid; >
+<!--
+=============================== MetadataType ===================================
+An indication of the type of metadata that is represented by the Property
+elements within this Metadata element. The value of the FormalName attribute is
+a formal name for the MetadataType. Its meaning and permitted values are
+determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT MetadataType EMPTY>
+<!ATTLIST MetadataType %localid;
+ %formalname; >
+<!--
+=================================== MimeType ===================================
+An indication of the MIME-type of a ContentItem. The value of the FormalName
+attribute is a formal name for the MimeType. Its meaning and permitted values
+are determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT MimeType EMPTY>
+<!ATTLIST MimeType %localid;
+ %formalname; >
+<!--
+================================== NameLabel ===================================
+A string used by human users as a name to help identify a NewsItem. Its form is
+determined by the provider. It might be identical to the textual content of
+the SlugLine element, for example, but even if this is so, the system should not
+process the NameLabel as a slugline. Nothing can be assumed about the nature of
+the string within NameLabel beyond the fact that it can help to identify the
+NewsItem to humans.
+================================================================================
+-->
+<!ELEMENT NameLabel (#PCDATA )>
+<!ATTLIST NameLabel %localid; >
+<!--
+================================ NewsComponent =================================
+A container for news objects, used to identify the role of news objects in
+relation to one another, and to ascribe metadata to them. The Essential
+attribute indicates whether the provider considers that this NewsComponent
+is essential to the meaning of the NewsComponent within which it is contained.
+The EquivalentsList attribute indicates whether or not the NewsItems or
+NewsItemRefs, NewsComponents or ContentItems contained within this one are
+equivalent to one another in content and/or meaning
+================================================================================
+-->
+<!ELEMENT NewsComponent (Comment* , Catalog? , TopicSet* , Role? , BasisForChoice* , NewsLines? , AdministrativeMetadata? , RightsMetadata? , DescriptiveMetadata? , Metadata* , ( (NewsItem | NewsItemRef )+ | NewsComponent+ | ContentItem+ )? )>
+<!ATTLIST NewsComponent %localid;
+ Essential (yes | no ) 'no'
+ EquivalentsList (yes | no ) 'no'
+ xml:lang CDATA #IMPLIED >
+<!--
+================================= NewsEnvelope =================================
+Information about the transmission of one or more NewsItems as a NewsML
+document.
+================================================================================
+-->
+<!ELEMENT NewsEnvelope (TransmissionId? , SentFrom? , SentTo? , DateAndTime , NewsService* , NewsProduct* , Priority? )>
+<!ATTLIST NewsEnvelope %localid; >
+<!--
+================================ NewsIdentifier ================================
+A globally unique identifier for a NewsItem.
+================================================================================
+-->
+<!ELEMENT NewsIdentifier (ProviderId , DateId , NewsItemId , RevisionId , PublicIdentifier )>
+
+<!--
+=================================== NewsItem ===================================
+A managed set of information representing a point of view, at a given time, on
+some event or events. Its Identification and NewsManagement provide
+manageability. It may contain either a NewsComponent, or one or more Updates
+that modify aspects of a previous Revision of the same NewsItem, or a
+TopicSet.
+================================================================================
+-->
+<!ELEMENT NewsItem (Comment* , Catalog? , Identification , NewsManagement , (NewsComponent | Update+ | TopicSet )? )>
+<!ATTLIST NewsItem %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+================================== NewsItemId ==================================
+An identifier for the NewsItem. The combination of NewsItemId and DateId must
+be unique among NewsItems that emanate from the same provider. Within these
+constraints, the NewsItemId can take any form the provider wishes. It may take
+the form of a name for the NewsItem that will be meaningful to humans, but this
+is not a requirement. The provider may optionally relate the values of
+NewsItemId to a controlled vocabulary, which is invoked by the Vocabulary
+attribute. The value ofthe Vocabulary attribute may be an http URL, a NewsML
+URN, or the # character followed by the value of the Duid attribute of a
+TopicSet in the current document. The Scheme attribute, if present, serves to
+distinguish which of possibly multiple naming schemes in the controlled
+vocabulary is the one that governs the NewsItemId.
+================================================================================
+-->
+<!ELEMENT NewsItemId (#PCDATA )>
+<!ATTLIST NewsItemId Vocabulary CDATA #IMPLIED
+ Scheme CDATA #IMPLIED >
+<!--
+================================= NewsItemRef ==================================
+A pointer to a NewsItem that is deemed to replace the NewsItemRef element. The
+NewsItem attribute is a pointer to the relevant NewsItem. Its value can be an
+http URL, or a NewsML URN as described in the comment to PublicIdentifier, or a
+fragment identifier consisting of a # character followed by the Duid of a
+NewsItem in the current document.
+================================================================================
+-->
+<!ELEMENT NewsItemRef (Comment* )>
+<!ATTLIST NewsItemRef %localid;
+ NewsItem CDATA #IMPLIED >
+<!--
+================================= NewsItemType =================================
+An indication of the type of a NewsItem. The value of the FormalName attribute
+is a formal name for the NewsItemType. Its meaning and permitted values are
+determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT NewsItemType EMPTY>
+<!ATTLIST NewsItemType %localid;
+ %formalname; >
+<!--
+=================================== NewsLine ===================================
+A newsline of a type not included in the NewsML specification.
+================================================================================
+-->
+<!ELEMENT NewsLine (NewsLineType , NewsLineText+ )>
+<!ATTLIST NewsLine %localid; >
+<!--
+=================================== NewsLineText ===================================
+The text of a NewsLine of user-defined type.
+================================================================================
+-->
+<!ELEMENT NewsLineText (#PCDATA | Origin )*>
+<!ATTLIST NewsLineText %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+================================ NewsLineType ==================================
+An indication of a user-defined NewsLine type. The value of the FormalName
+attribute is a formal name for the NewsLineType. Its meaning and permitted
+values are determined by a controlled vocabulary as described in the comment
+to the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT NewsLineType EMPTY>
+<!ATTLIST NewsLineType %localid;
+ %formalname; >
+<!--
+================================== NewsLines ===================================
+A container for all the NewsLines that a NewsComponent has.
+================================================================================
+-->
+<!ELEMENT NewsLines ( (HeadLine , SubHeadLine? )* , ByLine* , DateLine* , CreditLine* , CopyrightLine* , RightsLine* , SeriesLine* , SlugLine* , KeywordLine* , NewsLine* )>
+<!ATTLIST NewsLines %localid; >
+<!--
+================================ NewsManagement ================================
+Information relevant to the management of a NewsItem.
+================================================================================
+-->
+<!ELEMENT NewsManagement (NewsItemType , FirstCreated , ThisRevisionCreated , Status , StatusWillChange? , Urgency? , RevisionHistory? , DerivedFrom* , AssociatedWith* , Instruction* , Property* )>
+<!ATTLIST NewsManagement %localid; >
+<!--
+==================================== NewsML ====================================
+A NewsML document, which must contain a NewsEnvelope and one or more NewsItems,
+and may include a Catalog element and a TopicSet element.
+================================================================================
+-->
+<!ELEMENT NewsML (Catalog? , TopicSet* , (NewsEnvelope , NewsItem+ ) )>
+<!ATTLIST NewsML %localid; >
+<!--
+================================= NewsProduct ==================================
+An identifier for a product to which all the NewsItems in a NewsML document
+belong. The value of the FormalName attribute is a formal name for the
+NewsProduct. Its meaning and permitted values are determined by a controlled
+vocabulary as described in the comment to the formalname ENTITY declaration
+above.
+================================================================================
+-->
+<!ELEMENT NewsProduct EMPTY>
+<!ATTLIST NewsProduct %localid;
+ %formalname; >
+<!--
+================================= NewsService ==================================
+An identifier for a service to which all the NewsItems in a NewsML document
+belong. The value of the FormalName attribute is a formal name for the
+NewsService. Its meaning and permitted values are determined by a controlled
+vocabulary as described in the comment to the formalname ENTITY declaration
+above.
+================================================================================
+-->
+<!ELEMENT NewsService EMPTY>
+<!ATTLIST NewsService %localid;
+ %formalname; >
+<!--
+=================================== Notation ===================================
+An indication of the notation of a ContentItem. The value of the FormalName
+attribute is a formal name for the Notation. Its meaning and permitted values
+are determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Notation EMPTY>
+<!ATTLIST Notation %localid;
+ %formalname; >
+<!--
+================================= OfInterestTo =================================
+An indication of the target audience of a NewsItem. The value of the FormalName
+attribute is a formal name for the target audience. Its meaning and permitted
+values are determined by a controlled vocabulary as described in the comment to
+the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT OfInterestTo (Relevance? )>
+<!ATTLIST OfInterestTo %localid;
+ %formalname;
+ %assignment; >
+<!--
+==================================== Origin ====================================
+A wrapper for all or part of the text of a piece of text, which provides a
+pointer to an item of data corresponding formally to what is being described
+here in natural language. The Href attribute identifies the relevant data, and
+may be an http URL or a NewsML URN as described in the comment to
+PublicIdentifier, optionally including a fragment identifier. Alternatively, it
+can be a simple fragment identifier consisting of a # character followed by the
+value of the Duid of an element in the current document.
+================================================================================
+-->
+<!ELEMENT Origin (#PCDATA | Origin )*>
+<!ATTLIST Origin %localid;
+ %assignment;
+ Href CDATA #IMPLIED >
+<!--
+=================================== Party ======================================
+An indication of the person, company or organisation that has a particular
+relationship to this NewsItem in the news workflow. The value of the FormalName
+attribute is a formal name for the Party. Its meaning and permitted values
+are determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Party EMPTY>
+<!ATTLIST Party %localid;
+ %formalname;
+ Topic CDATA #IMPLIED >
+<!--
+=================================== Priority ===================================
+An indication of the priority notation of a NewsItem. The value of the
+FormalName attribute is a formal name for the Priority. Its meaning and
+permitted values are determined by a controlled vocabulary as described in
+the comment to the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Priority EMPTY>
+<!ATTLIST Priority %localid;
+ %formalname; >
+<!--
+=================================== Property ===================================
+A property of a NewsComponent or of a Topic. The property has a name and either
+a simple Value or a complex value consisting of a set of further properties.
+
+Value
+=====
+A string representation of the value of a Property.
+
+ValueRef
+========
+A pointer to the value of the Property. This might be a Topic in a TopicSet, or
+any other piece of data. If both Value and ValueRef are provided, then ValueRef
+identifies the actual value of the property, with Value simply providing a
+string representation or mnemonic for it.
+
+
+Example:
+<Catalog>
+ <Resource Duid="resource1">
+ <Urn>urn:newsml:reuters.com:20001001:Physical Characteristics:3</Urn>
+ <Url>www.reuters.com/vocabs/physical.xml</Url>
+ <Url>www.iptc.com/vocabularies/memberdefined/reuters/physical.xml</Url>
+ <DefaultVocabularyFor Scheme="short" Context="Metadata/Property[@FormalName='Width']"/>
+ </Resource>
+</Catalog>
+<Property FormalName="Width" Vocabulary="#resource1">
+ <Property FormalName="Unit" ValueRef="urn:newsml:iptc.org:20001006:units:1#cm"/>
+ <Property FormalName="Quantity" Value="7.5"/>
+</Property>
+
+AllowedValues
+=============
+The AllowedValues attribute, if present, is a pointer to a controlled vocabulary
+that delimits the set of allowed values for the property. This may be an http
+URL, or a NewsML URN, or a fragment identifier consisting of a # charactger
+followed by the Duid of an element in the current document. The pointer must
+reference either a Resource element that designates an external controlled
+vocabulary, or a TopicSet element, that is itself the controlled vocabulary.
+================================================================================
+-->
+<!ELEMENT Property (Property* )>
+<!ATTLIST Property %localid;
+ %formalname;
+ %assignment;
+ Value CDATA #IMPLIED
+ ValueRef CDATA #IMPLIED
+ AllowedValues CDATA #IMPLIED >
+<!--
+=================================== Provider ===================================
+An individual and/or company or organisation that released a news object for
+publication.
+================================================================================
+-->
+<!ELEMENT Provider (%party; )>
+<!ATTLIST Provider %localid; >
+<!--
+================================== ProviderId ==================================
+An identifier for the news provider that produced the NewsItem. The
+provider's ID is specified in the element content. This should be an Internet
+domain name that is owned by the provider at the date identified by the DateId
+subelement of the NewsIdentifier, or the name for the Provider drawn from a
+controlled vocabulary identified by a URN specified in the Vocabulary attribute.
+This will ensure that the identity of the provider can be inferred unambiguously
+from the full NewsIdentifier.
+
+Example:
+<NewsIdentifier>
+ <ProviderId>iptc.org</ProviderId>
+ <DateId>20001001</DateId>
+ <NewsItemId>NewsML version 1.0</NewsItemId>
+ <RevisionId>1</RevisionId
+</NewsIdentifier>
+
+Because the domain name "iptc.org" was owned on 1 October 2000 by the
+International Press Telecommunications Council (IPTC) and no-one else, it is
+certain that IPTC is the provider in this case.
+================================================================================
+-->
+<!ELEMENT ProviderId (#PCDATA )>
+<!ATTLIST ProviderId Vocabulary CDATA #IMPLIED >
+<!--
+=============================== PublicIdentifier ===============================
+A public identifier (in the sense defined by the XML 1,0 Specification) for a
+NewsItem. This is the NewsML URN, and must be constructed as follows:
+
+If the ProviderId is a domain name
+
+urn:newsml:{ProviderId}:{DateId}:{NewsItemId}:{RevisionId}{RevisionId@Update}
+
+If the ProviderId is name drawn from a controlled vocabulary
+
+urn:newsml:|{ProviderId@Vocabulary}|{ProviderId}|:{DateId}:{NewsItemId}:{RevisionId}{RevisionId@Update}
+
+where {x} means "the content of the x subelement of the NewsIdentifier" and
+{x@y} means "the value of the y attribute of the x subelement of the
+NewsIdentifier", with the exception that if the Update attribute of the
+RevisionId element has its default value of N, it is omitted from the URN, and
+that the Vocabulary attribute of the ProviderId element is stripped of the
+substring "urn:" with which it begins. The Vocabulary attribute of ProviderId
+necessarily begins with the characters "urn:" because, as stated in the
+comment to the ProviderId element above, it must take the form of a URN
+identifying a controlled vocabulary.
+
+Note that the existence of this URN enables the NewsItem to be referenced
+unambiguously by pointers from other XML elements or resources. Within such
+pointers, if the RevisionId, its preceding : character and its following Update
+qualifier are omitted, then the pointer designates the most recent revision at
+the time it is resolved.
+================================================================================
+-->
+<!ELEMENT PublicIdentifier (#PCDATA )>
+
+<!--
+================================== Relevance ===================================
+An indication of the relevance of a NewsItem to a given target audience. The
+value of the FormalName attribute is a formal name for the Relevance. Its
+meaning and permitted values are determined by a controlled vocabulary as
+described in the comment to the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Relevance EMPTY>
+<!ATTLIST Relevance %localid;
+ %formalname;
+ %assignment; >
+<!--
+=================================== Replace ====================================
+An instruction to replace a designated element within a NewsItem. The element
+that is to replace the designated element is the content of the Replace element.
+The NewsItem within which the replacement takes place is the previous revision
+of the current one, and the element to be replaced is the one whose Duid
+value is equal to the value of the Replace element's DuidRef attribute.
+================================================================================
+-->
+<!ELEMENT Replace ANY>
+<!ATTLIST Replace %localid;
+ DuidRef CDATA #REQUIRED >
+<!--
+================================== Resource ====================================
+An indication where a given resource can be found, and whether it is to be used
+as the default vocabulary for certain formal names within the current subtree
+of a NewsML document. The Urn attribute provides a NewsML URN for the resource.
+THe Url attribute(s) provide(s) a location or locations where the resource may
+be found. The DefaultVocabularyFor element contains an XPath pattern. The
+identified resource acts as default vocabulary for any element within the
+subtree whose root is the parent of the current Catalog, that matches this XPath
+pattern.
+================================================================================
+-->
+<!ELEMENT Resource (Urn? , Url* , DefaultVocabularyFor* )>
+<!ATTLIST Resource %localid; >
+<!--
+=============================== RevisionHistory ================================
+A pointer to a file containing the revision history of the NewsItem.
+================================================================================
+-->
+<!ELEMENT RevisionHistory EMPTY>
+<!ATTLIST RevisionHistory %localid;
+ Href CDATA #REQUIRED >
+<!--
+================================== RevisionId ==================================
+A positive integer indicating which Revision of a given NewsItem this is. Any
+positive integer may be used, but it must always be the case that of two
+instances of a NewsItem that have the same ProviderId, DateId and NewsItemId,
+the one whose RevisionId has the larger value must be the more recent revision.
+A RevisionId of 0 is not permitted. The PreviousRevision attribute must be
+present, and its value must be equal to the content of the RevisionId element
+of the NewsItem's previous revision, if there is one, and 0 if the NewsItem has
+no previous revision. If the NewsItem contains an Update element or elements,
+then the Update attribute must be set to U. If the NewsItem consists only of a
+replacement set of NewsManagement data, then the Update attribute must be set
+to A. If neither of these is the case, then the Update attribute must be set
+to N.
+================================================================================
+-->
+<!ELEMENT RevisionId (#PCDATA )>
+<!ATTLIST RevisionId PreviousRevision CDATA #REQUIRED
+ Update CDATA #REQUIRED >
+<!--
+================================ RevisionStatus ================================
+Indicates the status that previous revisions now has as a result of the release
+of the current revision. The optional Revision attribute is an integer, equal to
+the RevisionId of the revision in question. If it is not present, then the
+status applies to ALL previous revisions, without exception.
+================================================================================
+-->
+<!ELEMENT RevisionStatus (Status )>
+<!ATTLIST RevisionStatus %localid;
+ Revision CDATA #IMPLIED >
+<!--
+================================= RightsHolder =================================
+A string of text indicating who has the usage rights, optionally enriched with
+pointers to further information about the relevant people, companies or
+organisations.
+================================================================================
+-->
+<!ELEMENT RightsHolder (#PCDATA | Origin )*>
+<!ATTLIST RightsHolder %localid;
+ xml:lang CDATA #IMPLIED
+ %assignment; >
+<!--
+================================== RightsLine ==================================
+A displayable version of rights information. Note that this is distinct from
+copyright information. Copyright information is about who owns a news object;
+rights information is about who is allowed to use it, in what way and under
+what circumstances.
+================================================================================
+-->
+<!ELEMENT RightsLine (#PCDATA | Origin )*>
+<!ATTLIST RightsLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+================================ RightsMetadata ================================
+Information about the rights pertaining to a NewsComponent.
+================================================================================
+-->
+<!ELEMENT RightsMetadata (Catalog? , Copyright* , UsageRights* , Property* )>
+<!ATTLIST RightsMetadata %localid;
+ %assignment; >
+<!--
+===================================== Role =====================================
+An identifier of the role played by a NewsComponent within a NewsComponent
+that contains it. The outermost NewsComponent within a NewsItem need not
+specify a Role attribute value. The value of the FormalName attribute is a
+formal name for the Role. Its meaning and permitted values are determined by
+a controlled vocabulary as described in the comment to the formalname ENTITY
+declaration above.
+================================================================================
+-->
+<!ELEMENT Role EMPTY>
+<!ATTLIST Role %localid;
+ %formalname; >
+<!--
+=================================== SentFrom ===================================
+An individual and/or company or organisation from whom the NewsML document is
+being sent.
+================================================================================
+-->
+<!ELEMENT SentFrom (%party; )>
+<!ATTLIST SentFrom %localid; >
+<!--
+==================================== SentTo ====================================
+An individual and/or company or organisation to whom the NewsML document is
+being sent.
+================================================================================
+-->
+<!ELEMENT SentTo (%party; )>
+<!ATTLIST SentTo %localid; >
+<!--
+================================== SeriesLine ==================================
+A displayable version of information about a news object's place in a series.
+================================================================================
+-->
+<!ELEMENT SeriesLine (#PCDATA | Origin )*>
+<!ATTLIST SeriesLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+================================== SizeInBytes =================================
+The exact size in bytes of a ContentItem's inline or referenced data object.
+================================================================================
+-->
+<!ELEMENT SizeInBytes (#PCDATA )>
+<!ATTLIST SizeInBytes %localid; >
+<!--
+=================================== SlugLine ===================================
+A string of text, possibly embellished by hyperlinks and/or formatting, used to
+display a NewsItem's slug line. (Note that the meaning of the term "slug line",
+and the uses to which it is put, are a matter for individual providers to
+define within their own workflow and business practice.)
+================================================================================
+-->
+<!ELEMENT SlugLine (#PCDATA | Origin )*>
+<!ATTLIST SlugLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+==================================== Source ====================================
+An individual and/or company or organisation that provided source material for
+a news object. The optional NewsItem attribute must be present in the case of
+a syndicated NewsItem. It provides the URN of the NewsItem that is being
+syndicated. Note that a sequence of Source elements can be used to indicate the
+sequence of syndicators through which a NewsItem has passed.
+================================================================================
+-->
+<!ELEMENT Source (%party; )>
+<!ATTLIST Source %localid;
+ NewsItem CDATA #IMPLIED >
+<!--
+================================== StartDate ===================================
+A natural-language statement of the date at which specified usage rights come
+into effect.
+================================================================================
+-->
+<!ELEMENT StartDate (#PCDATA | Origin )*>
+<!ATTLIST StartDate %localid;
+ xml:lang CDATA #IMPLIED
+ %assignment; >
+<!--
+==================================== Status ===================================
+An indication of the Status of a NewsItem. The value of the FormalName
+attribute is a formal name for the Status. Its meaning and permitted values
+are determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Status EMPTY>
+<!ATTLIST Status %localid;
+ %formalname; >
+<!--
+=============================== StatusWillChange ===============================
+Advance notification of a status change that will automatically occur at the
+specified date and time. For example, an item with a Status of "embargoed" might
+have a StatusWillChange element stating that the status will become "usable" at
+a specified time. This is equivalent to announcing in advance the time at which
+the embargo will end and the item will be released.
+================================================================================
+-->
+<!ELEMENT StatusWillChange (FutureStatus , DateAndTime )>
+<!ATTLIST StatusWillChange %localid; >
+<!--
+================================= SubHeadLine ==================================
+A displayable subsidiary headline.
+================================================================================
+-->
+<!ELEMENT SubHeadLine (#PCDATA | Origin )*>
+<!ATTLIST SubHeadLine %localid;
+ xml:lang CDATA #IMPLIED >
+<!--
+=================================== Subject ====================================
+An indication of the Subject of a NewsItem. The value of the FormalName
+attribute is a formal name for the Subject. Its meaning and permitted values
+are determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Subject EMPTY>
+<!ATTLIST Subject %localid;
+ %formalname;
+ %assignment; >
+<!--
+================================= SubjectCode ==================================
+A container for the IPTC Subject Codes that indicate the subject of a NewsItem,
+as defined in the IPTC Information Interchange Model. It consists of one more
+Subject, SubjectMatter and SubjectDetail elements, optionally amplified by one
+or more SubjectQualifier elements.
+================================================================================
+-->
+<!ELEMENT SubjectCode ( (Subject | SubjectMatter | SubjectDetail ) , SubjectQualifier* )*>
+<!ATTLIST SubjectCode %localid;
+ %assignment; >
+<!--
+================================ SubjectDetail =================================
+An indication of the SubjectDetail of a NewsItem. The value of the FormalName
+attribute is a formal name for the SubjectDetail. Its meaning and permitted
+values are determined by a controlled vocabulary as described in the comment
+to the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT SubjectDetail EMPTY>
+<!ATTLIST SubjectDetail %localid;
+ %formalname;
+ %assignment; >
+<!--
+================================ SubjectMatter =================================
+An indication of the SubjectMatter of a NewsItem. The value of the FormalName
+attribute is a formal name for the SubjectMatter. Its meaning and permitted
+values are determined by a controlled vocabulary as described in the comment to
+the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT SubjectMatter EMPTY>
+<!ATTLIST SubjectMatter %localid;
+ %formalname;
+ %assignment; >
+<!--
+=============================== SubjectQualifier ===============================
+An indication of the SubjectQualifier of a NewsItem. The value of the FormalName
+attribute is a formal name for the SubjectQualifier. Its meaning and permitted
+values are determined by a controlled vocabulary as described in the comment to
+the formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT SubjectQualifier EMPTY>
+<!ATTLIST SubjectQualifier %localid;
+ %formalname;
+ %assignment; >
+<!--
+=============================== SystemIdentifier ===============================
+A system identifier (in the sense defined by the XML 1,0 Specification) for a
+NewsItem.
+================================================================================
+-->
+<!ELEMENT SystemIdentifier (#PCDATA )>
+<!ATTLIST SystemIdentifier %localid; >
+<!--
+============================= ThisRevisionCreated ==============================
+The date and, optionally, time at which the current revision of a NewsItem was
+created, expressed in ISO 8601 Basic Format, as described in the comment to the
+DateAndTime attribute within the assignment ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT ThisRevisionCreated (#PCDATA )>
+<!ATTLIST ThisRevisionCreated %localid; >
+<!--
+==================================== Topic =====================================
+This element provides information about a thing (Topic) named by a formal
+name or occurring in a NewsComponent. A Topic must have one or more TopicType
+subelements, which state what type of Topic it is. The optional Details
+attribute provides a pointer, in the form of a URL or URN, to additional
+information about the Topic.
+================================================================================
+-->
+<!ELEMENT Topic (Comment* , Catalog? , TopicType+ , FormalName* , Description* , Property* )>
+<!ATTLIST Topic %localid;
+ Details CDATA #IMPLIED >
+<!--
+=============================== TopicOccurrence ================================
+An indication that a particular topic occurs within the content of a
+NewsComponent. The optional HowPresent attribute indicates the nature of that
+topic's occurrence. The value of the Topic attribute must consist of a #
+character followed by the value of the Duid attribute of a Topic in the current
+document.
+================================================================================
+-->
+<!ELEMENT TopicOccurrence EMPTY>
+<!ATTLIST TopicOccurrence %localid;
+ %assignment;
+ Topic CDATA #IMPLIED >
+<!--
+================================== TopicSet ====================================
+A container for Topics. The value of the FormalName attribute is a formal name
+for the TopicSet. Its meaning and permitted values are determined by a
+controlled vocabulary as described in the comment to the formalname ENTITY
+declaration above.
+================================================================================
+-->
+<!ELEMENT TopicSet (Comment* , Catalog? , TopicSetRef* , Topic* )>
+<!ATTLIST TopicSet %localid;
+ %formalname; >
+<!--
+================================= TopicSetRef ==================================
+A pointer to a TopicSet that is to be merged with the current one. The TopicSet
+attribute is a pointer to the relevant TopicSet. Its value can be an http URL,
+or a NewsML URN as described in the comment to PublicIdentifier, or a fragment
+identifier consisting of a # character followed by the Duid of a TopicSet in the
+current document. The presence of a TopicSetRef child in a TopicSet has the
+effect that all the Topics in the referenced TopicSet are included by reference
+within the current TopicSet. When this merging results in there exising two
+FormalName grandchildren of the same TopicSet that have the same content and
+the same Scheme attribute value, then the Topics whose children are in fact the
+same topic, and are deemed to be merged. The merging of Topics need not be
+performed physically by the system, but the meaning of the data is
+exactly the same as if the merging were actually performed. Merging two
+Topcis consists of creating a single Topic that contains all the children of
+both, and eliminating duplicates.
+================================================================================
+-->
+<!ELEMENT TopicSetRef (Comment* )>
+<!ATTLIST TopicSetRef %localid;
+ TopicSet CDATA #IMPLIED >
+<!--
+================================== TopicType ===================================
+An indication of the type of a Topic. The value of the FormalName attribute is
+a formal name for the TopicType. Its meaning and permitted values are determined
+by a controlled vocabulary as described in the comment to the formalname ENTITY
+declaration above.
+================================================================================
+-->
+<!ELEMENT TopicType EMPTY>
+<!ATTLIST TopicType %localid;
+ %formalname; >
+<!--
+================================== TopicUse ====================================
+An indication of where a particular Topic is used in a NewsML document. The
+value of the Topic attribute must consist of a # character followed by the
+value of the Duid of a Topic in the current document. The value of the Context
+attribute is an XPath pattern indicating the context where the referenced topic
+is used within the subtree to which the current Catalog applies. If the Context
+attribute is not present, the TopicUse element simply states that this topic is
+present somewhere in the subtree.
+================================================================================
+-->
+<!ELEMENT TopicUse EMPTY>
+<!ATTLIST TopicUse Topic CDATA #REQUIRED
+ Context CDATA #IMPLIED >
+<!--
+================================ TransmissionId ================================
+An identifier for the NewsML document transmission. This should be unique among
+all distinct transmissions from the same publisher. If a transmission is
+repeated (perhaps because the sender is not confident that it was successfully
+received) then the same TransmissionId content may be used, but a Repeat
+attribute should be provided to distinguish the second transmission from the
+first. The form that the value of the Repeat attribute takes is determined by
+the provider. Likewise, the format for the TransmissionId itself is for the
+provider to decide. It could for example consist of a channel identifier
+followed by a sequence number.
+================================================================================
+-->
+<!ELEMENT TransmissionId (#PCDATA )>
+<!ATTLIST TransmissionId %localid;
+ Repeat CDATA #IMPLIED >
+<!--
+==================================== Update ====================================
+A modification to an existing NewsItem. This can be an insertion, replacement
+or deletion. Note that the Update element cannot be used to modify the
+NewsManagement or Identification element, or any of their descendants.
+Modifications to these parts of the NewsItem can be made by issuing the
+NewsItem under the current revision number, with only the Identification and
+NewsManagement elements present. These will replace the previous Identification
+and NewsManagement elements in their totality.
+================================================================================
+-->
+<!ELEMENT Update (InsertBefore | InsertAfter | Replace | Delete )*>
+<!ATTLIST Update %localid; >
+<!--
+=================================== Urgency ====================================
+An indication of the urgency of a NewsItem. The value of the FormalName
+attribute is a formal name for the Urgency. Its meaning and permitted values
+are determined by a controlled vocabulary as described in the comment to the
+formalname ENTITY declaration above.
+================================================================================
+-->
+<!ELEMENT Urgency EMPTY>
+<!ATTLIST Urgency %localid;
+ %formalname; >
+<!--
+===================================== Url ======================================
+A URL that can be used to locate a Resource.
+================================================================================
+-->
+<!ELEMENT Url (#PCDATA )>
+<!ATTLIST Url %localid; >
+<!--
+===================================== Urn ======================================
+A URN that provides a global identifier for a resource. This will typically (but
+not necessarily) be a NewsML URN as described in the comment to PublicIdentifier.
+================================================================================
+-->
+<!ELEMENT Urn (#PCDATA )>
+<!ATTLIST Urn %localid; >
+<!--
+================================= UsageRights ==================================
+Information about the usage rights pertaining to a NewsComponent.
+================================================================================
+-->
+<!ELEMENT UsageRights (UsageType? , Geography? , RightsHolder? , Limitations? , StartDate? , EndDate? )>
+<!ATTLIST UsageRights %localid;
+ %assignment; >
+<!--
+================================== UsageType ===================================
+A natural-language indication of the type of usage to which the rights apply.
+================================================================================
+-->
+<!ELEMENT UsageType (#PCDATA | Origin )*>
+<!ATTLIST UsageType %localid;
+ xml:lang CDATA #IMPLIED
+ %assignment; >
diff --git a/test/valid/dtds/destfoo.ent b/test/valid/dtds/destfoo.ent
new file mode 100644
index 0000000..0791e1a
--- /dev/null
+++ b/test/valid/dtds/destfoo.ent
@@ -0,0 +1 @@
+<dest id='foo'/>
diff --git a/test/valid/dtds/nitf-2-5.dtd b/test/valid/dtds/nitf-2-5.dtd
new file mode 100644
index 0000000..253e620
--- /dev/null
+++ b/test/valid/dtds/nitf-2-5.dtd
@@ -0,0 +1,1004 @@
+ <!--
+ News Industry Text Format
+ Document Type Definition - Version 2.5
+ http://www.nitf.org/
+
+ Copyright (c) 2000. All Rights Reserved.
+ International Press Telecommunications Council
+ http://www.iptc.org
+
+ Last changed: 9 August 2000 wb/kr/ak
+
+ For the list of modifications from previous releases, see:
+ http://www.nitf.org/recent-modifications.html
+
+ For the list of proposed modifications, see:
+ http://www.nitf.org/proposed-changes.html
+-->
+
+
+
+<!ENTITY % enriched-text '
+ #PCDATA
+ | chron
+ | copyrite
+ | event
+ | function
+ | location
+ | money
+ | num
+ | object.title
+ | org
+ | person
+ | postaddr
+ | virtloc
+ | a
+ | br
+ | em
+ | lang
+ | pronounce
+ | q
+ '>
+
+<!ENTITY % block.head "dateline?, copyrite?, abstract?">
+<!ENTITY % block.content "p | hl2 | table | media | ol | ul | dl | bq | fn | note | pre | hr">
+<!ENTITY % block.end "datasource?">
+
+
+<!ENTITY % global-attributes '
+ id ID #IMPLIED
+ '>
+<!ENTITY % common-attributes '
+ %global-attributes;
+ class NMTOKENS #IMPLIED
+ style CDATA #IMPLIED
+ lang NMTOKEN #IMPLIED
+ dir (ltr | rtl) #IMPLIED
+ '>
+<!ENTITY % cell.align '
+ align (left | center | right | justify | char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED
+ '>
+<!ENTITY % cell.valign '
+ valign (top | middle | bottom | baseline) #IMPLIED
+ '>
+<!ENTITY % url.link '
+ md CDATA #IMPLIED
+ '>
+<!ENTITY % boolean '(true | false)'>
+
+
+<!ELEMENT nitf (head, body)>
+<!ATTLIST nitf
+ %global-attributes;
+ uno CDATA #IMPLIED
+ version CDATA #FIXED "-//IPTC-NAA//DTD NITF-XML 2.1//EN"
+ change.date CDATA #FIXED "4 July 2000"
+ change.time CDATA #FIXED "1900"
+ baselang CDATA #IMPLIED
+ class NMTOKENS #IMPLIED
+ >
+
+
+<!ELEMENT head (title?, meta*, tobject?, iim?, docdata?, pubdata*, revision-history*)>
+<!ATTLIST head
+ %global-attributes;
+ >
+
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title
+ %global-attributes;
+ type (
+ main
+ | subtitle
+ | parttitle
+ | alternate
+ | abbrev
+ | other
+ ) #IMPLIED
+ >
+
+<!ELEMENT meta EMPTY>
+<!ATTLIST meta
+ %global-attributes;
+ http-equiv NMTOKEN #IMPLIED
+ name NMTOKEN #IMPLIED
+ content CDATA #REQUIRED
+ >
+
+<!ELEMENT tobject (tobject.property*, tobject.subject*)>
+<!ATTLIST tobject
+ %global-attributes;
+ tobject.type CDATA "news"
+ >
+
+ <!ELEMENT tobject.property EMPTY>
+ <!ATTLIST tobject.property
+ %global-attributes;
+ tobject.property.type CDATA "current"
+ >
+
+ <!ELEMENT tobject.subject EMPTY>
+ <!ATTLIST tobject.subject
+ %global-attributes;
+ tobject.subject.ipr CDATA "IPTC"
+ tobject.subject.refnum NMTOKEN #REQUIRED
+ tobject.subject.code CDATA #IMPLIED
+ tobject.subject.type CDATA #IMPLIED
+ tobject.subject.matter CDATA #IMPLIED
+ tobject.subject.detail CDATA #IMPLIED
+ >
+
+<!ELEMENT iim (ds*)>
+<!ATTLIST iim
+ %global-attributes;
+ ver NMTOKEN #IMPLIED
+ >
+
+ <!ELEMENT ds EMPTY>
+ <!ATTLIST ds
+ %global-attributes;
+ num NMTOKEN #REQUIRED
+ value CDATA #IMPLIED
+ >
+
+<!ELEMENT docdata (
+ correction
+ | evloc
+ | doc-id
+ | del-list
+ | urgency
+ | fixture
+ | date.issue
+ | date.release
+ | date.expire
+ | doc-scope
+ | series
+ | ed-msg
+ | du-key
+ | doc.copyright
+ | doc.rights
+ | key-list
+ )*>
+<!ATTLIST docdata
+ %global-attributes;
+ >
+
+ <!ELEMENT correction EMPTY>
+ <!ATTLIST correction
+ %global-attributes;
+ info CDATA #IMPLIED
+ id-string CDATA #IMPLIED
+ reg-src CDATA #IMPLIED
+ >
+
+ <!ELEMENT evloc EMPTY>
+ <!ATTLIST evloc
+ %global-attributes;
+ iso-cc CDATA #IMPLIED
+ state-prov CDATA #IMPLIED
+ county-dist CDATA #IMPLIED
+ city CDATA #IMPLIED
+ >
+
+ <!ELEMENT doc-id EMPTY>
+ <!ATTLIST doc-id
+ %global-attributes;
+ regsrc CDATA #IMPLIED
+ id-string CDATA #IMPLIED
+ >
+
+ <!ELEMENT del-list (from-src)*>
+ <!ATTLIST del-list
+ %global-attributes;
+ >
+
+ <!ELEMENT from-src EMPTY>
+ <!ATTLIST from-src
+ %global-attributes;
+ src-name CDATA #IMPLIED
+ level-number CDATA #IMPLIED
+ >
+
+ <!ELEMENT urgency EMPTY>
+ <!ATTLIST urgency
+ %global-attributes;
+ ed-urg NMTOKEN #IMPLIED
+ >
+
+ <!ELEMENT fixture EMPTY>
+ <!ATTLIST fixture
+ %global-attributes;
+ fix-id CDATA #IMPLIED
+ >
+
+ <!ELEMENT date.issue EMPTY>
+ <!ATTLIST date.issue
+ %global-attributes;
+ norm CDATA #IMPLIED
+ >
+
+ <!ELEMENT date.release EMPTY>
+ <!ATTLIST date.release
+ %global-attributes;
+ norm CDATA #IMPLIED
+ >
+
+ <!ELEMENT date.expire EMPTY>
+ <!ATTLIST date.expire
+ %global-attributes;
+ norm CDATA #IMPLIED
+ >
+
+ <!ELEMENT doc-scope EMPTY>
+ <!ATTLIST doc-scope
+ %global-attributes;
+ scope CDATA #IMPLIED
+ >
+
+ <!ELEMENT series EMPTY>
+ <!ATTLIST series
+ %global-attributes;
+ series.name CDATA #IMPLIED
+ series.part NMTOKEN "0"
+ series.totalpart NMTOKEN "0"
+ >
+
+ <!ELEMENT ed-msg EMPTY>
+ <!ATTLIST ed-msg
+ %global-attributes;
+ msg-type CDATA #IMPLIED
+ info CDATA #IMPLIED
+ >
+
+ <!ELEMENT du-key EMPTY>
+ <!ATTLIST du-key
+ %global-attributes;
+ generation NMTOKEN #IMPLIED
+ part NMTOKEN #IMPLIED
+ version NMTOKEN #IMPLIED
+ key CDATA #IMPLIED
+ >
+
+ <!ELEMENT doc.copyright EMPTY>
+ <!ATTLIST doc.copyright
+ %global-attributes;
+ year NMTOKEN #IMPLIED
+ holder CDATA #IMPLIED
+ >
+
+ <!ELEMENT doc.rights EMPTY>
+ <!ATTLIST doc.rights
+ %global-attributes;
+ owner CDATA #IMPLIED
+ startdate CDATA #IMPLIED
+ enddate CDATA #IMPLIED
+ agent CDATA #IMPLIED
+ geography CDATA #IMPLIED
+ location-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ type CDATA #IMPLIED
+ limitations CDATA #IMPLIED
+ >
+
+ <!ELEMENT key-list (keyword)*>
+ <!ATTLIST key-list
+ %global-attributes;
+ >
+
+ <!ELEMENT keyword EMPTY>
+ <!ATTLIST keyword
+ %global-attributes;
+ key CDATA #IMPLIED
+ >
+
+<!ELEMENT pubdata EMPTY>
+<!ATTLIST pubdata
+ %global-attributes;
+ type (
+ print
+ | audio
+ | video
+ | web
+ | appliance
+ | other
+ ) #IMPLIED
+ item-length CDATA #IMPLIED
+ unit-of-measure (
+ word
+ | character
+ | byte
+ | inch
+ | pica
+ | cm
+ | hour
+ | minute
+ | second
+ | other
+ ) #IMPLIED
+ date.publication CDATA #IMPLIED
+ name CDATA #IMPLIED
+ issn CDATA #IMPLIED
+ volume CDATA #IMPLIED
+ number CDATA #IMPLIED
+ issue CDATA #IMPLIED
+ edition.name CDATA #IMPLIED
+ edition.area CDATA #IMPLIED
+ position.section CDATA #IMPLIED
+ position.sequence CDATA #IMPLIED
+ ex-ref CDATA #IMPLIED
+ >
+
+<!ELEMENT revision-history EMPTY>
+<!ATTLIST revision-history
+ %global-attributes;
+ name CDATA #IMPLIED
+ function (
+ writer-author
+ | editor
+ | producer
+ | archivist
+ | videographer
+ | graphic-artist
+ | photographer
+ | statistician
+ | other
+ ) #IMPLIED
+ norm CDATA #IMPLIED
+ comment CDATA #IMPLIED
+ >
+
+
+<!ELEMENT body (body.head?, body.content*, body.end?)>
+<!ATTLIST body
+ %common-attributes;
+ background CDATA #IMPLIED
+ >
+
+
+<!ELEMENT body.head (
+ hedline?,
+ note*,
+ rights?,
+ byline*,
+ distributor?,
+ dateline*,
+ abstract?,
+ series?
+ )>
+<!ATTLIST body.head
+ %global-attributes;
+ >
+
+<!ELEMENT hedline (hl1, hl2*)>
+<!ATTLIST hedline
+ %global-attributes;
+ >
+
+ <!ELEMENT hl1 (%enriched-text;)*>
+ <!ATTLIST hl1 %common-attributes;>
+
+ <!ELEMENT hl2 (%enriched-text;)*>
+ <!ATTLIST hl2 %common-attributes;>
+
+<!ELEMENT note (body.content)+>
+<!ATTLIST note
+ %common-attributes;
+ noteclass (
+ cpyrt
+ | end
+ | hd
+ | editorsnote
+ | trademk
+ | undef
+ ) #IMPLIED
+ type (std | pa | npa) "std"
+ src CDATA #IMPLIED
+ %url.link;
+ >
+
+<!ELEMENT rights (
+ #PCDATA
+ | rights.owner
+ | rights.startdate
+ | rights.enddate
+ | rights.agent
+ | rights.geography
+ | rights.type
+ | rights.limitations
+ )*>
+<!ATTLIST rights
+ %global-attributes;
+ >
+
+ <!ELEMENT rights.owner (#PCDATA)>
+ <!ATTLIST rights.owner
+ %global-attributes;
+ contact CDATA #IMPLIED
+ >
+
+ <!ELEMENT rights.startdate (#PCDATA)>
+ <!ATTLIST rights.startdate
+ %global-attributes;
+ norm CDATA #IMPLIED
+ >
+
+ <!ELEMENT rights.enddate (#PCDATA)>
+ <!ATTLIST rights.enddate
+ %global-attributes;
+ norm CDATA #IMPLIED
+ >
+
+ <!ELEMENT rights.agent (#PCDATA)>
+ <!ATTLIST rights.agent
+ %global-attributes;
+ contact CDATA #IMPLIED
+ >
+
+ <!ELEMENT rights.geography (#PCDATA)>
+ <!ATTLIST rights.geography
+ %global-attributes;
+ location-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ >
+
+ <!ELEMENT rights.type (#PCDATA)>
+ <!ATTLIST rights.type
+ %global-attributes;
+ >
+
+ <!ELEMENT rights.limitations (#PCDATA)>
+ <!ATTLIST rights.limitations
+ %global-attributes;
+ >
+
+<!ELEMENT byline (#PCDATA | person | byttl | location | virtloc)*>
+<!ATTLIST byline
+ %global-attributes;
+ >
+
+ <!ELEMENT byttl (#PCDATA | org )*>
+ <!ATTLIST byttl
+ %global-attributes;
+ >
+
+<!ELEMENT distributor (#PCDATA | org)*>
+<!ATTLIST distributor
+ %global-attributes;
+ >
+
+<!ELEMENT dateline (#PCDATA | location | story.date)*>
+<!ATTLIST dateline %common-attributes;>
+
+ <!ELEMENT story.date (#PCDATA)>
+ <!ATTLIST story.date
+ %global-attributes;
+ norm CDATA #IMPLIED
+ >
+
+<!ELEMENT abstract (%block.content;)+>
+<!ATTLIST abstract
+ %global-attributes;
+ >
+
+
+<!ELEMENT copyrite (#PCDATA | copyrite.year | copyrite.holder)*>
+<!ATTLIST copyrite
+ %global-attributes;
+ >
+
+ <!ELEMENT copyrite.year (#PCDATA)>
+ <!ATTLIST copyrite.year
+ %global-attributes;
+ >
+
+ <!ELEMENT copyrite.holder (#PCDATA)>
+ <!ATTLIST copyrite.holder
+ %global-attributes;
+ >
+
+
+<!ELEMENT body.content (block | %block.content;)*>
+<!ATTLIST body.content
+ %global-attributes;
+ >
+
+<!ELEMENT block ((%block.head;)?, (%block.content;)*, (%block.end;)?)>
+<!ATTLIST block %common-attributes;>
+
+<!ELEMENT p (%enriched-text;)*>
+<!ATTLIST p
+ %common-attributes;
+ lede %boolean; #IMPLIED
+ summary %boolean; #IMPLIED
+ optional-text %boolean; #IMPLIED
+ >
+
+
+<!ELEMENT table (caption?, (col* | colgroup*), thead?, tfoot?, tbody+)>
+<!ATTLIST table
+ %common-attributes;
+ tabletype ENTITY #IMPLIED
+ align (
+ left
+ | center
+ | right
+ ) #IMPLIED
+ width CDATA #IMPLIED
+ cols NMTOKEN #IMPLIED
+ border CDATA #IMPLIED
+ frame (
+ void
+ | above
+ | below
+ | hsides
+ | lhs
+ | rhs
+ | vsides
+ | box
+ | border
+ ) #IMPLIED
+ rules (
+ none
+ | basic
+ | rows
+ | cols
+ | all
+ ) #IMPLIED
+ cellspacing CDATA #IMPLIED
+ cellpadding CDATA #IMPLIED
+ table.fmt CDATA #IMPLIED
+ table.domain CDATA #IMPLIED
+ table.inst CDATA #IMPLIED
+ >
+
+<!ELEMENT media (media-metadata*, media-reference, media-object?, media-caption*, media-producer?)>
+<!ATTLIST media
+ %common-attributes;
+ media-type (
+ text
+ | audio
+ | image
+ | video
+ | data
+ | application
+ | other
+ ) #REQUIRED
+ >
+
+ <!ELEMENT media-reference (#PCDATA)>
+ <!ATTLIST media-reference
+ %common-attributes;
+ data-location CDATA #REQUIRED
+ name CDATA #IMPLIED
+ source CDATA #IMPLIED
+ mime-type CDATA #REQUIRED
+ coding CDATA #IMPLIED
+ time CDATA #IMPLIED
+ time-unit-of-measure CDATA #IMPLIED
+ outcue CDATA #IMPLIED
+ source-credit CDATA #IMPLIED
+ copyright CDATA #IMPLIED
+ alternate-text CDATA #IMPLIED
+ height NMTOKEN #IMPLIED
+ width NMTOKEN #IMPLIED
+ units (pixels) "pixels"
+ imagemap CDATA #IMPLIED
+ noflow (noflow) #IMPLIED
+ >
+
+ <!ELEMENT media-metadata EMPTY>
+ <!ATTLIST media-metadata
+ %common-attributes;
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ >
+
+ <!ELEMENT media-object (#PCDATA)>
+ <!ATTLIST media-object
+ %common-attributes;
+ encoding CDATA #REQUIRED
+ >
+
+ <!ELEMENT media-caption (%enriched-text; | %block.content;)*>
+ <!ATTLIST media-caption
+ %common-attributes;
+ >
+
+ <!ELEMENT media-producer (%enriched-text;)*>
+ <!ATTLIST media-producer
+ %common-attributes;
+ >
+
+<!ELEMENT ol (li)+>
+<!ATTLIST ol
+ %common-attributes;
+ continue (continue) #IMPLIED
+ seqnum NMTOKEN #IMPLIED
+ compact (compact) #IMPLIED
+ >
+
+<!ELEMENT ul (li)+>
+<!ATTLIST ul
+ %common-attributes;
+ wrap (vert | horiz | none) "none"
+ plain (plain) #IMPLIED
+ dingbat ENTITY #IMPLIED
+ src CDATA #IMPLIED
+ %url.link;
+ compact (compact) #IMPLIED
+ >
+
+ <!ELEMENT li (%enriched-text; | %block.content;)*>
+ <!ATTLIST li
+ %common-attributes;
+ dingbat ENTITY #IMPLIED
+ src CDATA #IMPLIED
+ %url.link;
+ skip NMTOKEN "0"
+ >
+
+<!ELEMENT dl (dt | dd)+>
+<!ATTLIST dl %common-attributes;>
+
+ <!ELEMENT dt (%enriched-text;)*>
+ <!ATTLIST dt %common-attributes;>
+
+ <!ELEMENT dd (block)*>
+ <!ATTLIST dd %common-attributes;>
+
+<!ELEMENT bq (block+, credit?)*>
+<!ATTLIST bq
+ %common-attributes;
+ nowrap (nowrap) #IMPLIED
+ quote-source CDATA #IMPLIED
+ >
+
+ <!ELEMENT credit (%enriched-text;)*>
+ <!ATTLIST credit %common-attributes;>
+
+<!ELEMENT fn (body.content)+>
+<!ATTLIST fn %common-attributes;>
+
+
+<!ELEMENT pre (#PCDATA)>
+<!ATTLIST pre
+ %global-attributes;
+ >
+
+<!ELEMENT hr EMPTY>
+<!ATTLIST hr
+ %global-attributes;
+ src CDATA #IMPLIED
+ >
+
+
+<!ELEMENT datasource (#PCDATA)>
+<!ATTLIST datasource
+ %global-attributes;
+ >
+
+
+
+<!ELEMENT caption (%enriched-text; | %block.content;)*>
+<!ATTLIST caption
+ %common-attributes;
+ align (
+ top
+ | bottom
+ | left
+ | right
+ ) #IMPLIED
+ >
+
+<!ELEMENT col EMPTY>
+<!ATTLIST col
+ %common-attributes;
+ span NMTOKEN "1"
+ width CDATA #IMPLIED
+ %cell.align;
+ %cell.valign;
+ >
+
+<!ELEMENT colgroup (col+)>
+<!ATTLIST colgroup
+ %common-attributes;
+ %cell.align;
+ %cell.valign;
+ >
+
+<!ELEMENT thead (tr+)>
+<!ATTLIST thead
+ %common-attributes;
+ %cell.align;
+ %cell.valign;
+ >
+
+<!ELEMENT tbody (tr+)>
+<!ATTLIST tbody
+ %common-attributes;
+ %cell.align;
+ %cell.valign;
+ >
+
+<!ELEMENT tfoot (tr+)>
+<!ATTLIST tfoot
+ %common-attributes;
+ %cell.align;
+ %cell.valign;
+ >
+
+<!ELEMENT tr (th | td)+>
+<!ATTLIST tr
+ %common-attributes;
+ %cell.align;
+ %cell.valign;
+ >
+
+<!ELEMENT th (%enriched-text; | %block.content;)*>
+<!ATTLIST th
+ %common-attributes;
+ axis CDATA #IMPLIED
+ axes CDATA #IMPLIED
+ nowrap (nowrap) #IMPLIED
+ rowspan NMTOKEN "1"
+ colspan NMTOKEN "1"
+ %cell.align;
+ %cell.valign;
+ >
+
+<!ELEMENT td (%enriched-text; | %block.content;)*>
+<!ATTLIST td
+ %common-attributes;
+ axis CDATA #IMPLIED
+ axes CDATA #IMPLIED
+ nowrap (nowrap) #IMPLIED
+ rowspan NMTOKEN "1"
+ colspan NMTOKEN "1"
+ %cell.align;
+ %cell.valign;
+ >
+
+
+<!ELEMENT chron (#PCDATA)>
+<!ATTLIST chron
+ %global-attributes;
+ norm CDATA #IMPLIED
+ >
+
+
+<!ELEMENT event (#PCDATA | alt-code)*>
+<!ATTLIST event
+ %global-attributes;
+ start-date CDATA #IMPLIED
+ end-date CDATA #IMPLIED
+ idsrc CDATA #REQUIRED
+ value CDATA #REQUIRED
+ >
+
+<!ELEMENT function (#PCDATA | alt-code)*>
+<!ATTLIST function
+ %global-attributes;
+ idsrc CDATA #REQUIRED
+ value CDATA #REQUIRED
+ >
+
+<!ELEMENT location (#PCDATA | sublocation | city | state | region | country | alt-code)*>
+<!ATTLIST location
+ %global-attributes;
+ location-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ >
+
+ <!ELEMENT sublocation (#PCDATA | alt-code)*>
+ <!ATTLIST sublocation
+ %global-attributes;
+ location-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ >
+
+ <!ELEMENT city (#PCDATA | alt-code)*>
+ <!ATTLIST city
+ %global-attributes;
+ city-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ >
+
+ <!ELEMENT state (#PCDATA | alt-code)*>
+ <!ATTLIST state
+ %global-attributes;
+ state-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ >
+
+ <!ELEMENT region (#PCDATA | alt-code)*>
+ <!ATTLIST region
+ %global-attributes;
+ region-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ >
+
+ <!ELEMENT country (#PCDATA | alt-code)*>
+ <!ATTLIST country
+ %global-attributes;
+ iso-cc CDATA #IMPLIED
+ >
+
+<!ELEMENT money (#PCDATA)>
+<!ATTLIST money
+ %global-attributes;
+ unit CDATA #IMPLIED
+ date CDATA #IMPLIED
+ >
+
+<!ELEMENT num (#PCDATA | frac | sub | sup)*>
+<!ATTLIST num
+ %global-attributes;
+ units CDATA #IMPLIED
+ decimal-ch CDATA #IMPLIED
+ thousands-ch CDATA #IMPLIED
+ >
+
+ <!ELEMENT frac (numer, frac-sep?, denom)>
+ <!ATTLIST frac
+ %global-attributes;
+ >
+
+ <!ELEMENT numer (#PCDATA)>
+ <!ATTLIST numer
+ %global-attributes;
+ >
+
+ <!ELEMENT frac-sep (#PCDATA)>
+ <!ATTLIST frac-sep
+ %global-attributes;
+ >
+
+ <!ELEMENT denom (#PCDATA)>
+ <!ATTLIST denom
+ %global-attributes;
+ >
+
+ <!ELEMENT sub (#PCDATA)>
+ <!ATTLIST sub %common-attributes;>
+
+ <!ELEMENT sup (#PCDATA)>
+ <!ATTLIST sup %common-attributes;>
+
+<!ELEMENT object.title (#PCDATA | alt-code)*>
+<!ATTLIST object.title
+ %common-attributes;
+ idsrc CDATA #REQUIRED
+ value CDATA #REQUIRED
+ >
+
+<!ELEMENT org (#PCDATA | alt-code)*>
+<!ATTLIST org
+ %global-attributes;
+ idsrc CDATA #REQUIRED
+ value CDATA #REQUIRED
+ >
+
+ <!ELEMENT alt-code EMPTY>
+ <!ATTLIST alt-code
+ %global-attributes;
+ idsrc CDATA #REQUIRED
+ value CDATA #REQUIRED
+ >
+
+<!ELEMENT person (#PCDATA | name.given | name.family | function | alt-code)*>
+<!ATTLIST person
+ %global-attributes;
+ idsrc CDATA #REQUIRED
+ value CDATA #REQUIRED
+ >
+
+ <!ELEMENT name.given (#PCDATA)>
+ <!ATTLIST name.given
+ %global-attributes;
+ >
+
+ <!ELEMENT name.family (#PCDATA)>
+ <!ATTLIST name.family
+ %global-attributes;
+ >
+
+<!ELEMENT postaddr (addressee, delivery.point?, (postcode | delivery.office | region | country)*)>
+<!ATTLIST postaddr
+ %global-attributes;
+ >
+
+<!ELEMENT virtloc (#PCDATA | alt-code)*>
+<!ATTLIST virtloc
+ %global-attributes;
+ idsrc CDATA #REQUIRED
+ value CDATA #REQUIRED
+ >
+
+<!ELEMENT a (%enriched-text;)*>
+<!ATTLIST a
+ %common-attributes;
+ href CDATA #IMPLIED
+ name CDATA #IMPLIED
+ %url.link;
+ rel NMTOKEN #IMPLIED
+ rev NMTOKEN #IMPLIED
+ title CDATA #IMPLIED
+ methods NMTOKENS #IMPLIED
+ >
+
+<!ELEMENT br EMPTY>
+<!ATTLIST br
+ %global-attributes;
+ >
+
+<!ELEMENT em (%enriched-text;)*>
+<!ATTLIST em %common-attributes;>
+
+<!ELEMENT lang (%enriched-text;)*>
+<!ATTLIST lang %common-attributes;>
+
+<!ELEMENT pronounce (%enriched-text;)*>
+<!ATTLIST pronounce
+ %global-attributes;
+ guide CDATA #IMPLIED
+ phonetic CDATA #IMPLIED
+ >
+
+<!ELEMENT q (%enriched-text;)*>
+<!ATTLIST q
+ %common-attributes;
+ quote-source CDATA #IMPLIED
+ >
+
+
+<!ELEMENT addressee (person, function?, care.of?)>
+<!ATTLIST addressee
+ %global-attributes;
+ >
+
+ <!ELEMENT care.of (#PCDATA)>
+ <!ATTLIST care.of
+ %global-attributes;
+ >
+
+<!ELEMENT delivery.point (#PCDATA | br)*>
+<!ATTLIST delivery.point
+ %global-attributes;
+ point-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ >
+
+<!ELEMENT postcode (#PCDATA)>
+<!ATTLIST postcode
+ %global-attributes;
+ code-source CDATA #IMPLIED
+ >
+
+<!ELEMENT delivery.office (#PCDATA | br)*>
+<!ATTLIST delivery.office
+ %global-attributes;
+ office-code CDATA #IMPLIED
+ code-source CDATA #IMPLIED
+ >
+
+
+
+
+<!ELEMENT body.end (tagline?, bibliography?)>
+<!ATTLIST body.end
+ %global-attributes;
+ >
+
+<!ELEMENT tagline (%enriched-text;)*>
+<!ATTLIST tagline
+ %global-attributes;
+ type (std | pa | npa) "std"
+ >
+
+<!ELEMENT bibliography (#PCDATA)>
+<!ATTLIST bibliography
+ %global-attributes;
+ >
+
diff --git a/test/valid/dtds/spec.dtd b/test/valid/dtds/spec.dtd
new file mode 100755
index 0000000..0fdfb86
--- /dev/null
+++ b/test/valid/dtds/spec.dtd
@@ -0,0 +1,972 @@
+<!-- ............................................................... -->
+<!-- XML specification DTD ......................................... -->
+<!-- ............................................................... -->
+
+<!--
+TYPICAL INVOCATION:
+# <!DOCTYPE spec PUBLIC
+# "-//W3C//DTD Specification::19980323//EN"
+# "http://www.w3.org/XML/Group/DTD/xmlspec.dtd">
+
+PURPOSE:
+ This DTD was developed for use with the XML family of W3C
+ specifications. It is an XML-compliant DTD based in part on
+ the TEI Lite and Sweb DTDs.
+
+DEPENDENCIES:
+ None.
+
+CHANGE HISTORY:
+ The list of changes is at the end of the DTD.
+
+ For all details, see the design report at:
+
+ <http://www.w3.org/XML/Group/DTD/xmlspec-report.htm>
+
+ The "typical invocation" FPI always gets updated to reflect the
+ date of the most recent changes.
+
+ Search this file for "#" in the first column to see change history
+ comments.
+
+MAINTAINER:
+ Eve Maler
+ ArborText Inc.
+ elm@arbortext.com
+ voice: +1 781 270 5750
+ fax: +1 781 273 3760
+-->
+
+<!-- ............................................................... -->
+<!-- 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.
+-->
+
+<!ENTITY lt "&#38;#60;">
+<!ENTITY gt "&#62;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY apos "&#39;">
+<!ENTITY quot "&#34;">
+<!ENTITY mdash "--">
+<!ENTITY nbsp "&#160;">
+<!ENTITY ldquo "#x201C;">
+<!ENTITY rdquo "#x201D;">
+
+<!-- ............................................................... -->
+<!-- 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.
+-->
+
+<!ENTITY % local.p.class "">
+<!ENTITY % p.class "p
+ %local.p.class;">
+
+<!ENTITY % local.statusp.class "">
+<!ENTITY % statusp.class "statusp
+ %local.statusp.class;">
+
+<!ENTITY % local.list.class "">
+<!ENTITY % list.class "ulist|olist|slist|glist
+ %local.list.class;">
+
+<!ENTITY % local.speclist.class "">
+<!ENTITY % speclist.class "orglist|blist
+ %local.speclist.class;">
+
+<!ENTITY % local.note.class "">
+<!ENTITY % note.class "note|wfcnote|vcnote
+ %local.note.class;">
+
+<!ENTITY % local.illus.class "">
+<!ENTITY % illus.class "eg|graphic|scrap|htable
+ %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.
+-->
+
+<!ENTITY % local.annot.class "">
+<!ENTITY % annot.class "footnote
+ %local.annot.class;">
+
+<!ENTITY % local.termdef.class "">
+<!ENTITY % termdef.class "termdef|term
+ %local.termdef.class;">
+
+<!ENTITY % local.emph.class "">
+<!ENTITY % emph.class "emph|quote
+ %local.emph.class;">
+
+<!ENTITY % local.ref.class "">
+<!ENTITY % ref.class "bibref|specref|termref|titleref
+ |xspecref|xtermref
+ %local.ref.class;">
+
+<!ENTITY % local.loc.class "">
+<!ENTITY % loc.class "loc
+ %local.loc.class;">
+
+<!ENTITY % local.tech.class "">
+<!ENTITY % tech.class "kw|nt|xnt|code
+ %local.tech.class;">
+
+<!ENTITY % local.ednote.class "">
+<!ENTITY % 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-123: maler: Added %termdef.mix; (broken out from
+# %termdef.pcd.mix;).
+-->
+
+<!ENTITY % div.mix
+ "%p.class;|%list.class;|%speclist.class;|%note.class;
+ |%illus.class;|%ednote.class;">
+<!ENTITY % obj.mix
+ "%p.class;|%list.class;|%speclist.class;|%note.class;
+ |%illus.class;|%ednote.class;">
+<!ENTITY % p.mix
+ "%list.class;|%speclist.class;|%note.class;|%illus.class;">
+<!ENTITY % entry.mix
+ "%list.class;|note|eg|graphic|%ednote.class;">
+<!ENTITY % statusobj.mix
+ "%p.class;|%statusp.class;|%list.class;">
+<!ENTITY % hdr.mix
+ "%p.class;|%list.class;|%ednote.class;">
+<!ENTITY % termdef.mix
+ "%note.class;|%illus.class;">
+
+<!-- ............................................................... -->
+<!-- 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;.
+-->
+
+<!ENTITY % p.pcd.mix
+ "#PCDATA|%annot.class;|%termdef.class;|%emph.class;
+ |%ref.class;|%tech.class;|%loc.class;|%ednote.class;">
+<!ENTITY % statusp.pcd.mix
+ "#PCDATA|%annot.class;|%termdef.class;|%emph.class;
+ |%ref.class;|%tech.class;|%loc.class;|%ednote.class;">
+<!ENTITY % head.pcd.mix
+ "#PCDATA|%annot.class;|%emph.class;|%tech.class;|%ednote.class;">
+<!ENTITY % label.pcd.mix
+ "#PCDATA|%annot.class;|%termdef.class;|%emph.class;|%tech.class;
+ |%ednote.class;">
+<!ENTITY % eg.pcd.mix
+ "#PCDATA|%annot.class;|%emph.class;|%ednote.class;">
+<!ENTITY % termdef.pcd.mix
+ "#PCDATA|term|%emph.class;|%ref.class;|%tech.class;
+ |%ednote.class;">
+<!ENTITY % bibl.pcd.mix
+ "#PCDATA|%emph.class;|%ref.class;|%loc.class;|%ednote.class;">
+<!ENTITY % tech.pcd.mix
+ "#PCDATA|%ednote.class;">
+<!ENTITY % loc.pcd.mix
+ "#PCDATA|%loc.class;|%ednote.class;">
+
+<!-- ............................................................... -->
+<!-- Entities for customizable content models ...................... -->
+
+<!--
+#1998-03-10: maler: Added customization entities.
+-->
+
+<!ENTITY % spec.mdl
+ "header, front?, body, back?">
+
+<!ENTITY % header.mdl
+ "title, subtitle?, version, w3c-designation, w3c-doctype,
+ pubdate, notice*, publoc, latestloc?, prevlocs?, authlist,
+ abstract, status, pubstmt?, sourcedesc?, langusage,
+ revisiondesc">
+
+<!ENTITY % pubdate.mdl
+ "day?, month, year">
+
+<!-- ............................................................... -->
+<!-- Entities for common attributes ................................ -->
+
+<!-- key attribute:
+ Optionally provides a sorting or indexing key, for cases when
+ the element content is inappropriate for this purpose. -->
+<!ENTITY % key.att
+ 'key CDATA #IMPLIED'>
+
+<!-- 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. -->
+<!ENTITY % def.att
+ 'def IDREF #IMPLIED'>
+<!ENTITY % def-req.att
+ 'def IDREF #REQUIRED'>
+
+<!-- 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. -->
+<!ENTITY % ref.att
+ 'ref IDREF #IMPLIED'>
+<!ENTITY % ref-req.att
+ 'ref IDREF #REQUIRED'>
+
+<!--
+#1998-03-23: maler: Added show and actuate attributes to href.
+# Added semi-common xml:space attribute.
+-->
+
+<!-- HREF and source attributes:
+ Points to the element where more information or source data
+ can be found, using the URL (XLL simple link) mechanism.
+ For some purposes, is associated with additional XLL
+ attributes. %href.att; is for optional HREF attributes,
+ and %href-req.att; is for required HREF attributes.
+ %source-req.att; is for the source attribute, which
+ is always required. -->
+<!ENTITY % href.att
+ 'xml-link CDATA #FIXED "simple"
+ href CDATA #IMPLIED
+ show CDATA #FIXED "embed"
+ actuate CDATA #FIXED "auto"'>
+
+<!ENTITY % href-req.att
+ 'xml-link CDATA #FIXED "simple"
+ href CDATA #REQUIRED
+ show CDATA #FIXED "embed"
+ actuate CDATA #FIXED "auto"'>
+
+<!ENTITY % source-req.att
+ 'xml-link CDATA #FIXED "simple"
+ xml:attributes NMTOKENS #FIXED "href source"
+ source CDATA #REQUIRED
+ show CDATA #FIXED "embed"
+ actuate CDATA #FIXED "auto"'>
+
+<!-- xml:space attribute:
+ Indicates that the element contains white space
+ that the formatter or other application should retain,
+ as appropriate to its function. -->
+<!ENTITY % xmlspace.att
+ 'xml:space (default
+ |preserve) #FIXED "preserve"'>
+
+<!-- Common attributes:
+ Every element has an ID attribute (sometimes required,
+ but usually optional) for links, and a Role attribute
+ for extending the useful life of the DTD by allowing
+ authors to make subclasses for any element. %common.att;
+ is for common attributes where the ID is optional, and
+ %common-idreq.att; is for common attributes where the
+ ID is required. -->
+<!ENTITY % common.att
+ 'id ID #IMPLIED
+ role NMTOKEN #IMPLIED'>
+<!ENTITY % common-idreq.att
+ 'id ID #REQUIRED
+ role NMTOKEN #IMPLIED'>
+
+<!-- ............................................................... -->
+<!-- Common elements ............................................... -->
+
+<!-- head: Title on divisions, productions, and the like -->
+<!ELEMENT head (%head.pcd.mix;)*>
+<!ATTLIST head %common.att;>
+
+<!-- ............................................................... -->
+<!-- Major specification structure ................................. -->
+
+<!--
+#1998-03-10: maler: Made spec content model easily customizable.
+-->
+
+<!ELEMENT spec (%spec.mdl;)>
+<!ATTLIST spec %common.att;>
+
+<!ELEMENT front (div1+)>
+<!ATTLIST front %common.att;>
+
+<!ELEMENT body (div1+)>
+<!ATTLIST body %common.att;>
+
+<!--
+#1997-09-30: maler: Added inform-div1 to back content.
+-->
+
+<!ELEMENT back ((div1+, inform-div1*) | inform-div1+)>
+<!ATTLIST back %common.att;>
+
+<!ELEMENT div1 (head, (%div.mix;)*, div2*)>
+<!ATTLIST div1 %common.att;>
+
+<!--
+#1997-09-30: maler: Added inform-div1 declarations.
+-->
+
+<!-- inform-div1: Non-normative division in back matter -->
+<!ELEMENT inform-div1 (head, (%div.mix;)*, div2*)>
+<!ATTLIST inform-div1 %common.att;>
+
+<!ELEMENT div2 (head, (%div.mix;)*, div3*)>
+<!ATTLIST div2 %common.att;>
+
+<!ELEMENT div3 (head, (%div.mix;)*, div4*)>
+<!ATTLIST div3 %common.att;>
+
+<!ELEMENT div4 (head, (%div.mix;)*)>
+<!ATTLIST div4 %common.att;>
+
+<!-- Specification header .......... -->
+
+<!--
+#1998-03-10: maler: Made header content model easily customizable.
+-->
+
+<!ELEMENT header (%header.mdl;)>
+<!ATTLIST header %common.att;>
+
+<!-- Example of title: "Extensible Cheese Language (XCL)" -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title %common.att;>
+
+<!-- Example of subtitle: "A Cheesy Specification" -->
+<!ELEMENT subtitle (#PCDATA)>
+<!ATTLIST subtitle %common.att;>
+
+<!-- Example of version: "Version 666.0" -->
+<!ELEMENT version (#PCDATA)>
+<!ATTLIST version %common.att;>
+
+<!-- Example of w3c-designation: "WD-xcl-19991231" -->
+<!ELEMENT w3c-designation (#PCDATA)>
+<!ATTLIST w3c-designation %common.att;>
+
+<!-- Example of w3c-doctype: "World Wide Web Consortium Working
+ Draft" -->
+<!ELEMENT w3c-doctype (#PCDATA)>
+<!ATTLIST w3c-doctype %common.att;>
+
+<!--
+#1998-03-10: maler: Made pubdate content model easily customizable.
+-->
+
+<!ELEMENT pubdate (%pubdate.mdl;)>
+<!ATTLIST pubdate %common.att;>
+
+<!ELEMENT day (#PCDATA)>
+<!ATTLIST day %common.att;>
+
+<!ELEMENT month (#PCDATA)>
+<!ATTLIST month %common.att;>
+
+<!ELEMENT year (#PCDATA)>
+<!ATTLIST year %common.att;>
+
+<!-- Example of notice: "This draft is for public comment..." -->
+<!ELEMENT notice (%hdr.mix;)+>
+<!ATTLIST notice %common.att;>
+
+<!ELEMENT publoc (loc+)>
+<!ATTLIST publoc %common.att;>
+
+<!ELEMENT prevlocs (loc+)>
+<!ATTLIST prevlocs %common.att;>
+
+<!ELEMENT latestloc (loc+)>
+<!ATTLIST latestloc %common.att;>
+
+<!-- loc (defined in "Phrase-level elements" below) -->
+
+<!ELEMENT authlist (author+)>
+<!ATTLIST authlist %common.att;>
+
+<!--
+#1997-09-30: maler: Made affiliation optional.
+#1998-03-10: maler: Made email optional.
+-->
+
+<!ELEMENT author (name, affiliation?, email?)>
+<!ATTLIST author %common.att;>
+
+<!ELEMENT name (#PCDATA)>
+<!ATTLIST name
+ %common.att;
+ %key.att;>
+
+<!ELEMENT affiliation (#PCDATA)>
+<!ATTLIST affiliation %common.att;>
+
+<!ELEMENT email (#PCDATA)>
+<!-- HREF attribute:
+ email functions as a hypertext reference through this
+ required attribute. Typically the reference would use
+ the mailto: scheme. -->
+<!ATTLIST email
+ %common.att;
+ %href-req.att;>
+
+<!-- The status element now contains both statusp and p, and
+ the latter now allows loc. Use p; statusp will be removed
+ eventually. -->
+<!ELEMENT status (%statusobj.mix;)+>
+<!ATTLIST status %common.att;>
+
+<!ELEMENT abstract (%hdr.mix;)*>
+<!ATTLIST abstract %common.att;>
+
+<!ELEMENT pubstmt (%hdr.mix;)+>
+<!ATTLIST pubstmt %common.att;>
+
+<!ELEMENT sourcedesc (%hdr.mix;)+>
+<!ATTLIST sourcedesc %common.att;>
+
+<!ELEMENT langusage (language+)>
+<!ATTLIST langusage %common.att;>
+
+<!ELEMENT language (#PCDATA)>
+<!ATTLIST language %common.att;>
+
+<!ELEMENT revisiondesc (%hdr.mix;)+>
+<!ATTLIST revisiondesc %common.att;>
+
+<!-- ............................................................... -->
+<!-- Standalone elements ........................................... -->
+
+<!-- Paragraphs .................... -->
+
+<!--
+#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.
+-->
+
+<!ELEMENT p (%p.pcd.mix;|%p.mix;)*>
+<!ATTLIST p %common.att;>
+
+<!-- statusp: Special paragraph that allows loc inside it (note that
+ p now also allows loc) -->
+<!ELEMENT statusp (%statusp.pcd.mix;|%statusobj.mix;)*>
+<!ATTLIST statusp %common.att;>
+
+<!-- Lists ......................... -->
+
+<!ELEMENT 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;
+ spacing (normal|compact) #IMPLIED>
+
+<!ELEMENT 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;
+ spacing (normal|compact) #IMPLIED>
+
+<!ELEMENT item (%obj.mix;)+>
+<!ATTLIST item %common.att;>
+
+<!ELEMENT slist (sitem+)>
+<!ATTLIST slist %common.att;>
+
+<!ELEMENT sitem (%p.pcd.mix;)*>
+<!ATTLIST sitem %common.att;>
+
+<!ELEMENT glist (gitem+)>
+<!ATTLIST glist %common.att;>
+
+<!ELEMENT gitem (label, def)>
+<!ATTLIST gitem %common.att;>
+
+<!ELEMENT label (%label.pcd.mix;)*>
+<!ATTLIST label %common.att;>
+
+<!ELEMENT def (%obj.mix;)*>
+<!ATTLIST def %common.att;>
+
+<!-- Special lists ................. -->
+
+<!ELEMENT blist (bibl+)>
+<!ATTLIST blist %common.att;>
+
+<!ELEMENT bibl (%bibl.pcd.mix;)*>
+
+<!-- HREF attribute:
+ bibl optionally functions as a hypertext reference to the
+ referred-to resource through this attribute. -->
+
+<!ATTLIST bibl
+ %common.att;
+ %href.att;
+ %key.att;>
+
+<!ELEMENT orglist (member+)>
+<!ATTLIST orglist %common.att;>
+
+<!--
+#1997-09-30: maler: Added optional affiliation.
+-->
+
+<!ELEMENT member (name, affiliation?, role?)>
+<!ATTLIST member %common.att;>
+
+<!-- name (defined in "Specification header" above) -->
+<!-- affiliation (defined in "Specification header" above) -->
+
+<!ELEMENT role (#PCDATA)>
+<!ATTLIST role %common.att;>
+
+<!-- Notes ......................... -->
+
+<!ELEMENT note (%obj.mix;)+>
+<!ATTLIST note %common.att;>
+
+<!ELEMENT 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;>
+
+<!ELEMENT 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;>
+
+<!-- Illustrations ................. -->
+
+<!--
+#1998-03-23: maler: Added xml:space attribute.
+-->
+
+<!ELEMENT eg (%eg.pcd.mix;)*>
+<!ATTLIST eg
+ %common.att;
+ %xmlspace.att;>
+
+<!ELEMENT graphic EMPTY>
+<!-- source attribute:
+ The graphic data must reside at the location pointed to.
+ This is a hypertext reference, but for practical purposes,
+ for now it should just be a pathname. -->
+<!ATTLIST graphic
+ %common.att;
+ %source-req.att;
+ alt CDATA #IMPLIED>
+
+<!--
+#1997-11-28: maler: Added prodgroup to scrap and defined it.
+-->
+
+<!ELEMENT scrap (head, (prodgroup+ | prod+ | bnf))>
+<!-- lang attribute:
+ The scrap can link to a description of the language used,
+ found in a language element in the header. -->
+<!ATTLIST scrap
+ %common.att;
+ lang IDREF #IMPLIED>
+
+<!ELEMENT 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;
+ pcw1 CDATA #IMPLIED
+ pcw2 CDATA #IMPLIED
+ pcw3 CDATA #IMPLIED
+ pcw4 CDATA #IMPLIED
+ pcw5 CDATA #IMPLIED
+>
+
+<!ELEMENT prod (lhs, (rhs, (com|wfc|vc)*)+)>
+<!-- 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;>
+
+<!ELEMENT lhs (#PCDATA)>
+<!ATTLIST lhs %common.att;>
+
+<!ELEMENT rhs (#PCDATA|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.
+-->
+
+<!ELEMENT com (#PCDATA|loc|bibref)*>
+<!ATTLIST com %common.att;>
+
+<!-- wfc: Should generate the head of the wfcnote pointed to -->
+<!ELEMENT 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: Should generate the head of the vcnote pointed to -->
+<!ELEMENT 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-03-23: maler: Added xml:space attribute.
+-->
+
+<!-- bnf: Un-marked-up production -->
+<!ELEMENT bnf (%eg.pcd.mix;)*>
+<!ATTLIST bnf
+ %common.att;
+ %xmlspace.att;>
+
+<!--
+#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.
+-->
+
+<!-- TR and TD attributes:
+ Alignment attributes. No default. -->
+<!ENTITY % trtd.att
+ "align (left
+ |center
+ |right) #IMPLIED
+ valign (top
+ |middle
+ |bottom) #IMPLIED">
+
+<!ELEMENT htable (htbody+)>
+<!ATTLIST htable
+ border CDATA "0"
+ cellpadding CDATA "0"
+ align (left
+ |center
+ |right) "left">
+
+<!ELEMENT htbody (tr+)>
+<!ATTLIST htbody %common.att;>
+
+<!ELEMENT tr (td+)>
+<!ATTLIST tr
+ %common.att;
+ %trtd.att;>
+
+<!ELEMENT td (%p.pcd.mix;)*>
+<!ATTLIST td
+ %common.att;
+ %trtd.att;
+ bgcolor CDATA #IMPLIED
+ rowspan CDATA "1"
+ colspan CDATA "1">
+
+<!-- ............................................................... -->
+<!-- Phrase-level elements ......................................... -->
+
+<!-- bibref: Should generate, in square brackets, "key" on bibl -->
+<!ELEMENT bibref EMPTY>
+<!-- ref attribute:
+ A bibliography reference must link to the bibl element that
+ describes the resource. -->
+<!ATTLIST bibref
+ %common.att;
+ %ref-req.att;>
+
+<!ELEMENT code (%tech.pcd.mix;)*>
+<!ATTLIST code %common.att;>
+
+<!--
+#1998-03-10: maler: Declared ednote and related elements.
+-->
+
+<!ELEMENT ednote (name?, date?, edtext)>
+<!ATTLIST ednote %common.att;>
+
+<!ELEMENT date (#PCDATA)>
+<!ATTLIST date %common.att;>
+
+<!ELEMENT edtext (#PCDATA)>
+<!ATTLIST edtext %common.att;>
+
+<!ELEMENT emph (#PCDATA)>
+<!ATTLIST emph %common.att;>
+
+<!-- footnote: Both footnote content and call to footnote -->
+<!ELEMENT footnote (%obj.mix;)+>
+<!ATTLIST footnote %common.att;>
+
+<!ELEMENT kw (%tech.pcd.mix;)*>
+<!ATTLIST kw %common.att;>
+
+<!ELEMENT loc (#PCDATA)>
+<!-- HREF attribute:
+ The purpose of a loc element is to function as a 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.) -->
+<!ATTLIST loc
+ %common.att;
+ %href-req.att;>
+
+<!ELEMENT nt (#PCDATA)>
+<!-- def attribute:
+ The nonterminal must link to the production that defines
+ it. -->
+<!ATTLIST nt
+ %common.att;
+ %def-req.att;>
+
+<!--
+#1998-03-10: maler: Declared quote.
+-->
+
+<!-- quote: Scare quotes and other purely presentational quotes -->
+<!ELEMENT quote (%p.pcd.mix;)*>
+<!ATTLIST quote %common.att;>
+
+<!-- specref: Should generate italic "[n.n], Section Title" for
+ div, "n" for numbered item, or "[n]" for production -->
+<!ELEMENT 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;>
+
+<!ELEMENT term (#PCDATA)>
+<!ATTLIST term %common.att;>
+
+<!ELEMENT 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;
+ term CDATA #REQUIRED>
+
+<!ELEMENT termref (#PCDATA)>
+<!-- ref attribute:
+ A term reference must link to the termdef element that
+ defines the term. -->
+<!ATTLIST termref
+ %common.att;
+ %def-req.att;>
+
+<!ELEMENT titleref (#PCDATA)>
+<!-- HREF attribute:
+ A title reference can optionally function as a hypertext
+ link to the resource with this title. -->
+<!ATTLIST titleref
+ %common.att;
+ %href.att;>
+
+<!ELEMENT xnt (#PCDATA)>
+<!-- HREF attribute:
+ The nonterminal must hyperlink to a resource that serves
+ to define it (e.g., a production in a related XML
+ specification). -->
+<!ATTLIST xnt
+ %common.att;
+ %href-req.att;>
+
+<!--
+#1997-12-29: maler: Declared xspecref.
+-->
+
+<!ELEMENT xspecref (#PCDATA)>
+<!-- HREF attribute:
+ The spec reference must hyperlink to the resource to
+ cross-refer to (e.g., a section in a related XML
+ specification). -->
+<!ATTLIST xspecref
+ %common.att;
+ %href-req.att;>
+
+<!ELEMENT xtermref (#PCDATA)>
+<!-- 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). -->
+<!ATTLIST xtermref
+ %common.att;
+ %href-req.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.
+-->
+
+<!-- The following elements are purposely declared but never
+ referenced. Declaring them allows them to be pasted from
+ an HTML 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. -->
+
+<!ELEMENT div
+ (head?, (%div.mix;|ul|ol|h1|h2|h3|h4|h5|h6|div)*)>
+<!ELEMENT h1 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h2 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h3 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h4 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h5 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h6 (%head.pcd.mix;|em|a)*>
+<!ELEMENT pre (%eg.pcd.mix;|em)*>
+<!ELEMENT ul (item|li)*>
+<!ELEMENT ol (item|li)*>
+<!ELEMENT li (#PCDATA|%obj.mix;)*>
+<!ELEMENT em (#PCDATA)>
+<!ELEMENT a (#PCDATA)>
+
+<!-- ............................................................... -->
+<!-- Change 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.)
+#1997-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.
+#1997-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.
+-->
+
+<!-- ............................................................... -->
+<!-- End of XML specification DTD .................................. -->
+<!-- ............................................................... -->
diff --git a/test/valid/dtds/xhtml-lat1.ent b/test/valid/dtds/xhtml-lat1.ent
new file mode 100644
index 0000000..aaae738
--- /dev/null
+++ b/test/valid/dtds/xhtml-lat1.ent
@@ -0,0 +1,196 @@
+<!-- Portions (C) International Organization for Standardization 1986
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+-->
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
+ %HTMLlat1;
+-->
+
+<!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space,
+ U+00A0 ISOnum -->
+<!ENTITY iexcl "&#161;"> <!-- inverted exclamation mark, U+00A1 ISOnum -->
+<!ENTITY cent "&#162;"> <!-- cent sign, U+00A2 ISOnum -->
+<!ENTITY pound "&#163;"> <!-- pound sign, U+00A3 ISOnum -->
+<!ENTITY curren "&#164;"> <!-- currency sign, U+00A4 ISOnum -->
+<!ENTITY yen "&#165;"> <!-- yen sign = yuan sign, U+00A5 ISOnum -->
+<!ENTITY brvbar "&#166;"> <!-- broken bar = broken vertical bar,
+ U+00A6 ISOnum -->
+<!ENTITY sect "&#167;"> <!-- section sign, U+00A7 ISOnum -->
+<!ENTITY uml "&#168;"> <!-- diaeresis = spacing diaeresis,
+ U+00A8 ISOdia -->
+<!ENTITY copy "&#169;"> <!-- copyright sign, U+00A9 ISOnum -->
+<!ENTITY ordf "&#170;"> <!-- feminine ordinal indicator, U+00AA ISOnum -->
+<!ENTITY laquo "&#171;"> <!-- left-pointing double angle quotation mark
+ = left pointing guillemet, U+00AB ISOnum -->
+<!ENTITY not "&#172;"> <!-- not sign = discretionary hyphen,
+ U+00AC ISOnum -->
+<!ENTITY shy "&#173;"> <!-- soft hyphen = discretionary hyphen,
+ U+00AD ISOnum -->
+<!ENTITY reg "&#174;"> <!-- registered sign = registered trade mark sign,
+ U+00AE ISOnum -->
+<!ENTITY macr "&#175;"> <!-- macron = spacing macron = overline
+ = APL overbar, U+00AF ISOdia -->
+<!ENTITY deg "&#176;"> <!-- degree sign, U+00B0 ISOnum -->
+<!ENTITY plusmn "&#177;"> <!-- plus-minus sign = plus-or-minus sign,
+ U+00B1 ISOnum -->
+<!ENTITY sup2 "&#178;"> <!-- superscript two = superscript digit two
+ = squared, U+00B2 ISOnum -->
+<!ENTITY sup3 "&#179;"> <!-- superscript three = superscript digit three
+ = cubed, U+00B3 ISOnum -->
+<!ENTITY acute "&#180;"> <!-- acute accent = spacing acute,
+ U+00B4 ISOdia -->
+<!ENTITY micro "&#181;"> <!-- micro sign, U+00B5 ISOnum -->
+<!ENTITY para "&#182;"> <!-- pilcrow sign = paragraph sign,
+ U+00B6 ISOnum -->
+<!ENTITY middot "&#183;"> <!-- middle dot = Georgian comma
+ = Greek middle dot, U+00B7 ISOnum -->
+<!ENTITY cedil "&#184;"> <!-- cedilla = spacing cedilla, U+00B8 ISOdia -->
+<!ENTITY sup1 "&#185;"> <!-- superscript one = superscript digit one,
+ U+00B9 ISOnum -->
+<!ENTITY ordm "&#186;"> <!-- masculine ordinal indicator,
+ U+00BA ISOnum -->
+<!ENTITY raquo "&#187;"> <!-- right-pointing double angle quotation mark
+ = right pointing guillemet, U+00BB ISOnum -->
+<!ENTITY frac14 "&#188;"> <!-- vulgar fraction one quarter
+ = fraction one quarter, U+00BC ISOnum -->
+<!ENTITY frac12 "&#189;"> <!-- vulgar fraction one half
+ = fraction one half, U+00BD ISOnum -->
+<!ENTITY frac34 "&#190;"> <!-- vulgar fraction three quarters
+ = fraction three quarters, U+00BE ISOnum -->
+<!ENTITY iquest "&#191;"> <!-- inverted question mark
+ = turned question mark, U+00BF ISOnum -->
+<!ENTITY Agrave "&#192;"> <!-- latin capital letter A with grave
+ = latin capital letter A grave,
+ U+00C0 ISOlat1 -->
+<!ENTITY Aacute "&#193;"> <!-- latin capital letter A with acute,
+ U+00C1 ISOlat1 -->
+<!ENTITY Acirc "&#194;"> <!-- latin capital letter A with circumflex,
+ U+00C2 ISOlat1 -->
+<!ENTITY Atilde "&#195;"> <!-- latin capital letter A with tilde,
+ U+00C3 ISOlat1 -->
+<!ENTITY Auml "&#196;"> <!-- latin capital letter A with diaeresis,
+ U+00C4 ISOlat1 -->
+<!ENTITY Aring "&#197;"> <!-- latin capital letter A with ring above
+ = latin capital letter A ring,
+ U+00C5 ISOlat1 -->
+<!ENTITY AElig "&#198;"> <!-- latin capital letter AE
+ = latin capital ligature AE,
+ U+00C6 ISOlat1 -->
+<!ENTITY Ccedil "&#199;"> <!-- latin capital letter C with cedilla,
+ U+00C7 ISOlat1 -->
+<!ENTITY Egrave "&#200;"> <!-- latin capital letter E with grave,
+ U+00C8 ISOlat1 -->
+<!ENTITY Eacute "&#201;"> <!-- latin capital letter E with acute,
+ U+00C9 ISOlat1 -->
+<!ENTITY Ecirc "&#202;"> <!-- latin capital letter E with circumflex,
+ U+00CA ISOlat1 -->
+<!ENTITY Euml "&#203;"> <!-- latin capital letter E with diaeresis,
+ U+00CB ISOlat1 -->
+<!ENTITY Igrave "&#204;"> <!-- latin capital letter I with grave,
+ U+00CC ISOlat1 -->
+<!ENTITY Iacute "&#205;"> <!-- latin capital letter I with acute,
+ U+00CD ISOlat1 -->
+<!ENTITY Icirc "&#206;"> <!-- latin capital letter I with circumflex,
+ U+00CE ISOlat1 -->
+<!ENTITY Iuml "&#207;"> <!-- latin capital letter I with diaeresis,
+ U+00CF ISOlat1 -->
+<!ENTITY ETH "&#208;"> <!-- latin capital letter ETH, U+00D0 ISOlat1 -->
+<!ENTITY Ntilde "&#209;"> <!-- latin capital letter N with tilde,
+ U+00D1 ISOlat1 -->
+<!ENTITY Ograve "&#210;"> <!-- latin capital letter O with grave,
+ U+00D2 ISOlat1 -->
+<!ENTITY Oacute "&#211;"> <!-- latin capital letter O with acute,
+ U+00D3 ISOlat1 -->
+<!ENTITY Ocirc "&#212;"> <!-- latin capital letter O with circumflex,
+ U+00D4 ISOlat1 -->
+<!ENTITY Otilde "&#213;"> <!-- latin capital letter O with tilde,
+ U+00D5 ISOlat1 -->
+<!ENTITY Ouml "&#214;"> <!-- latin capital letter O with diaeresis,
+ U+00D6 ISOlat1 -->
+<!ENTITY times "&#215;"> <!-- multiplication sign, U+00D7 ISOnum -->
+<!ENTITY Oslash "&#216;"> <!-- latin capital letter O with stroke
+ = latin capital letter O slash,
+ U+00D8 ISOlat1 -->
+<!ENTITY Ugrave "&#217;"> <!-- latin capital letter U with grave,
+ U+00D9 ISOlat1 -->
+<!ENTITY Uacute "&#218;"> <!-- latin capital letter U with acute,
+ U+00DA ISOlat1 -->
+<!ENTITY Ucirc "&#219;"> <!-- latin capital letter U with circumflex,
+ U+00DB ISOlat1 -->
+<!ENTITY Uuml "&#220;"> <!-- latin capital letter U with diaeresis,
+ U+00DC ISOlat1 -->
+<!ENTITY Yacute "&#221;"> <!-- latin capital letter Y with acute,
+ U+00DD ISOlat1 -->
+<!ENTITY THORN "&#222;"> <!-- latin capital letter THORN,
+ U+00DE ISOlat1 -->
+<!ENTITY szlig "&#223;"> <!-- latin small letter sharp s = ess-zed,
+ U+00DF ISOlat1 -->
+<!ENTITY agrave "&#224;"> <!-- latin small letter a with grave
+ = latin small letter a grave,
+ U+00E0 ISOlat1 -->
+<!ENTITY aacute "&#225;"> <!-- latin small letter a with acute,
+ U+00E1 ISOlat1 -->
+<!ENTITY acirc "&#226;"> <!-- latin small letter a with circumflex,
+ U+00E2 ISOlat1 -->
+<!ENTITY atilde "&#227;"> <!-- latin small letter a with tilde,
+ U+00E3 ISOlat1 -->
+<!ENTITY auml "&#228;"> <!-- latin small letter a with diaeresis,
+ U+00E4 ISOlat1 -->
+<!ENTITY aring "&#229;"> <!-- latin small letter a with ring above
+ = latin small letter a ring,
+ U+00E5 ISOlat1 -->
+<!ENTITY aelig "&#230;"> <!-- latin small letter ae
+ = latin small ligature ae, U+00E6 ISOlat1 -->
+<!ENTITY ccedil "&#231;"> <!-- latin small letter c with cedilla,
+ U+00E7 ISOlat1 -->
+<!ENTITY egrave "&#232;"> <!-- latin small letter e with grave,
+ U+00E8 ISOlat1 -->
+<!ENTITY eacute "&#233;"> <!-- latin small letter e with acute,
+ U+00E9 ISOlat1 -->
+<!ENTITY ecirc "&#234;"> <!-- latin small letter e with circumflex,
+ U+00EA ISOlat1 -->
+<!ENTITY euml "&#235;"> <!-- latin small letter e with diaeresis,
+ U+00EB ISOlat1 -->
+<!ENTITY igrave "&#236;"> <!-- latin small letter i with grave,
+ U+00EC ISOlat1 -->
+<!ENTITY iacute "&#237;"> <!-- latin small letter i with acute,
+ U+00ED ISOlat1 -->
+<!ENTITY icirc "&#238;"> <!-- latin small letter i with circumflex,
+ U+00EE ISOlat1 -->
+<!ENTITY iuml "&#239;"> <!-- latin small letter i with diaeresis,
+ U+00EF ISOlat1 -->
+<!ENTITY eth "&#240;"> <!-- latin small letter eth, U+00F0 ISOlat1 -->
+<!ENTITY ntilde "&#241;"> <!-- latin small letter n with tilde,
+ U+00F1 ISOlat1 -->
+<!ENTITY ograve "&#242;"> <!-- latin small letter o with grave,
+ U+00F2 ISOlat1 -->
+<!ENTITY oacute "&#243;"> <!-- latin small letter o with acute,
+ U+00F3 ISOlat1 -->
+<!ENTITY ocirc "&#244;"> <!-- latin small letter o with circumflex,
+ U+00F4 ISOlat1 -->
+<!ENTITY otilde "&#245;"> <!-- latin small letter o with tilde,
+ U+00F5 ISOlat1 -->
+<!ENTITY ouml "&#246;"> <!-- latin small letter o with diaeresis,
+ U+00F6 ISOlat1 -->
+<!ENTITY divide "&#247;"> <!-- division sign, U+00F7 ISOnum -->
+<!ENTITY oslash "&#248;"> <!-- latin small letter o with stroke,
+ = latin small letter o slash,
+ U+00F8 ISOlat1 -->
+<!ENTITY ugrave "&#249;"> <!-- latin small letter u with grave,
+ U+00F9 ISOlat1 -->
+<!ENTITY uacute "&#250;"> <!-- latin small letter u with acute,
+ U+00FA ISOlat1 -->
+<!ENTITY ucirc "&#251;"> <!-- latin small letter u with circumflex,
+ U+00FB ISOlat1 -->
+<!ENTITY uuml "&#252;"> <!-- latin small letter u with diaeresis,
+ U+00FC ISOlat1 -->
+<!ENTITY yacute "&#253;"> <!-- latin small letter y with acute,
+ U+00FD ISOlat1 -->
+<!ENTITY thorn "&#254;"> <!-- latin small letter thorn with,
+ U+00FE ISOlat1 -->
+<!ENTITY yuml "&#255;"> <!-- latin small letter y with diaeresis,
+ U+00FF ISOlat1 -->
diff --git a/test/valid/dtds/xhtml-special.ent b/test/valid/dtds/xhtml-special.ent
new file mode 100644
index 0000000..cf709d1
--- /dev/null
+++ b/test/valid/dtds/xhtml-special.ent
@@ -0,0 +1,79 @@
+<!-- Special characters for HTML -->
+
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
+ %HTMLspecial;
+-->
+
+<!-- Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+ New names (i.e., not in ISO 8879 list) do not clash with any
+ existing ISO 8879 entity names. ISO 10646 character numbers
+ are given for each character, in hex. values are decimal
+ conversions of the ISO 10646 values and refer to the document
+ character set. Names are Unicode names.
+-->
+
+<!-- C0 Controls and Basic Latin -->
+<!ENTITY quot "&#34;"> <!-- quotation mark = APL quote,
+ U+0022 ISOnum -->
+<!ENTITY amp "&#38;#38;"> <!-- ampersand, U+0026 ISOnum -->
+<!ENTITY lt "&#38;#60;"> <!-- less-than sign, U+003C ISOnum -->
+<!ENTITY gt "&#62;"> <!-- greater-than sign, U+003E ISOnum -->
+<!ENTITY apos "&#39;"> <!-- apostrophe mark, U+0027 ISOnum -->
+
+<!-- Latin Extended-A -->
+<!ENTITY OElig "&#338;"> <!-- latin capital ligature OE,
+ U+0152 ISOlat2 -->
+<!ENTITY oelig "&#339;"> <!-- latin small ligature oe, U+0153 ISOlat2 -->
+<!-- ligature is a misnomer, this is a separate character in some languages -->
+<!ENTITY Scaron "&#352;"> <!-- latin capital letter S with caron,
+ U+0160 ISOlat2 -->
+<!ENTITY scaron "&#353;"> <!-- latin small letter s with caron,
+ U+0161 ISOlat2 -->
+<!ENTITY Yuml "&#376;"> <!-- latin capital letter Y with diaeresis,
+ U+0178 ISOlat2 -->
+
+<!-- Spacing Modifier Letters -->
+<!ENTITY circ "&#710;"> <!-- modifier letter circumflex accent,
+ U+02C6 ISOpub -->
+<!ENTITY tilde "&#732;"> <!-- small tilde, U+02DC ISOdia -->
+
+<!-- General Punctuation -->
+<!ENTITY ensp "&#8194;"> <!-- en space, U+2002 ISOpub -->
+<!ENTITY emsp "&#8195;"> <!-- em space, U+2003 ISOpub -->
+<!ENTITY thinsp "&#8201;"> <!-- thin space, U+2009 ISOpub -->
+<!ENTITY zwnj "&#8204;"> <!-- zero width non-joiner,
+ U+200C NEW RFC 2070 -->
+<!ENTITY zwj "&#8205;"> <!-- zero width joiner, U+200D NEW RFC 2070 -->
+<!ENTITY lrm "&#8206;"> <!-- left-to-right mark, U+200E NEW RFC 2070 -->
+<!ENTITY rlm "&#8207;"> <!-- right-to-left mark, U+200F NEW RFC 2070 -->
+<!ENTITY ndash "&#8211;"> <!-- en dash, U+2013 ISOpub -->
+<!ENTITY mdash "&#8212;"> <!-- em dash, U+2014 ISOpub -->
+<!ENTITY lsquo "&#8216;"> <!-- left single quotation mark,
+ U+2018 ISOnum -->
+<!ENTITY rsquo "&#8217;"> <!-- right single quotation mark,
+ U+2019 ISOnum -->
+<!ENTITY sbquo "&#8218;"> <!-- single low-9 quotation mark, U+201A NEW -->
+<!ENTITY ldquo "&#8220;"> <!-- left double quotation mark,
+ U+201C ISOnum -->
+<!ENTITY rdquo "&#8221;"> <!-- right double quotation mark,
+ U+201D ISOnum -->
+<!ENTITY bdquo "&#8222;"> <!-- double low-9 quotation mark, U+201E NEW -->
+<!ENTITY dagger "&#8224;"> <!-- dagger, U+2020 ISOpub -->
+<!ENTITY Dagger "&#8225;"> <!-- double dagger, U+2021 ISOpub -->
+<!ENTITY permil "&#8240;"> <!-- per mille sign, U+2030 ISOtech -->
+<!ENTITY lsaquo "&#8249;"> <!-- single left-pointing angle quotation mark,
+ U+2039 ISO proposed -->
+<!-- lsaquo is proposed but not yet ISO standardized -->
+<!ENTITY rsaquo "&#8250;"> <!-- single right-pointing angle quotation mark,
+ U+203A ISO proposed -->
+<!-- rsaquo is proposed but not yet ISO standardized -->
+<!ENTITY euro "&#8364;"> <!-- euro sign, U+20AC NEW -->
diff --git a/test/valid/dtds/xhtml-symbol.ent b/test/valid/dtds/xhtml-symbol.ent
new file mode 100644
index 0000000..16f876b
--- /dev/null
+++ b/test/valid/dtds/xhtml-symbol.ent
@@ -0,0 +1,242 @@
+<!-- Mathematical, Greek and Symbolic characters for HTML -->
+
+<!-- Character entity set. Typical invocation:
+ <!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
+ %HTMLsymbol;
+-->
+
+<!-- Portions (C) International Organization for Standardization 1986:
+ Permission to copy in any form is granted for use with
+ conforming SGML systems and applications as defined in
+ ISO 8879, provided this notice is included in all copies.
+-->
+
+<!-- Relevant ISO entity set is given unless names are newly introduced.
+ New names (i.e., not in ISO 8879 list) do not clash with any
+ existing ISO 8879 entity names. ISO 10646 character numbers
+ are given for each character, in hex. values are decimal
+ conversions of the ISO 10646 values and refer to the document
+ character set. Names are Unicode names.
+-->
+
+<!-- Latin Extended-B -->
+<!ENTITY fnof "&#402;"> <!-- latin small f with hook = function
+ = florin, U+0192 ISOtech -->
+
+<!-- Greek -->
+<!ENTITY Alpha "&#913;"> <!-- greek capital letter alpha, U+0391 -->
+<!ENTITY Beta "&#914;"> <!-- greek capital letter beta, U+0392 -->
+<!ENTITY Gamma "&#915;"> <!-- greek capital letter gamma,
+ U+0393 ISOgrk3 -->
+<!ENTITY Delta "&#916;"> <!-- greek capital letter delta,
+ U+0394 ISOgrk3 -->
+<!ENTITY Epsilon "&#917;"> <!-- greek capital letter epsilon, U+0395 -->
+<!ENTITY Zeta "&#918;"> <!-- greek capital letter zeta, U+0396 -->
+<!ENTITY Eta "&#919;"> <!-- greek capital letter eta, U+0397 -->
+<!ENTITY Theta "&#920;"> <!-- greek capital letter theta,
+ U+0398 ISOgrk3 -->
+<!ENTITY Iota "&#921;"> <!-- greek capital letter iota, U+0399 -->
+<!ENTITY Kappa "&#922;"> <!-- greek capital letter kappa, U+039A -->
+<!ENTITY Lambda "&#923;"> <!-- greek capital letter lambda,
+ U+039B ISOgrk3 -->
+<!ENTITY Mu "&#924;"> <!-- greek capital letter mu, U+039C -->
+<!ENTITY Nu "&#925;"> <!-- greek capital letter nu, U+039D -->
+<!ENTITY Xi "&#926;"> <!-- greek capital letter xi, U+039E ISOgrk3 -->
+<!ENTITY Omicron "&#927;"> <!-- greek capital letter omicron, U+039F -->
+<!ENTITY Pi "&#928;"> <!-- greek capital letter pi, U+03A0 ISOgrk3 -->
+<!ENTITY Rho "&#929;"> <!-- greek capital letter rho, U+03A1 -->
+<!-- there is no Sigmaf, and no U+03A2 character either -->
+<!ENTITY Sigma "&#931;"> <!-- greek capital letter sigma,
+ U+03A3 ISOgrk3 -->
+<!ENTITY Tau "&#932;"> <!-- greek capital letter tau, U+03A4 -->
+<!ENTITY Upsilon "&#933;"> <!-- greek capital letter upsilon,
+ U+03A5 ISOgrk3 -->
+<!ENTITY Phi "&#934;"> <!-- greek capital letter phi,
+ U+03A6 ISOgrk3 -->
+<!ENTITY Chi "&#935;"> <!-- greek capital letter chi, U+03A7 -->
+<!ENTITY Psi "&#936;"> <!-- greek capital letter psi,
+ U+03A8 ISOgrk3 -->
+<!ENTITY Omega "&#937;"> <!-- greek capital letter omega,
+ U+03A9 ISOgrk3 -->
+
+<!ENTITY alpha "&#945;"> <!-- greek small letter alpha,
+ U+03B1 ISOgrk3 -->
+<!ENTITY beta "&#946;"> <!-- greek small letter beta, U+03B2 ISOgrk3 -->
+<!ENTITY gamma "&#947;"> <!-- greek small letter gamma,
+ U+03B3 ISOgrk3 -->
+<!ENTITY delta "&#948;"> <!-- greek small letter delta,
+ U+03B4 ISOgrk3 -->
+<!ENTITY epsilon "&#949;"> <!-- greek small letter epsilon,
+ U+03B5 ISOgrk3 -->
+<!ENTITY zeta "&#950;"> <!-- greek small letter zeta, U+03B6 ISOgrk3 -->
+<!ENTITY eta "&#951;"> <!-- greek small letter eta, U+03B7 ISOgrk3 -->
+<!ENTITY theta "&#952;"> <!-- greek small letter theta,
+ U+03B8 ISOgrk3 -->
+<!ENTITY iota "&#953;"> <!-- greek small letter iota, U+03B9 ISOgrk3 -->
+<!ENTITY kappa "&#954;"> <!-- greek small letter kappa,
+ U+03BA ISOgrk3 -->
+<!ENTITY lambda "&#955;"> <!-- greek small letter lambda,
+ U+03BB ISOgrk3 -->
+<!ENTITY mu "&#956;"> <!-- greek small letter mu, U+03BC ISOgrk3 -->
+<!ENTITY nu "&#957;"> <!-- greek small letter nu, U+03BD ISOgrk3 -->
+<!ENTITY xi "&#958;"> <!-- greek small letter xi, U+03BE ISOgrk3 -->
+<!ENTITY omicron "&#959;"> <!-- greek small letter omicron, U+03BF NEW -->
+<!ENTITY pi "&#960;"> <!-- greek small letter pi, U+03C0 ISOgrk3 -->
+<!ENTITY rho "&#961;"> <!-- greek small letter rho, U+03C1 ISOgrk3 -->
+<!ENTITY sigmaf "&#962;"> <!-- greek small letter final sigma,
+ U+03C2 ISOgrk3 -->
+<!ENTITY sigma "&#963;"> <!-- greek small letter sigma,
+ U+03C3 ISOgrk3 -->
+<!ENTITY tau "&#964;"> <!-- greek small letter tau, U+03C4 ISOgrk3 -->
+<!ENTITY upsilon "&#965;"> <!-- greek small letter upsilon,
+ U+03C5 ISOgrk3 -->
+<!ENTITY phi "&#966;"> <!-- greek small letter phi, U+03C6 ISOgrk3 -->
+<!ENTITY chi "&#967;"> <!-- greek small letter chi, U+03C7 ISOgrk3 -->
+<!ENTITY psi "&#968;"> <!-- greek small letter psi, U+03C8 ISOgrk3 -->
+<!ENTITY omega "&#969;"> <!-- greek small letter omega,
+ U+03C9 ISOgrk3 -->
+<!ENTITY thetasym "&#977;"> <!-- greek small letter theta symbol,
+ U+03D1 NEW -->
+<!ENTITY upsih "&#978;"> <!-- greek upsilon with hook symbol,
+ U+03D2 NEW -->
+<!ENTITY piv "&#982;"> <!-- greek pi symbol, U+03D6 ISOgrk3 -->
+
+<!-- General Punctuation -->
+<!ENTITY bull "&#8226;"> <!-- bullet = black small circle,
+ U+2022 ISOpub -->
+<!-- bullet is NOT the same as bullet operator, U+2219 -->
+<!ENTITY hellip "&#8230;"> <!-- horizontal ellipsis = three dot leader,
+ U+2026 ISOpub -->
+<!ENTITY prime "&#8242;"> <!-- prime = minutes = feet, U+2032 ISOtech -->
+<!ENTITY Prime "&#8243;"> <!-- double prime = seconds = inches,
+ U+2033 ISOtech -->
+<!ENTITY oline "&#8254;"> <!-- overline = spacing overscore,
+ U+203E NEW -->
+<!ENTITY frasl "&#8260;"> <!-- fraction slash, U+2044 NEW -->
+
+<!-- Letterlike Symbols -->
+<!ENTITY weierp "&#8472;"> <!-- script capital P = power set
+ = Weierstrass p, U+2118 ISOamso -->
+<!ENTITY image "&#8465;"> <!-- blackletter capital I = imaginary part,
+ U+2111 ISOamso -->
+<!ENTITY real "&#8476;"> <!-- blackletter capital R = real part symbol,
+ U+211C ISOamso -->
+<!ENTITY trade "&#8482;"> <!-- trade mark sign, U+2122 ISOnum -->
+<!ENTITY alefsym "&#8501;"> <!-- alef symbol = first transfinite cardinal,
+ U+2135 NEW -->
+<!-- alef symbol is NOT the same as hebrew letter alef,
+ U+05D0 although the same glyph could be used to depict both characters -->
+
+<!-- Arrows -->
+<!ENTITY larr "&#8592;"> <!-- leftwards arrow, U+2190 ISOnum -->
+<!ENTITY uarr "&#8593;"> <!-- upwards arrow, U+2191 ISOnum-->
+<!ENTITY rarr "&#8594;"> <!-- rightwards arrow, U+2192 ISOnum -->
+<!ENTITY darr "&#8595;"> <!-- downwards arrow, U+2193 ISOnum -->
+<!ENTITY harr "&#8596;"> <!-- left right arrow, U+2194 ISOamsa -->
+<!ENTITY crarr "&#8629;"> <!-- downwards arrow with corner leftwards
+ = carriage return, U+21B5 NEW -->
+<!ENTITY lArr "&#8656;"> <!-- leftwards double arrow, U+21D0 ISOtech -->
+<!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
+ but also does not have any other character for that function. So ? lArr can
+ be used for 'is implied by' as ISOtech suggests -->
+<!ENTITY uArr "&#8657;"> <!-- upwards double arrow, U+21D1 ISOamsa -->
+<!ENTITY rArr "&#8658;"> <!-- rightwards double arrow,
+ U+21D2 ISOtech -->
+<!-- Unicode does not say this is the 'implies' character but does not have
+ another character with this function so ?
+ rArr can be used for 'implies' as ISOtech suggests -->
+<!ENTITY dArr "&#8659;"> <!-- downwards double arrow, U+21D3 ISOamsa -->
+<!ENTITY hArr "&#8660;"> <!-- left right double arrow,
+ U+21D4 ISOamsa -->
+
+<!-- Mathematical Operators -->
+<!ENTITY forall "&#8704;"> <!-- for all, U+2200 ISOtech -->
+<!ENTITY part "&#8706;"> <!-- partial differential, U+2202 ISOtech -->
+<!ENTITY exist "&#8707;"> <!-- there exists, U+2203 ISOtech -->
+<!ENTITY empty "&#8709;"> <!-- empty set = null set = diameter,
+ U+2205 ISOamso -->
+<!ENTITY nabla "&#8711;"> <!-- nabla = backward difference,
+ U+2207 ISOtech -->
+<!ENTITY isin "&#8712;"> <!-- element of, U+2208 ISOtech -->
+<!ENTITY notin "&#8713;"> <!-- not an element of, U+2209 ISOtech -->
+<!ENTITY ni "&#8715;"> <!-- contains as member, U+220B ISOtech -->
+<!-- should there be a more memorable name than 'ni'? -->
+<!ENTITY prod "&#8719;"> <!-- n-ary product = product sign,
+ U+220F ISOamsb -->
+<!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
+ the same glyph might be used for both -->
+<!ENTITY sum "&#8721;"> <!-- n-ary sumation, U+2211 ISOamsb -->
+<!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
+ though the same glyph might be used for both -->
+<!ENTITY minus "&#8722;"> <!-- minus sign, U+2212 ISOtech -->
+<!ENTITY lowast "&#8727;"> <!-- asterisk operator, U+2217 ISOtech -->
+<!ENTITY radic "&#8730;"> <!-- square root = radical sign,
+ U+221A ISOtech -->
+<!ENTITY prop "&#8733;"> <!-- proportional to, U+221D ISOtech -->
+<!ENTITY infin "&#8734;"> <!-- infinity, U+221E ISOtech -->
+<!ENTITY ang "&#8736;"> <!-- angle, U+2220 ISOamso -->
+<!ENTITY and "&#8743;"> <!-- logical and = wedge, U+2227 ISOtech -->
+<!ENTITY or "&#8744;"> <!-- logical or = vee, U+2228 ISOtech -->
+<!ENTITY cap "&#8745;"> <!-- intersection = cap, U+2229 ISOtech -->
+<!ENTITY cup "&#8746;"> <!-- union = cup, U+222A ISOtech -->
+<!ENTITY int "&#8747;"> <!-- integral, U+222B ISOtech -->
+<!ENTITY there4 "&#8756;"> <!-- therefore, U+2234 ISOtech -->
+<!ENTITY sim "&#8764;"> <!-- tilde operator = varies with = similar to,
+ U+223C ISOtech -->
+<!-- tilde operator is NOT the same character as the tilde, U+007E,
+ although the same glyph might be used to represent both -->
+<!ENTITY cong "&#8773;"> <!-- approximately equal to, U+2245 ISOtech -->
+<!ENTITY asymp "&#8776;"> <!-- almost equal to = asymptotic to,
+ U+2248 ISOamsr -->
+<!ENTITY ne "&#8800;"> <!-- not equal to, U+2260 ISOtech -->
+<!ENTITY equiv "&#8801;"> <!-- identical to, U+2261 ISOtech -->
+<!ENTITY le "&#8804;"> <!-- less-than or equal to, U+2264 ISOtech -->
+<!ENTITY ge "&#8805;"> <!-- greater-than or equal to,
+ U+2265 ISOtech -->
+<!ENTITY sub "&#8834;"> <!-- subset of, U+2282 ISOtech -->
+<!ENTITY sup "&#8835;"> <!-- superset of, U+2283 ISOtech -->
+<!-- note that nsup, 'not a superset of, U+2283' is not covered by the Symbol
+ font encoding and is not included. Should it be, for symmetry?
+ It is in ISOamsn -->
+<!ENTITY nsub "&#8836;"> <!-- not a subset of, U+2284 ISOamsn -->
+<!ENTITY sube "&#8838;"> <!-- subset of or equal to, U+2286 ISOtech -->
+<!ENTITY supe "&#8839;"> <!-- superset of or equal to,
+ U+2287 ISOtech -->
+<!ENTITY oplus "&#8853;"> <!-- circled plus = direct sum,
+ U+2295 ISOamsb -->
+<!ENTITY otimes "&#8855;"> <!-- circled times = vector product,
+ U+2297 ISOamsb -->
+<!ENTITY perp "&#8869;"> <!-- up tack = orthogonal to = perpendicular,
+ U+22A5 ISOtech -->
+<!ENTITY sdot "&#8901;"> <!-- dot operator, U+22C5 ISOamsb -->
+<!-- dot operator is NOT the same character as U+00B7 middle dot -->
+
+<!-- Miscellaneous Technical -->
+<!ENTITY lceil "&#8968;"> <!-- left ceiling = apl upstile,
+ U+2308 ISOamsc -->
+<!ENTITY rceil "&#8969;"> <!-- right ceiling, U+2309 ISOamsc -->
+<!ENTITY lfloor "&#8970;"> <!-- left floor = apl downstile,
+ U+230A ISOamsc -->
+<!ENTITY rfloor "&#8971;"> <!-- right floor, U+230B ISOamsc -->
+<!ENTITY lang "&#9001;"> <!-- left-pointing angle bracket = bra,
+ U+2329 ISOtech -->
+<!-- lang is NOT the same character as U+003C 'less than'
+ or U+2039 'single left-pointing angle quotation mark' -->
+<!ENTITY rang "&#9002;"> <!-- right-pointing angle bracket = ket,
+ U+232A ISOtech -->
+<!-- rang is NOT the same character as U+003E 'greater than'
+ or U+203A 'single right-pointing angle quotation mark' -->
+
+<!-- Geometric Shapes -->
+<!ENTITY loz "&#9674;"> <!-- lozenge, U+25CA ISOpub -->
+
+<!-- Miscellaneous Symbols -->
+<!ENTITY spades "&#9824;"> <!-- black spade suit, U+2660 ISOpub -->
+<!-- black here seems to mean filled as opposed to hollow -->
+<!ENTITY clubs "&#9827;"> <!-- black club suit = shamrock,
+ U+2663 ISOpub -->
+<!ENTITY hearts "&#9829;"> <!-- black heart suit = valentine,
+ U+2665 ISOpub -->
+<!ENTITY diams "&#9830;"> <!-- black diamond suit, U+2666 ISOpub -->
diff --git a/test/valid/dtds/xhtml.cat b/test/valid/dtds/xhtml.cat
new file mode 100644
index 0000000..0624dea
--- /dev/null
+++ b/test/valid/dtds/xhtml.cat
@@ -0,0 +1,14 @@
+OVERRIDE YES
+ -- Oasis entity catalog for Extensible HTML 1.0 --
+
+PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "xhtml1-strict.dtd"
+PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd"
+PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "xhtml1-frameset.dtd"
+
+ -- ISO latin 1 entity set for Extensible HTML (XML 1.0 format) --
+
+PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "xhtml-lat1.ent"
+PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN" "xhtml-symbol.ent"
+PUBLIC "-//W3C//ENTITIES Special for XHTML//EN" "xhtml-special.ent"
+
+SGMLDECL "xhtml1.dcl"
diff --git a/test/valid/dtds/xhtml1-frameset.dtd b/test/valid/dtds/xhtml1-frameset.dtd
new file mode 100644
index 0000000..1dd44e5
--- /dev/null
+++ b/test/valid/dtds/xhtml1-frameset.dtd
@@ -0,0 +1,1223 @@
+<!--
+ Extensible HTML version 1.0 Frameset DTD
+
+ This is the same as HTML 4.0 Frameset except for
+ changes due to the differences between XML and SGML.
+
+ Namespace = http://www.w3.org/1999/xhtml
+
+ For further information, see: http://www.w3.org/TR/xhtml1
+
+ Copyright (c) 1998-1999 W3C (MIT, INRIA, Keio),
+ All Rights Reserved.
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"
+
+
+-->
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
+%HTMLspecial;
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA">
+ <!-- media type, as per [RFC2045] -->
+
+<!ENTITY % ContentTypes "CDATA">
+ <!-- comma-separated list of media types, as per [RFC2045] -->
+
+<!ENTITY % Charset "CDATA">
+ <!-- a character encoding, as per [RFC2045] -->
+
+<!ENTITY % Charsets "CDATA">
+ <!-- a space separated list of character encodings, as per [RFC2045] -->
+
+<!ENTITY % LanguageCode "NMTOKEN">
+ <!-- a language code, as per [RFC1766] -->
+
+<!ENTITY % Character "CDATA">
+ <!-- a single character from [ISO10646] -->
+
+<!ENTITY % Number "CDATA">
+ <!-- one or more digits -->
+
+<!ENTITY % LinkTypes "CDATA">
+ <!-- space-separated list of link types -->
+
+<!ENTITY % MediaDesc "CDATA">
+ <!-- single or comma-separated list of media descriptors -->
+
+<!ENTITY % URI "CDATA">
+ <!-- a Uniform Resource Identifier, see [RFC2396] -->
+
+<!ENTITY % UriList "CDATA">
+ <!-- a space separated list of Uniform Resource Identifiers -->
+
+<!ENTITY % Datetime "CDATA">
+ <!-- date and time information. ISO date format -->
+
+<!ENTITY % Script "CDATA">
+ <!-- script expression -->
+
+<!ENTITY % StyleSheet "CDATA">
+ <!-- style sheet data -->
+
+<!ENTITY % Text "CDATA">
+ <!-- used for titles etc. -->
+
+<!ENTITY % FrameTarget "NMTOKEN">
+ <!-- render in this frame -->
+
+<!ENTITY % Length "CDATA">
+ <!-- nn for pixels or nn% for percentage length -->
+
+<!ENTITY % MultiLength "CDATA">
+ <!-- pixel, percentage, or relative -->
+
+<!ENTITY % MultiLengths "CDATA">
+ <!-- comma-separated list of MultiLength -->
+
+<!ENTITY % Pixels "CDATA">
+ <!-- integer representing length in pixels -->
+
+<!-- these are used for image maps -->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+
+<!ENTITY % Coords "CDATA">
+ <!-- comma separated list of lengths -->
+
+<!-- used for object, applet, img, input and iframe -->
+<!ENTITY % ImgAlign "(top|middle|bottom|left|right)">
+
+<!-- a color using sRGB: #RRGGBB as Hex values -->
+<!ENTITY % Color "CDATA">
+
+<!-- There are also 16 widely known color names with their sRGB values:
+
+ Black = #000000 Green = #008000
+ Silver = #C0C0C0 Lime = #00FF00
+ Gray = #808080 Olive = #808000
+ White = #FFFFFF Yellow = #FFFF00
+ Maroon = #800000 Navy = #000080
+ Red = #FF0000 Blue = #0000FF
+ Purple = #800080 Teal = #008080
+ Fuchsia= #FF00FF Aqua = #00FFFF
+-->
+
+<!--=================== Generic Attributes ===============================-->
+
+<!-- core attributes common to most elements
+ id document-wide unique id
+ class space separated list of classes
+ style associated style info
+ title advisory title/amplification
+-->
+<!ENTITY % coreattrs
+ "id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED"
+ >
+
+<!-- internationalization attributes
+ lang language code (backwards compatible)
+ xml:lang language code (as per XML 1.0 spec)
+ dir direction for weak/neutral text
+-->
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED"
+ >
+
+<!-- attributes for common UI events
+ onclick a pointer button was clicked
+ ondblclick a pointer button was double clicked
+ onmousedown a pointer button was pressed down
+ onmouseup a pointer button was released
+ onmousemove a pointer was moved onto the element
+ onmouseout a pointer was moved away from the element
+ onkeypress a key was pressed and released
+ onkeydown a key was pressed down
+ onkeyup a key was released
+-->
+<!ENTITY % events
+ "onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED"
+ >
+
+<!-- attributes for elements that can get the focus
+ accesskey accessibility key character
+ tabindex position in tabbing order
+ onfocus the element got the focus
+ onblur the element lost the focus
+-->
+<!ENTITY % focus
+ "accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED"
+ >
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+<!-- text alignment for p, div, h1-h6. The default is
+ align="left" for ltr headings, "right" for rtl -->
+
+<!ENTITY % TextAlign "align (left|center|right) #IMPLIED">
+
+<!--=================== Text Elements ====================================-->
+
+<!ENTITY % special
+ "br | span | bdo |object | applet | img | map | iframe">
+
+<!ENTITY % fontstyle "tt | i | b | big | small | u
+ | s | strike |font | basefont">
+
+<!ENTITY % phrase "em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym">
+
+<!ENTITY % inline.forms "input | select | textarea | label | button">
+
+<!-- these can occur at block or inline level -->
+<!ENTITY % misc "ins | del | script | noscript">
+
+<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
+
+<!-- %Inline; covers inline or "text-level" elements -->
+<!ENTITY % Inline "(#PCDATA | %inline; | %misc;)*">
+
+<!--================== Block level elements ==============================-->
+
+<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
+<!ENTITY % lists "ul | ol | dl | menu | dir">
+<!ENTITY % blocktext "pre | hr | blockquote | address | center">
+
+<!ENTITY % block
+ "p | %heading; | div | %lists; | %blocktext; | isindex | fieldset | table">
+
+<!ENTITY % Block "(%block; | form | %misc;)*">
+
+<!-- %Flow; mixes Block and Inline and is used for list items etc. -->
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+
+<!--================== Content models for exclusions =====================-->
+
+<!-- a elements use %Inline; excluding a -->
+
+<!ENTITY % a.content
+ "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc;)*">
+
+<!-- pre uses %Inline excluding img, object, applet, big, small,
+ sub, sup, font, or basefont -->
+
+<!ENTITY % pre.content
+ "(#PCDATA | a | br | span | bdo | map | tt | i | b | u | s |
+ %phrase; | %inline.forms;)*">
+
+<!-- form uses %Flow; excluding form -->
+
+<!ENTITY % form.content "(#PCDATA | %block; | %inline; | %misc;)*">
+
+<!-- button uses %Flow; but excludes a, form, form controls, iframe -->
+
+<!ENTITY % button.content
+ "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | br | span | bdo | object | applet | img | map |
+ %fontstyle; | %phrase; | %misc;)*">
+
+<!--================ Document Structure ==================================-->
+
+<!-- the namespace URI designates the document profile -->
+
+<!ELEMENT html (head, frameset)>
+<!ATTLIST html
+ %i18n;
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ >
+
+<!--================ Document Head =======================================-->
+
+<!ENTITY % head.misc "(script|style|meta|link|object|isindex)*">
+
+<!-- content model is %head.misc; combined with a single
+ title and an optional base element in any order -->
+
+<!ELEMENT head (%head.misc;,
+ ((title, %head.misc;, (base, %head.misc;)?) |
+ (base, %head.misc;, (title, %head.misc;))))>
+
+<!ATTLIST head
+ %i18n;
+ profile %URI; #IMPLIED
+ >
+
+<!-- The title element is not considered part of the flow of text.
+ It should be displayed, for example as the page header or
+ window title. Exactly one title is required per document.
+ -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title %i18n;>
+
+<!-- document base URI -->
+
+<!ELEMENT base EMPTY>
+<!ATTLIST base
+ href %URI; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- generic metainformation -->
+<!ELEMENT meta EMPTY>
+<!ATTLIST meta
+ %i18n;
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ >
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the link element in document head e.g.
+ start, contents, previous, next, index, end, help
+ b) to link to a separate style sheet (rel="stylesheet")
+ c) to make a link to a script (rel="script")
+ d) by stylesheets to control how collections of
+ html nodes are rendered into printed documents
+ e) to make a link to a printable version of this document
+ e.g. a PostScript or PDF version (rel="alternate" media="print")
+-->
+
+<!ELEMENT link EMPTY>
+<!ATTLIST link
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- style info, which may include CDATA sections -->
+<!ELEMENT style (#PCDATA)>
+<!ATTLIST style
+ %i18n;
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- script statements, which may include CDATA sections -->
+<!ELEMENT script (#PCDATA)>
+<!ATTLIST script
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ language CDATA #IMPLIED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- alternate content container for non script-based rendering -->
+
+<!ELEMENT noscript %Flow;>
+<!ATTLIST noscript
+ %attrs;
+ >
+
+<!--======================= Frames =======================================-->
+
+<!-- only one noframes element permitted per document -->
+
+<!ELEMENT frameset (frameset|frame|noframes)*>
+<!ATTLIST frameset
+ %coreattrs;
+ rows %MultiLengths; #IMPLIED
+ cols %MultiLengths; #IMPLIED
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ >
+
+<!-- reserved frame names start with "_" otherwise starts with letter -->
+
+<!-- tiled window within frameset -->
+
+<!ELEMENT frame EMPTY>
+<!ATTLIST frame
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ noresize (noresize) #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ >
+
+<!-- inline subwindow -->
+
+<!ELEMENT iframe %Flow;>
+<!ATTLIST iframe
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ align %ImgAlign; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!-- alternate content container for non frame-based rendering -->
+
+<!ELEMENT noframes (body)>
+<!ATTLIST noframes
+ %attrs;
+ >
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT body %Flow;>
+<!ATTLIST body
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ background %URI; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ text %Color; #IMPLIED
+ link %Color; #IMPLIED
+ vlink %Color; #IMPLIED
+ alink %Color; #IMPLIED
+ >
+
+<!ELEMENT div %Flow;> <!-- generic language/style container -->
+<!ATTLIST div
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT p %Inline;>
+<!ATTLIST p
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from h1 (the most important)
+ to h6 (the least important).
+-->
+
+<!ELEMENT h1 %Inline;>
+<!ATTLIST h1
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h2 %Inline;>
+<!ATTLIST h2
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h3 %Inline;>
+<!ATTLIST h3
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h4 %Inline;>
+<!ATTLIST h4
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h5 %Inline;>
+<!ATTLIST h5
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h6 %Inline;>
+<!ATTLIST h6
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- Unordered list bullet styles -->
+
+<!ENTITY % ULStyle "(disc|square|circle)">
+
+<!-- Unordered list -->
+
+<!ELEMENT ul (li)+>
+<!ATTLIST ul
+ %attrs;
+ type %ULStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ >
+
+<!-- Ordered list numbering style
+
+ 1 arabic numbers 1, 2, 3, ...
+ a lower alpha a, b, c, ...
+ A upper alpha A, B, C, ...
+ i lower roman i, ii, iii, ...
+ I upper roman I, II, III, ...
+
+ The style is applied to the sequence number which by default
+ is reset to 1 for the first list item in an ordered list.
+-->
+<!ENTITY % OLStyle "CDATA">
+
+<!-- Ordered (numbered) list -->
+
+<!ELEMENT ol (li)+>
+<!ATTLIST ol
+ %attrs;
+ type %OLStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ start %Number; #IMPLIED
+ >
+
+<!-- single column list (DEPRECATED) -->
+<!ELEMENT menu (li)+>
+<!ATTLIST menu
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- multiple column list (DEPRECATED) -->
+<!ELEMENT dir (li)+>
+<!ATTLIST dir
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- LIStyle is constrained to: "(%ULStyle;|%OLStyle;)" -->
+<!ENTITY % LIStyle "CDATA">
+
+<!-- list item -->
+
+<!ELEMENT li %Flow;>
+<!ATTLIST li
+ %attrs;
+ type %LIStyle; #IMPLIED
+ value %Number; #IMPLIED
+ >
+
+<!-- definition lists - dt for term, dd for its definition -->
+
+<!ELEMENT dl (dt|dd)+>
+<!ATTLIST dl
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!ELEMENT dt %Inline;>
+<!ATTLIST dt
+ %attrs;
+ >
+
+<!ELEMENT dd %Flow;>
+<!ATTLIST dd
+ %attrs;
+ >
+
+<!--=================== Address ==========================================-->
+
+<!-- information on author -->
+
+<!ELEMENT address %Inline;>
+<!ATTLIST address
+ %attrs;
+ >
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT hr EMPTY>
+<!ATTLIST hr
+ %attrs;
+ align (left|center|right) #IMPLIED
+ noshade (noshade) #IMPLIED
+ size %Pixels; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- content is %Inline; excluding
+ "img|object|applet|big|small|sub|sup|font|basefont" -->
+
+<!ELEMENT pre %pre.content;>
+<!ATTLIST pre
+ %attrs;
+ width %Number; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT blockquote %Flow;>
+<!ATTLIST blockquote
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!--=================== Text alignment ===================================-->
+
+<!-- center content -->
+<!ELEMENT center %Flow;>
+<!ATTLIST center
+ %attrs;
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+
+<!--
+ ins/del are allowed in block and inline content, but its
+ inappropriate to include block content within an ins element
+ occurring in inline content.
+-->
+<!ELEMENT ins %Flow;>
+<!ATTLIST ins
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!ELEMENT del %Flow;>
+<!ATTLIST del
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!--================== The Anchor Element ================================-->
+
+<!-- content is %Inline; except that anchors shouldn't be nested -->
+
+<!ELEMENT a %a.content;>
+<!ATTLIST a
+ %attrs;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ accesskey %Character; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--===================== Inline Elements ================================-->
+
+<!ELEMENT span %Inline;> <!-- generic language/style container -->
+<!ATTLIST span
+ %attrs;
+ >
+
+<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
+<!ATTLIST bdo
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ >
+
+<!ELEMENT br EMPTY> <!-- forced line break -->
+<!ATTLIST br
+ %coreattrs;
+ clear (left|all|right|none) "none"
+ >
+
+<!ELEMENT em %Inline;> <!-- emphasis -->
+<!ATTLIST em %attrs;>
+
+<!ELEMENT strong %Inline;> <!-- strong emphasis -->
+<!ATTLIST strong %attrs;>
+
+<!ELEMENT dfn %Inline;> <!-- definitional -->
+<!ATTLIST dfn %attrs;>
+
+<!ELEMENT code %Inline;> <!-- program code -->
+<!ATTLIST code %attrs;>
+
+<!ELEMENT samp %Inline;> <!-- sample -->
+<!ATTLIST samp %attrs;>
+
+<!ELEMENT kbd %Inline;> <!-- something user would type -->
+<!ATTLIST kbd %attrs;>
+
+<!ELEMENT var %Inline;> <!-- variable -->
+<!ATTLIST var %attrs;>
+
+<!ELEMENT cite %Inline;> <!-- citation -->
+<!ATTLIST cite %attrs;>
+
+<!ELEMENT abbr %Inline;> <!-- abbreviation -->
+<!ATTLIST abbr %attrs;>
+
+<!ELEMENT acronym %Inline;> <!-- acronym -->
+<!ATTLIST acronym %attrs;>
+
+<!ELEMENT q %Inline;> <!-- inlined quote -->
+<!ATTLIST q
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!ELEMENT sub %Inline;> <!-- subscript -->
+<!ATTLIST sub %attrs;>
+
+<!ELEMENT sup %Inline;> <!-- superscript -->
+<!ATTLIST sup %attrs;>
+
+<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
+<!ATTLIST tt %attrs;>
+
+<!ELEMENT i %Inline;> <!-- italic font -->
+<!ATTLIST i %attrs;>
+
+<!ELEMENT b %Inline;> <!-- bold font -->
+<!ATTLIST b %attrs;>
+
+<!ELEMENT big %Inline;> <!-- bigger font -->
+<!ATTLIST big %attrs;>
+
+<!ELEMENT small %Inline;> <!-- smaller font -->
+<!ATTLIST small %attrs;>
+
+<!ELEMENT u %Inline;> <!-- underline -->
+<!ATTLIST u %attrs;>
+
+<!ELEMENT s %Inline;> <!-- strike-through -->
+<!ATTLIST s %attrs;>
+
+<!ELEMENT strike %Inline;> <!-- strike-through -->
+<!ATTLIST strike %attrs;>
+
+<!ELEMENT basefont EMPTY> <!-- base font size -->
+<!ATTLIST basefont
+ id ID #IMPLIED
+ size CDATA #REQUIRED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!ELEMENT font %Inline;> <!-- local change to font -->
+<!ATTLIST font
+ %coreattrs;
+ %i18n;
+ size CDATA #IMPLIED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!--==================== Object ======================================-->
+<!--
+ object is used to embed objects as part of HTML pages.
+ param elements should precede other content. Parameters
+ can also be expressed as attribute/value pairs on the
+ object element itself when brevity is desired.
+-->
+
+<!ELEMENT object (#PCDATA | param | %block; | form |%inline; | %misc;)*>
+<!ATTLIST object
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--
+ param is used to supply a named property value.
+ In XML it would seem natural to follow RDF and support an
+ abbreviated syntax where the param elements are replaced
+ by attribute value pairs on the object start tag.
+-->
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+ id ID #IMPLIED
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ >
+
+<!--=================== Java applet ==================================-->
+<!--
+ One of code or object attributes must be present.
+ Place param elements before other content.
+-->
+<!ELEMENT applet (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST applet
+ %coreattrs;
+ codebase %URI; #IMPLIED
+ archive CDATA #IMPLIED
+ code CDATA #IMPLIED
+ object CDATA #IMPLIED
+ alt %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ width %Length; #REQUIRED
+ height %Length; #REQUIRED
+ align %ImgAlign; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--=================== Images ===========================================-->
+
+<!--
+ To avoid accessibility problems for people who aren't
+ able to see the image, you should provide a text
+ description using the alt and longdesc attributes.
+ In addition, avoid the use of server-side image maps.
+-->
+
+<!ELEMENT img EMPTY>
+<!ATTLIST img
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ name NMTOKEN #IMPLIED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!-- usemap points to a map element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
+<!ATTLIST map
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ >
+
+<!ELEMENT area EMPTY>
+<!ATTLIST area
+ %attrs;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--================ Forms ===============================================-->
+
+<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
+
+<!ATTLIST form
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ name NMTOKEN #IMPLIED
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--
+ Each label must not contain more than ONE field
+ Label elements shouldn't be nested.
+-->
+<!ELEMENT label %Inline;>
+<!ATTLIST label
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!ENTITY % InputType
+ "(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)"
+ >
+
+<!-- the name attribute is required for all but submit & reset -->
+
+<!ELEMENT input EMPTY> <!-- form control -->
+<!ATTLIST input
+ %attrs;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ >
+
+<!ELEMENT select (optgroup|option)+> <!-- option selector -->
+<!ATTLIST select
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!ELEMENT optgroup (option)+> <!-- option group -->
+<!ATTLIST optgroup
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ >
+
+<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
+<!ATTLIST option
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ >
+
+<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
+<!ATTLIST textarea
+ %attrs;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!--
+ The fieldset element is used to group form fields.
+ Only one legend element should occur in the content
+ and if present should only be preceded by whitespace.
+-->
+<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
+<!ATTLIST fieldset
+ %attrs;
+ >
+
+<!ENTITY % LAlign "(top|bottom|left|right)">
+
+<!ELEMENT legend %Inline;> <!-- fieldset label -->
+<!ATTLIST legend
+ %attrs;
+ accesskey %Character; #IMPLIED
+ align %LAlign; #IMPLIED
+ >
+
+<!--
+ Content is %Flow; excluding a, form, form controls, iframe
+-->
+<!ELEMENT button %button.content;> <!-- push button -->
+<!ATTLIST button
+ %attrs;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!-- single-line text input control (DEPRECATED) -->
+<!ELEMENT isindex EMPTY>
+<!ATTLIST isindex
+ %coreattrs;
+ %i18n;
+ prompt %Text; #IMPLIED
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- Derived from IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The border attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The frame attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the valign attribute.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The rules attribute defines which rules to draw between cells:
+
+ If rules is absent then assume:
+ "none" if border is absent or border="0" otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents
+
+ char alignment char, e.g. char=":"
+ charoff offset for alignment char
+-->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT table
+ (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
+<!ELEMENT caption %Inline;>
+<!ELEMENT thead (tr)+>
+<!ELEMENT tfoot (tr)+>
+<!ELEMENT tbody (tr)+>
+<!ELEMENT colgroup (col)*>
+<!ELEMENT col EMPTY>
+<!ELEMENT tr (th|td)+>
+<!ELEMENT th %Flow;>
+<!ELEMENT td %Flow;>
+
+<!ATTLIST table
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ align %TAlign; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ >
+
+<!ENTITY % CAlign "(top|bottom|left|right)">
+
+<!ATTLIST caption
+ %attrs;
+ align %CAlign; #IMPLIED
+ >
+
+<!--
+colgroup groups a set of col elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST colgroup
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ col elements define the alignment properties for cells in
+ one or more columns.
+
+ The width attribute specifies the width of the columns, e.g.
+
+ width=64 width in screen pixels
+ width=0.5* relative width of 0.5
+
+ The span attribute causes the attributes of one
+ col element to apply to more than one column.
+-->
+<!ATTLIST col
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ Use thead to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ tbody sections are rendered in scrolling panel.
+
+ Use tfoot to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ tbody sections are rendered in scrolling panel.
+
+ Use multiple tbody sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST thead
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tfoot
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tbody
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tr
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ bgcolor %Color; #IMPLIED
+ >
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- th is for headers, td for data and for cells acting as both -->
+
+<!ATTLIST th
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ >
+
+<!ATTLIST td
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ >
+
diff --git a/test/valid/dtds/xhtml1-strict.dtd b/test/valid/dtds/xhtml1-strict.dtd
new file mode 100644
index 0000000..d7c3da2
--- /dev/null
+++ b/test/valid/dtds/xhtml1-strict.dtd
@@ -0,0 +1,986 @@
+<!--
+ Extensible HTML version 1.0 Strict DTD
+
+ This is the same as HTML 4.0 Strict except for
+ changes due to the differences between XML and SGML.
+
+ Namespace = http://www.w3.org/1999/xhtml
+
+ For further information, see: http://www.w3.org/TR/xhtml1
+
+ Copyright (c) 1998-1999 W3C (MIT, INRIA, Keio),
+ All Rights Reserved.
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
+
+
+-->
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "xhtml-lat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "xhtml-symbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "xhtml-special.ent">
+%HTMLspecial;
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA">
+ <!-- media type, as per [RFC2045] -->
+
+<!ENTITY % ContentTypes "CDATA">
+ <!-- comma-separated list of media types, as per [RFC2045] -->
+
+<!ENTITY % Charset "CDATA">
+ <!-- a character encoding, as per [RFC2045] -->
+
+<!ENTITY % Charsets "CDATA">
+ <!-- a space separated list of character encodings, as per [RFC2045] -->
+
+<!ENTITY % LanguageCode "NMTOKEN">
+ <!-- a language code, as per [RFC1766] -->
+
+<!ENTITY % Character "CDATA">
+ <!-- a single character from [ISO10646] -->
+
+<!ENTITY % Number "CDATA">
+ <!-- one or more digits -->
+
+<!ENTITY % LinkTypes "CDATA">
+ <!-- space-separated list of link types -->
+
+<!ENTITY % MediaDesc "CDATA">
+ <!-- single or comma-separated list of media descriptors -->
+
+<!ENTITY % URI "CDATA">
+ <!-- a Uniform Resource Identifier, see [RFC2396] -->
+
+<!ENTITY % UriList "CDATA">
+ <!-- a space separated list of Uniform Resource Identifiers -->
+
+<!ENTITY % Datetime "CDATA">
+ <!-- date and time information. ISO date format -->
+
+<!ENTITY % Script "CDATA">
+ <!-- script expression -->
+
+<!ENTITY % StyleSheet "CDATA">
+ <!-- style sheet data -->
+
+<!ENTITY % Text "CDATA">
+ <!-- used for titles etc. -->
+
+<!ENTITY % FrameTarget "NMTOKEN">
+ <!-- render in this frame -->
+
+<!ENTITY % Length "CDATA">
+ <!-- nn for pixels or nn% for percentage length -->
+
+<!ENTITY % MultiLength "CDATA">
+ <!-- pixel, percentage, or relative -->
+
+<!ENTITY % MultiLengths "CDATA">
+ <!-- comma-separated list of MultiLength -->
+
+<!ENTITY % Pixels "CDATA">
+ <!-- integer representing length in pixels -->
+
+<!-- these are used for image maps -->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+
+<!ENTITY % Coords "CDATA">
+ <!-- comma separated list of lengths -->
+
+<!--=================== Generic Attributes ===============================-->
+
+<!-- core attributes common to most elements
+ id document-wide unique id
+ class space separated list of classes
+ style associated style info
+ title advisory title/amplification
+-->
+<!ENTITY % coreattrs
+ "id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED"
+ >
+
+<!-- internationalization attributes
+ lang language code (backwards compatible)
+ xml:lang language code (as per XML 1.0 spec)
+ dir direction for weak/neutral text
+-->
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED"
+ >
+
+<!-- attributes for common UI events
+ onclick a pointer button was clicked
+ ondblclick a pointer button was double clicked
+ onmousedown a pointer button was pressed down
+ onmouseup a pointer button was released
+ onmousemove a pointer was moved onto the element
+ onmouseout a pointer was moved away from the element
+ onkeypress a key was pressed and released
+ onkeydown a key was pressed down
+ onkeyup a key was released
+-->
+<!ENTITY % events
+ "onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED"
+ >
+
+<!-- attributes for elements that can get the focus
+ accesskey accessibility key character
+ tabindex position in tabbing order
+ onfocus the element got the focus
+ onblur the element lost the focus
+-->
+<!ENTITY % focus
+ "accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED"
+ >
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+<!--=================== Text Elements ====================================-->
+
+<!ENTITY % special
+ "br | span | bdo | object | img | map">
+
+<!ENTITY % fontstyle "tt | i | b | big | small">
+
+<!ENTITY % phrase "em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym">
+
+<!ENTITY % inline.forms "input | select | textarea | label | button">
+
+<!-- these can occur at block or inline level -->
+<!ENTITY % misc "ins | del | script | noscript">
+
+<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
+
+<!-- %Inline; covers inline or "text-level" elements -->
+<!ENTITY % Inline "(#PCDATA | %inline; | %misc;)*">
+
+<!--================== Block level elements ==============================-->
+
+<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
+<!ENTITY % lists "ul | ol | dl">
+<!ENTITY % blocktext "pre | hr | blockquote | address">
+
+<!ENTITY % block
+ "p | %heading; | div | %lists; | %blocktext; | fieldset | table">
+
+<!ENTITY % Block "(%block; | form | %misc;)*">
+
+<!-- %Flow; mixes Block and Inline and is used for list items etc. -->
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+
+<!--================== Content models for exclusions =====================-->
+
+<!-- a elements use %Inline; excluding a -->
+
+<!ENTITY % a.content
+ "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc;)*">
+
+<!-- pre uses %Inline excluding img, object, big, small, sup or sup -->
+
+<!ENTITY % pre.content
+ "(#PCDATA | a | br | span | bdo | map | tt | i | b |
+ %phrase; | %inline.forms;)*">
+
+<!-- form uses %Block; excluding form -->
+
+<!ENTITY % form.content "(%block; | %misc;)*">
+
+<!-- button uses %Flow; but excludes a, form and form controls -->
+
+<!ENTITY % button.content
+ "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | %special; | %fontstyle; | %phrase; | %misc;)*">
+
+<!--================ Document Structure ==================================-->
+
+<!-- the namespace URI designates the document profile -->
+
+<!ELEMENT html (head, body)>
+<!ATTLIST html
+ %i18n;
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ >
+
+<!--================ Document Head =======================================-->
+
+<!ENTITY % head.misc "(script|style|meta|link|object)*">
+
+<!-- content model is %head.misc; combined with a single
+ title and an optional base element in any order -->
+
+<!ELEMENT head (%head.misc;,
+ ((title, %head.misc;, (base, %head.misc;)?) |
+ (base, %head.misc;, (title, %head.misc;))))>
+
+<!ATTLIST head
+ %i18n;
+ profile %URI; #IMPLIED
+ >
+
+<!-- The title element is not considered part of the flow of text.
+ It should be displayed, for example as the page header or
+ window title. Exactly one title is required per document.
+ -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title %i18n;>
+
+<!-- document base URI -->
+
+<!ELEMENT base EMPTY>
+<!ATTLIST base
+ href %URI; #IMPLIED
+ >
+
+<!-- generic metainformation -->
+<!ELEMENT meta EMPTY>
+<!ATTLIST meta
+ %i18n;
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ >
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the link element in document head e.g.
+ start, contents, previous, next, index, end, help
+ b) to link to a separate style sheet (rel="stylesheet")
+ c) to make a link to a script (rel="script")
+ d) by stylesheets to control how collections of
+ html nodes are rendered into printed documents
+ e) to make a link to a printable version of this document
+ e.g. a PostScript or PDF version (rel="alternate" media="print")
+-->
+
+<!ELEMENT link EMPTY>
+<!ATTLIST link
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ >
+
+<!-- style info, which may include CDATA sections -->
+<!ELEMENT style (#PCDATA)>
+<!ATTLIST style
+ %i18n;
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- script statements, which may include CDATA sections -->
+<!ELEMENT script (#PCDATA)>
+<!ATTLIST script
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- alternate content container for non script-based rendering -->
+
+<!ELEMENT noscript %Block;>
+<!ATTLIST noscript
+ %attrs;
+ >
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT body %Block;>
+<!ATTLIST body
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ >
+
+<!ELEMENT div %Flow;> <!-- generic language/style container -->
+<!ATTLIST div
+ %attrs;
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT p %Inline;>
+<!ATTLIST p
+ %attrs;
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from h1 (the most important)
+ to h6 (the least important).
+-->
+
+<!ELEMENT h1 %Inline;>
+<!ATTLIST h1
+ %attrs;
+ >
+
+<!ELEMENT h2 %Inline;>
+<!ATTLIST h2
+ %attrs;
+ >
+
+<!ELEMENT h3 %Inline;>
+<!ATTLIST h3
+ %attrs;
+ >
+
+<!ELEMENT h4 %Inline;>
+<!ATTLIST h4
+ %attrs;
+ >
+
+<!ELEMENT h5 %Inline;>
+<!ATTLIST h5
+ %attrs;
+ >
+
+<!ELEMENT h6 %Inline;>
+<!ATTLIST h6
+ %attrs;
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- Unordered list -->
+
+<!ELEMENT ul (li)+>
+<!ATTLIST ul
+ %attrs;
+ >
+
+<!-- Ordered (numbered) list -->
+
+<!ELEMENT ol (li)+>
+<!ATTLIST ol
+ %attrs;
+ >
+
+<!-- list item -->
+
+<!ELEMENT li %Flow;>
+<!ATTLIST li
+ %attrs;
+ >
+
+<!-- definition lists - dt for term, dd for its definition -->
+
+<!ELEMENT dl (dt|dd)+>
+<!ATTLIST dl
+ %attrs;
+ >
+
+<!ELEMENT dt %Inline;>
+<!ATTLIST dt
+ %attrs;
+ >
+
+<!ELEMENT dd %Flow;>
+<!ATTLIST dd
+ %attrs;
+ >
+
+<!--=================== Address ==========================================-->
+
+<!-- information on author -->
+
+<!ELEMENT address %Inline;>
+<!ATTLIST address
+ %attrs;
+ >
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT hr EMPTY>
+<!ATTLIST hr
+ %attrs;
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- content is %Inline; excluding "img|object|big|small|sub|sup" -->
+
+<!ELEMENT pre %pre.content;>
+<!ATTLIST pre
+ %attrs;
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT blockquote %Block;>
+<!ATTLIST blockquote
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+<!--
+ ins/del are allowed in block and inline content, but its
+ inappropriate to include block content within an ins element
+ occurring in inline content.
+-->
+<!ELEMENT ins %Flow;>
+<!ATTLIST ins
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!ELEMENT del %Flow;>
+<!ATTLIST del
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!--================== The Anchor Element ================================-->
+
+<!-- content is %Inline; except that anchors shouldn't be nested -->
+
+<!ELEMENT a %a.content;>
+<!ATTLIST a
+ %attrs;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ accesskey %Character; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!--===================== Inline Elements ================================-->
+
+<!ELEMENT span %Inline;> <!-- generic language/style container -->
+<!ATTLIST span
+ %attrs;
+ >
+
+<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
+<!ATTLIST bdo
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ >
+
+<!ELEMENT br EMPTY> <!-- forced line break -->
+<!ATTLIST br
+ %coreattrs;
+ >
+
+<!ELEMENT em %Inline;> <!-- emphasis -->
+<!ATTLIST em %attrs;>
+
+<!ELEMENT strong %Inline;> <!-- strong emphasis -->
+<!ATTLIST strong %attrs;>
+
+<!ELEMENT dfn %Inline;> <!-- definitional -->
+<!ATTLIST dfn %attrs;>
+
+<!ELEMENT code %Inline;> <!-- program code -->
+<!ATTLIST code %attrs;>
+
+<!ELEMENT samp %Inline;> <!-- sample -->
+<!ATTLIST samp %attrs;>
+
+<!ELEMENT kbd %Inline;> <!-- something user would type -->
+<!ATTLIST kbd %attrs;>
+
+<!ELEMENT var %Inline;> <!-- variable -->
+<!ATTLIST var %attrs;>
+
+<!ELEMENT cite %Inline;> <!-- citation -->
+<!ATTLIST cite %attrs;>
+
+<!ELEMENT abbr %Inline;> <!-- abbreviation -->
+<!ATTLIST abbr %attrs;>
+
+<!ELEMENT acronym %Inline;> <!-- acronym -->
+<!ATTLIST acronym %attrs;>
+
+<!ELEMENT q %Inline;> <!-- inlined quote -->
+<!ATTLIST q
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!ELEMENT sub %Inline;> <!-- subscript -->
+<!ATTLIST sub %attrs;>
+
+<!ELEMENT sup %Inline;> <!-- superscript -->
+<!ATTLIST sup %attrs;>
+
+<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
+<!ATTLIST tt %attrs;>
+
+<!ELEMENT i %Inline;> <!-- italic font -->
+<!ATTLIST i %attrs;>
+
+<!ELEMENT b %Inline;> <!-- bold font -->
+<!ATTLIST b %attrs;>
+
+<!ELEMENT big %Inline;> <!-- bigger font -->
+<!ATTLIST big %attrs;>
+
+<!ELEMENT small %Inline;> <!-- smaller font -->
+<!ATTLIST small %attrs;>
+
+<!--==================== Object ======================================-->
+<!--
+ object is used to embed objects as part of HTML pages.
+ param elements should precede other content. Parameters
+ can also be expressed as attribute/value pairs on the
+ object element itself when brevity is desired.
+-->
+
+<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST object
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ >
+
+<!--
+ param is used to supply a named property value.
+ In XML it would seem natural to follow RDF and support an
+ abbreviated syntax where the param elements are replaced
+ by attribute value pairs on the object start tag.
+-->
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+ id ID #IMPLIED
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ >
+
+<!--=================== Images ===========================================-->
+
+<!--
+ To avoid accessibility problems for people who aren't
+ able to see the image, you should provide a text
+ description using the alt and longdesc attributes.
+ In addition, avoid the use of server-side image maps.
+ Note that in this DTD there is no name attribute. That
+ is only available in the transitional and frameset DTD.
+-->
+
+<!ELEMENT img EMPTY>
+<!ATTLIST img
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ >
+
+<!-- usemap points to a map element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
+<!ATTLIST map
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ >
+
+<!ELEMENT area EMPTY>
+<!ATTLIST area
+ %attrs;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!--================ Forms ===============================================-->
+<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
+
+<!ATTLIST form
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ >
+
+<!--
+ Each label must not contain more than ONE field
+ Label elements shouldn't be nested.
+-->
+<!ELEMENT label %Inline;>
+<!ATTLIST label
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!ENTITY % InputType
+ "(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)"
+ >
+
+<!-- the name attribute is required for all but submit & reset -->
+
+<!ELEMENT input EMPTY> <!-- form control -->
+<!ATTLIST input
+ %attrs;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ >
+
+<!ELEMENT select (optgroup|option)+> <!-- option selector -->
+<!ATTLIST select
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!ELEMENT optgroup (option)+> <!-- option group -->
+<!ATTLIST optgroup
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ >
+
+<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
+<!ATTLIST option
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ >
+
+<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
+<!ATTLIST textarea
+ %attrs;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!--
+ The fieldset element is used to group form fields.
+ Only one legend element should occur in the content
+ and if present should only be preceded by whitespace.
+-->
+<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
+<!ATTLIST fieldset
+ %attrs;
+ >
+
+<!ELEMENT legend %Inline;> <!-- fieldset label -->
+<!ATTLIST legend
+ %attrs;
+ accesskey %Character; #IMPLIED
+ >
+
+<!--
+ Content is %Flow; excluding a, form and form controls
+-->
+<!ELEMENT button %button.content;> <!-- push button -->
+<!ATTLIST button
+ %attrs;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- Derived from IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The border attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The frame attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the valign attribute.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The rules attribute defines which rules to draw between cells:
+
+ If rules is absent then assume:
+ "none" if border is absent or border="0" otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents
+
+ char alignment char, e.g. char=':'
+ charoff offset for alignment char
+-->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT table
+ (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
+<!ELEMENT caption %Inline;>
+<!ELEMENT thead (tr)+>
+<!ELEMENT tfoot (tr)+>
+<!ELEMENT tbody (tr)+>
+<!ELEMENT colgroup (col)*>
+<!ELEMENT col EMPTY>
+<!ELEMENT tr (th|td)+>
+<!ELEMENT th %Flow;>
+<!ELEMENT td %Flow;>
+
+<!ATTLIST table
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ >
+
+<!ENTITY % CAlign "(top|bottom|left|right)">
+
+<!ATTLIST caption
+ %attrs;
+ >
+
+<!--
+colgroup groups a set of col elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST colgroup
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ col elements define the alignment properties for cells in
+ one or more columns.
+
+ The width attribute specifies the width of the columns, e.g.
+
+ width=64 width in screen pixels
+ width=0.5* relative width of 0.5
+
+ The span attribute causes the attributes of one
+ col element to apply to more than one column.
+-->
+<!ATTLIST col
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ Use thead to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ tbody sections are rendered in scrolling panel.
+
+ Use tfoot to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ tbody sections are rendered in scrolling panel.
+
+ Use multiple tbody sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST thead
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tfoot
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tbody
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tr
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- th is for headers, td for data and for cells acting as both -->
+
+<!ATTLIST th
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST td
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ >
+
diff --git a/test/valid/dtds/xhtml1-transitional.dtd b/test/valid/dtds/xhtml1-transitional.dtd
new file mode 100644
index 0000000..def8d66
--- /dev/null
+++ b/test/valid/dtds/xhtml1-transitional.dtd
@@ -0,0 +1,1194 @@
+<!--
+ Extensible HTML version 1.0 Transitional DTD
+
+ This is the same as HTML 4.0 Transitional except for
+ changes due to the differences between XML and SGML.
+
+ Namespace = http://www.w3.org/1999/xhtml
+
+ For further information, see: http://www.w3.org/TR/xhtml1
+
+ Copyright (c) 1998-1999 W3C (MIT, INRIA, Keio),
+ All Rights Reserved.
+
+ This DTD module is identified by the PUBLIC and SYSTEM identifiers:
+
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+
+
+-->
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special for XHTML//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
+%HTMLspecial;
+
+<!--================== Imported Names ====================================-->
+
+<!ENTITY % ContentType "CDATA">
+ <!-- media type, as per [RFC2045] -->
+
+<!ENTITY % ContentTypes "CDATA">
+ <!-- comma-separated list of media types, as per [RFC2045] -->
+
+<!ENTITY % Charset "CDATA">
+ <!-- a character encoding, as per [RFC2045] -->
+
+<!ENTITY % Charsets "CDATA">
+ <!-- a space separated list of character encodings, as per [RFC2045] -->
+
+<!ENTITY % LanguageCode "NMTOKEN">
+ <!-- a language code, as per [RFC1766] -->
+
+<!ENTITY % Character "CDATA">
+ <!-- a single character from [ISO10646] -->
+
+<!ENTITY % Number "CDATA">
+ <!-- one or more digits -->
+
+<!ENTITY % LinkTypes "CDATA">
+ <!-- space-separated list of link types -->
+
+<!ENTITY % MediaDesc "CDATA">
+ <!-- single or comma-separated list of media descriptors -->
+
+<!ENTITY % URI "CDATA">
+ <!-- a Uniform Resource Identifier, see [RFC2396] -->
+
+<!ENTITY % UriList "CDATA">
+ <!-- a space separated list of Uniform Resource Identifiers -->
+
+<!ENTITY % Datetime "CDATA">
+ <!-- date and time information. ISO date format -->
+
+<!ENTITY % Script "CDATA">
+ <!-- script expression -->
+
+<!ENTITY % StyleSheet "CDATA">
+ <!-- style sheet data -->
+
+<!ENTITY % Text "CDATA">
+ <!-- used for titles etc. -->
+
+<!ENTITY % FrameTarget "NMTOKEN">
+ <!-- render in this frame -->
+
+<!ENTITY % Length "CDATA">
+ <!-- nn for pixels or nn% for percentage length -->
+
+<!ENTITY % MultiLength "CDATA">
+ <!-- pixel, percentage, or relative -->
+
+<!ENTITY % MultiLengths "CDATA">
+ <!-- comma-separated list of MultiLength -->
+
+<!ENTITY % Pixels "CDATA">
+ <!-- integer representing length in pixels -->
+
+<!-- these are used for image maps -->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+
+<!ENTITY % Coords "CDATA">
+ <!-- comma separated list of lengths -->
+
+<!-- used for object, applet, img, input and iframe -->
+<!ENTITY % ImgAlign "(top|middle|bottom|left|right)">
+
+<!-- a color using sRGB: #RRGGBB as Hex values -->
+<!ENTITY % Color "CDATA">
+
+<!-- There are also 16 widely known color names with their sRGB values:
+
+ Black = #000000 Green = #008000
+ Silver = #C0C0C0 Lime = #00FF00
+ Gray = #808080 Olive = #808000
+ White = #FFFFFF Yellow = #FFFF00
+ Maroon = #800000 Navy = #000080
+ Red = #FF0000 Blue = #0000FF
+ Purple = #800080 Teal = #008080
+ Fuchsia= #FF00FF Aqua = #00FFFF
+-->
+
+<!--=================== Generic Attributes ===============================-->
+
+<!-- core attributes common to most elements
+ id document-wide unique id
+ class space separated list of classes
+ style associated style info
+ title advisory title/amplification
+-->
+<!ENTITY % coreattrs
+ "id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED"
+ >
+
+<!-- internationalization attributes
+ lang language code (backwards compatible)
+ xml:lang language code (as per XML 1.0 spec)
+ dir direction for weak/neutral text
+-->
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED"
+ >
+
+<!-- attributes for common UI events
+ onclick a pointer button was clicked
+ ondblclick a pointer button was double clicked
+ onmousedown a pointer button was pressed down
+ onmouseup a pointer button was released
+ onmousemove a pointer was moved onto the element
+ onmouseout a pointer was moved away from the element
+ onkeypress a key was pressed and released
+ onkeydown a key was pressed down
+ onkeyup a key was released
+-->
+<!ENTITY % events
+ "onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED"
+ >
+
+<!-- attributes for elements that can get the focus
+ accesskey accessibility key character
+ tabindex position in tabbing order
+ onfocus the element got the focus
+ onblur the element lost the focus
+-->
+<!ENTITY % focus
+ "accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED"
+ >
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+<!-- text alignment for p, div, h1-h6. The default is
+ align="left" for ltr headings, "right" for rtl -->
+
+<!ENTITY % TextAlign "align (left|center|right) #IMPLIED">
+
+<!--=================== Text Elements ====================================-->
+
+<!ENTITY % special
+ "br | span | bdo | object | applet | img | map | iframe">
+
+<!ENTITY % fontstyle "tt | i | b | big | small | u
+ | s | strike |font | basefont">
+
+<!ENTITY % phrase "em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym">
+
+<!ENTITY % inline.forms "input | select | textarea | label | button">
+
+<!-- these can occur at block or inline level -->
+<!ENTITY % misc "ins | del | script | noscript">
+
+<!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
+
+<!-- %Inline; covers inline or "text-level" elements -->
+<!ENTITY % Inline "(#PCDATA | %inline; | %misc;)*">
+
+<!--================== Block level elements ==============================-->
+
+<!ENTITY % heading "h1|h2|h3|h4|h5|h6">
+<!ENTITY % lists "ul | ol | dl | menu | dir">
+<!ENTITY % blocktext "pre | hr | blockquote | address | center | noframes">
+
+<!ENTITY % block
+ "p | %heading; | div | %lists; | %blocktext; | isindex |fieldset | table">
+
+<!ENTITY % Block "(%block; | form | %misc;)*">
+
+<!-- %Flow; mixes Block and Inline and is used for list items etc. -->
+<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
+
+<!--================== Content models for exclusions =====================-->
+
+<!-- a elements use %Inline; excluding a -->
+
+<!ENTITY % a.content
+ "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc;)*">
+
+<!-- pre uses %Inline excluding img, object, applet, big, small,
+ sub, sup, font, or basefont -->
+
+<!ENTITY % pre.content
+ "(#PCDATA | a | br | span | bdo | map | tt | i | b | u | s |
+ %phrase; | %inline.forms;)*">
+
+<!-- form uses %Flow; excluding form -->
+
+<!ENTITY % form.content "(#PCDATA | %block; | %inline; | %misc;)*">
+
+<!-- button uses %Flow; but excludes a, form, form controls, iframe -->
+
+<!ENTITY % button.content
+ "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | br | span | bdo | object | applet | img | map |
+ %fontstyle; | %phrase; | %misc;)*">
+
+<!--================ Document Structure ==================================-->
+
+<!-- the namespace URI designates the document profile -->
+
+<!ELEMENT html (head, body)>
+<!ATTLIST html
+ %i18n;
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ >
+
+<!--================ Document Head =======================================-->
+
+<!ENTITY % head.misc "(script|style|meta|link|object|isindex)*">
+
+<!-- content model is %head.misc; combined with a single
+ title and an optional base element in any order -->
+
+<!ELEMENT head (%head.misc;,
+ ((title, %head.misc;, (base, %head.misc;)?) |
+ (base, %head.misc;, (title, %head.misc;))))>
+
+<!ATTLIST head
+ %i18n;
+ profile %URI; #IMPLIED
+ >
+
+<!-- The title element is not considered part of the flow of text.
+ It should be displayed, for example as the page header or
+ window title. Exactly one title is required per document.
+ -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title %i18n;>
+
+<!-- document base URI -->
+
+<!ELEMENT base EMPTY>
+<!ATTLIST base
+ href %URI; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- generic metainformation -->
+<!ELEMENT meta EMPTY>
+<!ATTLIST meta
+ %i18n;
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ >
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the link element in document head e.g.
+ start, contents, previous, next, index, end, help
+ b) to link to a separate style sheet (rel="stylesheet")
+ c) to make a link to a script (rel="script")
+ d) by stylesheets to control how collections of
+ html nodes are rendered into printed documents
+ e) to make a link to a printable version of this document
+ e.g. a PostScript or PDF version (rel="alternate" media="print")
+-->
+
+<!ELEMENT link EMPTY>
+<!ATTLIST link
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!-- style info, which may include CDATA sections -->
+<!ELEMENT style (#PCDATA)>
+<!ATTLIST style
+ %i18n;
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- script statements, which may include CDATA sections -->
+<!ELEMENT script (#PCDATA)>
+<!ATTLIST script
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ language CDATA #IMPLIED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!-- alternate content container for non script-based rendering -->
+
+<!ELEMENT noscript %Flow;>
+<!ATTLIST noscript
+ %attrs;
+ >
+
+<!--======================= Frames =======================================-->
+
+<!-- inline subwindow -->
+
+<!ELEMENT iframe %Flow;>
+<!ATTLIST iframe
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ align %ImgAlign; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!-- alternate content container for non frame-based rendering -->
+
+<!ELEMENT noframes %Flow;>
+<!ATTLIST noframes
+ %attrs;
+ >
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT body %Flow;>
+<!ATTLIST body
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ background %URI; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ text %Color; #IMPLIED
+ link %Color; #IMPLIED
+ vlink %Color; #IMPLIED
+ alink %Color; #IMPLIED
+ >
+
+<!ELEMENT div %Flow;> <!-- generic language/style container -->
+<!ATTLIST div
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT p %Inline;>
+<!ATTLIST p
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from h1 (the most important)
+ to h6 (the least important).
+-->
+
+<!ELEMENT h1 %Inline;>
+<!ATTLIST h1
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h2 %Inline;>
+<!ATTLIST h2
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h3 %Inline;>
+<!ATTLIST h3
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h4 %Inline;>
+<!ATTLIST h4
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h5 %Inline;>
+<!ATTLIST h5
+ %attrs;
+ %TextAlign;
+ >
+
+<!ELEMENT h6 %Inline;>
+<!ATTLIST h6
+ %attrs;
+ %TextAlign;
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- Unordered list bullet styles -->
+
+<!ENTITY % ULStyle "(disc|square|circle)">
+
+<!-- Unordered list -->
+
+<!ELEMENT ul (li)+>
+<!ATTLIST ul
+ %attrs;
+ type %ULStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ >
+
+<!-- Ordered list numbering style
+
+ 1 arabic numbers 1, 2, 3, ...
+ a lower alpha a, b, c, ...
+ A upper alpha A, B, C, ...
+ i lower roman i, ii, iii, ...
+ I upper roman I, II, III, ...
+
+ The style is applied to the sequence number which by default
+ is reset to 1 for the first list item in an ordered list.
+-->
+<!ENTITY % OLStyle "CDATA">
+
+<!-- Ordered (numbered) list -->
+
+<!ELEMENT ol (li)+>
+<!ATTLIST ol
+ %attrs;
+ type %OLStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ start %Number; #IMPLIED
+ >
+
+<!-- single column list (DEPRECATED) -->
+<!ELEMENT menu (li)+>
+<!ATTLIST menu
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- multiple column list (DEPRECATED) -->
+<!ELEMENT dir (li)+>
+<!ATTLIST dir
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!-- LIStyle is constrained to: "(%ULStyle;|%OLStyle;)" -->
+<!ENTITY % LIStyle "CDATA">
+
+<!-- list item -->
+
+<!ELEMENT li %Flow;>
+<!ATTLIST li
+ %attrs;
+ type %LIStyle; #IMPLIED
+ value %Number; #IMPLIED
+ >
+
+<!-- definition lists - dt for term, dd for its definition -->
+
+<!ELEMENT dl (dt|dd)+>
+<!ATTLIST dl
+ %attrs;
+ compact (compact) #IMPLIED
+ >
+
+<!ELEMENT dt %Inline;>
+<!ATTLIST dt
+ %attrs;
+ >
+
+<!ELEMENT dd %Flow;>
+<!ATTLIST dd
+ %attrs;
+ >
+
+<!--=================== Address ==========================================-->
+
+<!-- information on author -->
+
+<!ELEMENT address %Inline;>
+<!ATTLIST address
+ %attrs;
+ >
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT hr EMPTY>
+<!ATTLIST hr
+ %attrs;
+ align (left|center|right) #IMPLIED
+ noshade (noshade) #IMPLIED
+ size %Pixels; #IMPLIED
+ width %Length; #IMPLIED
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- content is %Inline; excluding
+ "img|object|applet|big|small|sub|sup|font|basefont" -->
+
+<!ELEMENT pre %pre.content;>
+<!ATTLIST pre
+ %attrs;
+ width %Number; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT blockquote %Flow;>
+<!ATTLIST blockquote
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!--=================== Text alignment ===================================-->
+
+<!-- center content -->
+<!ELEMENT center %Flow;>
+<!ATTLIST center
+ %attrs;
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+<!--
+ ins/del are allowed in block and inline content, but its
+ inappropriate to include block content within an ins element
+ occurring in inline content.
+-->
+<!ELEMENT ins %Flow;>
+<!ATTLIST ins
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!ELEMENT del %Flow;>
+<!ATTLIST del
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ >
+
+<!--================== The Anchor Element ================================-->
+
+<!-- content is %Inline; except that anchors shouldn't be nested -->
+
+<!ELEMENT a %a.content;>
+<!ATTLIST a
+ %attrs;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ accesskey %Character; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--===================== Inline Elements ================================-->
+
+<!ELEMENT span %Inline;> <!-- generic language/style container -->
+<!ATTLIST span
+ %attrs;
+ >
+
+<!ELEMENT bdo %Inline;> <!-- I18N BiDi over-ride -->
+<!ATTLIST bdo
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ >
+
+<!ELEMENT br EMPTY> <!-- forced line break -->
+<!ATTLIST br
+ %coreattrs;
+ clear (left|all|right|none) "none"
+ >
+
+<!ELEMENT em %Inline;> <!-- emphasis -->
+<!ATTLIST em %attrs;>
+
+<!ELEMENT strong %Inline;> <!-- strong emphasis -->
+<!ATTLIST strong %attrs;>
+
+<!ELEMENT dfn %Inline;> <!-- definitional -->
+<!ATTLIST dfn %attrs;>
+
+<!ELEMENT code %Inline;> <!-- program code -->
+<!ATTLIST code %attrs;>
+
+<!ELEMENT samp %Inline;> <!-- sample -->
+<!ATTLIST samp %attrs;>
+
+<!ELEMENT kbd %Inline;> <!-- something user would type -->
+<!ATTLIST kbd %attrs;>
+
+<!ELEMENT var %Inline;> <!-- variable -->
+<!ATTLIST var %attrs;>
+
+<!ELEMENT cite %Inline;> <!-- citation -->
+<!ATTLIST cite %attrs;>
+
+<!ELEMENT abbr %Inline;> <!-- abbreviation -->
+<!ATTLIST abbr %attrs;>
+
+<!ELEMENT acronym %Inline;> <!-- acronym -->
+<!ATTLIST acronym %attrs;>
+
+<!ELEMENT q %Inline;> <!-- inlined quote -->
+<!ATTLIST q
+ %attrs;
+ cite %URI; #IMPLIED
+ >
+
+<!ELEMENT sub %Inline;> <!-- subscript -->
+<!ATTLIST sub %attrs;>
+
+<!ELEMENT sup %Inline;> <!-- superscript -->
+<!ATTLIST sup %attrs;>
+
+<!ELEMENT tt %Inline;> <!-- fixed pitch font -->
+<!ATTLIST tt %attrs;>
+
+<!ELEMENT i %Inline;> <!-- italic font -->
+<!ATTLIST i %attrs;>
+
+<!ELEMENT b %Inline;> <!-- bold font -->
+<!ATTLIST b %attrs;>
+
+<!ELEMENT big %Inline;> <!-- bigger font -->
+<!ATTLIST big %attrs;>
+
+<!ELEMENT small %Inline;> <!-- smaller font -->
+<!ATTLIST small %attrs;>
+
+<!ELEMENT u %Inline;> <!-- underline -->
+<!ATTLIST u %attrs;>
+
+<!ELEMENT s %Inline;> <!-- strike-through -->
+<!ATTLIST s %attrs;>
+
+<!ELEMENT strike %Inline;> <!-- strike-through -->
+<!ATTLIST strike %attrs;>
+
+<!ELEMENT basefont EMPTY> <!-- base font size -->
+<!ATTLIST basefont
+ id ID #IMPLIED
+ size CDATA #REQUIRED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!ELEMENT font %Inline;> <!-- local change to font -->
+<!ATTLIST font
+ %coreattrs;
+ %i18n;
+ size CDATA #IMPLIED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ >
+
+<!--==================== Object ======================================-->
+<!--
+ object is used to embed objects as part of HTML pages.
+ param elements should precede other content. Parameters
+ can also be expressed as attribute/value pairs on the
+ object element itself when brevity is desired.
+-->
+
+<!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST object
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--
+ param is used to supply a named property value.
+ In XML it would seem natural to follow RDF and support an
+ abbreviated syntax where the param elements are replaced
+ by attribute value pairs on the object start tag.
+-->
+<!ELEMENT param EMPTY>
+<!ATTLIST param
+ id ID #IMPLIED
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ >
+
+<!--=================== Java applet ==================================-->
+<!--
+ One of code or object attributes must be present.
+ Place param elements before other content.
+-->
+<!ELEMENT applet (#PCDATA | param | %block; | form | %inline; | %misc;)*>
+<!ATTLIST applet
+ %coreattrs;
+ codebase %URI; #IMPLIED
+ archive CDATA #IMPLIED
+ code CDATA #IMPLIED
+ object CDATA #IMPLIED
+ alt %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ width %Length; #REQUIRED
+ height %Length; #REQUIRED
+ align %ImgAlign; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!--=================== Images ===========================================-->
+
+<!--
+ To avoid accessibility problems for people who aren't
+ able to see the image, you should provide a text
+ description using the alt and longdesc attributes.
+ In addition, avoid the use of server-side image maps.
+-->
+
+<!ELEMENT img EMPTY>
+<!ATTLIST img
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ name NMTOKEN #IMPLIED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Length; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ >
+
+<!-- usemap points to a map element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT map ((%block; | form | %misc;)+ | area+)>
+<!ATTLIST map
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name CDATA #IMPLIED
+ >
+
+<!ELEMENT area EMPTY>
+<!ATTLIST area
+ %attrs;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--================ Forms ===============================================-->
+
+<!ELEMENT form %form.content;> <!-- forms shouldn't be nested -->
+
+<!ATTLIST form
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ name NMTOKEN #IMPLIED
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ >
+
+<!--
+ Each label must not contain more than ONE field
+ Label elements shouldn't be nested.
+-->
+<!ELEMENT label %Inline;>
+<!ATTLIST label
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!ENTITY % InputType
+ "(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)"
+ >
+
+<!-- the name attribute is required for all but submit & reset -->
+
+<!ELEMENT input EMPTY> <!-- form control -->
+<!ATTLIST input
+ %attrs;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ >
+
+<!ELEMENT select (optgroup|option)+> <!-- option selector -->
+<!ATTLIST select
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!ELEMENT optgroup (option)+> <!-- option group -->
+<!ATTLIST optgroup
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ >
+
+<!ELEMENT option (#PCDATA)> <!-- selectable choice -->
+<!ATTLIST option
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ >
+
+<!ELEMENT textarea (#PCDATA)> <!-- multi-line text field -->
+<!ATTLIST textarea
+ %attrs;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ >
+
+<!--
+ The fieldset element is used to group form fields.
+ Only one legend element should occur in the content
+ and if present should only be preceded by whitespace.
+-->
+<!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
+<!ATTLIST fieldset
+ %attrs;
+ >
+
+<!ENTITY % LAlign "(top|bottom|left|right)">
+
+<!ELEMENT legend %Inline;> <!-- fieldset label -->
+<!ATTLIST legend
+ %attrs;
+ accesskey %Character; #IMPLIED
+ align %LAlign; #IMPLIED
+ >
+
+<!--
+ Content is %Flow; excluding a, form, form controls, iframe
+-->
+<!ELEMENT button %button.content;> <!-- push button -->
+<!ATTLIST button
+ %attrs;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ >
+
+<!-- single-line text input control (DEPRECATED) -->
+<!ELEMENT isindex EMPTY>
+<!ATTLIST isindex
+ %coreattrs;
+ %i18n;
+ prompt %Text; #IMPLIED
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- Derived from IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The border attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The frame attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the valign attribute.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The rules attribute defines which rules to draw between cells:
+
+ If rules is absent then assume:
+ "none" if border is absent or border="0" otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents
+
+ char alignment char, e.g. char=':'
+ charoff offset for alignment char
+-->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT table
+ (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
+<!ELEMENT caption %Inline;>
+<!ELEMENT thead (tr)+>
+<!ELEMENT tfoot (tr)+>
+<!ELEMENT tbody (tr)+>
+<!ELEMENT colgroup (col)*>
+<!ELEMENT col EMPTY>
+<!ELEMENT tr (th|td)+>
+<!ELEMENT th %Flow;>
+<!ELEMENT td %Flow;>
+
+<!ATTLIST table
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ align %TAlign; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ >
+
+<!ENTITY % CAlign "(top|bottom|left|right)">
+
+<!ATTLIST caption
+ %attrs;
+ align %CAlign; #IMPLIED
+ >
+
+<!--
+colgroup groups a set of col elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST colgroup
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ col elements define the alignment properties for cells in
+ one or more columns.
+
+ The width attribute specifies the width of the columns, e.g.
+
+ width=64 width in screen pixels
+ width=0.5* relative width of 0.5
+
+ The span attribute causes the attributes of one
+ col element to apply to more than one column.
+-->
+<!ATTLIST col
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!--
+ Use thead to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ tbody sections are rendered in scrolling panel.
+
+ Use tfoot to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ tbody sections are rendered in scrolling panel.
+
+ Use multiple tbody sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST thead
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tfoot
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tbody
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ >
+
+<!ATTLIST tr
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ bgcolor %Color; #IMPLIED
+ >
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- th is for headers, td for data and for cells acting as both -->
+
+<!ATTLIST th
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ >
+
+<!ATTLIST td
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ >
+
diff --git a/test/valid/dtds/xhtml1.dcl b/test/valid/dtds/xhtml1.dcl
new file mode 100644
index 0000000..fed2103
--- /dev/null
+++ b/test/valid/dtds/xhtml1.dcl
@@ -0,0 +1,179 @@
+<!SGML -- SGML Declaration for valid XML documents --
+ "ISO 8879:1986 (WWW)"
+
+ CHARSET
+ BASESET
+ "ISO Registration Number 176//CHARSET
+ ISO/IEC 10646-1:1993 UCS-4 with implementation
+ level 3//ESC 2/5 2/15 4/6"
+ DESCSET
+ 0 9 UNUSED
+ 9 2 9
+ 11 2 UNUSED
+ 13 1 13
+ 14 18 UNUSED
+ 32 95 32
+ 127 1 UNUSED
+ 128 32 UNUSED
+ -- use this instead of the official declaration because SP only
+ supports 16-bit characters --
+ 160 65374 160
+ 65534 2 UNUSED
+ -- 55296 2048 UNUSED
+ 57344 8190 57344
+ 65534 2 UNUSED
+ 65536 1048576 65536 --
+ CAPACITY NONE
+
+ SCOPE DOCUMENT
+
+ SYNTAX
+ SHUNCHAR NONE
+ BASESET "ISO Registration Number 176//CHARSET
+ ISO/IEC 10646-1:1993 UCS-4 with implementation
+ level 3//ESC 2/5 2/15 4/6"
+ DESCSET
+ 0 1114112 0
+ FUNCTION
+ RE 13
+ RS 10
+ SPACE 32
+ TAB SEPCHAR 9
+
+ NAMING
+ LCNMSTRT ""
+ UCNMSTRT ""
+ NAMESTRT
+ 58 95 192-214 216-246 248-305 308-318 321-328
+ 330-382 384-451 461-496 500-501 506-535 592-680
+ 699-705 902 904-906 908 910-929 931-974 976-982
+ 986 988 990 992 994-1011 1025-1036 1038-1103
+ 1105-1116 1118-1153 1168-1220 1223-1224
+ 1227-1228 1232-1259 1262-1269 1272-1273
+ 1329-1366 1369 1377-1414 1488-1514 1520-1522
+ 1569-1594 1601-1610 1649-1719 1722-1726
+ 1728-1742 1744-1747 1749 1765-1766 2309-2361
+ 2365 2392-2401 2437-2444 2447-2448 2451-2472
+ 2474-2480 2482 2486-2489 2524-2525 2527-2529
+ 2544-2545 2565-2570 2575-2576 2579-2600
+ 2602-2608 2610-2611 2613-2614 2616-2617
+ 2649-2652 2654 2674-2676 2693-2699 2701
+ 2703-2705 2707-2728 2730-2736 2738-2739
+ 2741-2745 2749 2784 2821-2828 2831-2832
+ 2835-2856 2858-2864 2866-2867 2870-2873 2877
+ 2908-2909 2911-2913 2949-2954 2958-2960
+ 2962-2965 2969-2970 2972 2974-2975 2979-2980
+ 2984-2986 2990-2997 2999-3001 3077-3084
+ 3086-3088 3090-3112 3114-3123 3125-3129
+ 3168-3169 3205-3212 3214-3216 3218-3240
+ 3242-3251 3253-3257 3294 3296-3297 3333-3340
+ 3342-3344 3346-3368 3370-3385 3424-3425
+ 3585-3630 3632 3634-3635 3648-3653 3713-3714
+ 3716 3719-3720 3722 3725 3732-3735 3737-3743
+ 3745-3747 3749 3751 3754-3755 3757-3758 3760
+ 3762-3763 3773 3776-3780 3904-3911 3913-3945
+ 4256-4293 4304-4342 4352 4354-4355 4357-4359
+ 4361 4363-4364 4366-4370 4412 4414 4416 4428
+ 4430 4432 4436-4437 4441 4447-4449 4451 4453
+ 4455 4457 4461-4462 4466-4467 4469 4510 4520
+ 4523 4526-4527 4535-4536 4538 4540-4546 4587
+ 4592 4601 7680-7835 7840-7929 7936-7957
+ 7960-7965 7968-8005 8008-8013 8016-8023 8025
+ 8027 8029 8031-8061 8064-8116 8118-8124 8126
+ 8130-8132 8134-8140 8144-8147 8150-8155
+ 8160-8172 8178-8180 8182-8188 8486 8490-8491
+ 8494 8576-8578 12295 12321-12329 12353-12436
+ 12449-12538 12549-12588 19968-40869 44032-55203
+
+ LCNMCHAR ""
+ UCNMCHAR ""
+ NAMECHAR
+ 45-46 183 720-721 768-837 864-865 903 1155-1158
+ 1425-1441 1443-1465 1467-1469 1471 1473-1474
+ 1476 1600 1611-1618 1632-1641 1648 1750-1764
+ 1767-1768 1770-1773 1776-1785 2305-2307 2364
+ 2366-2381 2385-2388 2402-2403 2406-2415
+ 2433-2435 2492 2494-2500 2503-2504 2507-2509
+ 2519 2530-2531 2534-2543 2562 2620 2622-2626
+ 2631-2632 2635-2637 2662-2673 2689-2691 2748
+ 2750-2757 2759-2761 2763-2765 2790-2799
+ 2817-2819 2876 2878-2883 2887-2888 2891-2893
+ 2902-2903 2918-2927 2946-2947 3006-3010
+ 3014-3016 3018-3021 3031 3047-3055 3073-3075
+ 3134-3140 3142-3144 3146-3149 3157-3158
+ 3174-3183 3202-3203 3262-3268 3270-3272
+ 3274-3277 3285-3286 3302-3311 3330-3331
+ 3390-3395 3398-3400 3402-3405 3415 3430-3439
+ 3633 3636-3642 3654-3662 3664-3673 3761
+ 3764-3769 3771-3772 3782 3784-3789 3792-3801
+ 3864-3865 3872-3881 3893 3895 3897 3902-3903
+ 3953-3972 3974-3979 3984-3989 3991 3993-4013
+ 4017-4023 4025 8400-8412 8417 12293 12330-12335
+ 12337-12341 12441-12442 12445-12446 12540-12542
+
+ NAMECASE
+ GENERAL NO
+ ENTITY NO
+
+ DELIM
+ GENERAL SGMLREF
+ HCRO "&#38;#x" -- 38 is the number for ampersand --
+ NESTC "/"
+ NET ">"
+ PIC "?>"
+ SHORTREF NONE
+
+ NAMES
+ SGMLREF
+
+ QUANTITY NONE
+
+ ENTITIES
+ "amp" 38
+ "lt" 60
+ "gt" 62
+ "quot" 34
+ "apos" 39
+
+ FEATURES
+ MINIMIZE
+ DATATAG NO
+ OMITTAG NO
+ RANK NO
+ SHORTTAG
+ STARTTAG
+ EMPTY NO
+ UNCLOSED NO
+ NETENABL IMMEDNET
+ ENDTAG
+ EMPTY NO
+ UNCLOSED NO
+ ATTRIB
+ DEFAULT YES
+ OMITNAME NO
+ VALUE NO
+ EMPTYNRM YES
+ IMPLYDEF
+ ATTLIST NO
+ DOCTYPE NO
+ ELEMENT NO
+ ENTITY NO
+ NOTATION NO
+ LINK
+ SIMPLE NO
+ IMPLICIT NO
+ EXPLICIT NO
+ OTHER
+ CONCUR NO
+ SUBDOC NO
+ FORMAL NO
+ URN NO
+ KEEPRSRE YES
+ VALIDITY TYPE
+ ENTITIES
+ REF ANY
+ INTEGRAL YES
+ APPINFO NONE
+ SEEALSO "ISO 8879:1986//NOTATION
+ Extensible Markup Language (XML) 1.0//EN"
+>
diff --git a/test/valid/dtds/xmlspec.dtd b/test/valid/dtds/xmlspec.dtd
new file mode 100644
index 0000000..55cfba6
--- /dev/null
+++ b/test/valid/dtds/xmlspec.dtd
@@ -0,0 +1,1102 @@
+<!-- ............................................................... -->
+<!-- XML specification DTD ......................................... -->
+<!-- ............................................................... -->
+
+<!--
+TYPICAL INVOCATION:
+# <!DOCTYPE spec PUBLIC
+# "-//W3C//DTD Specification::19980521//EN"
+# "http://www.w3.org/XML/1998/06/xmlspec-19980521.dtd">
+
+PURPOSE:
+ This DTD was developed for use with the XML family of W3C
+ specifications. It is an XML-compliant DTD based in part on
+ the TEI Lite and Sweb DTDs.
+
+DEPENDENCIES:
+ None.
+
+CHANGE HISTORY:
+ The list of changes is at the end of the DTD.
+
+ For all details, see the design report at:
+
+# <http://www.w3.org/XML/1998/06/xmlspec-report-19980521.htm>
+
+ The "typical invocation" FPI always gets updated to reflect the
+ date of the most recent changes.
+
+ Search this file for "#" in the first column to see change history
+ comments.
+
+MAINTAINER:
+ Eve Maler
+ ArborText Inc.
+ elm@arbortext.com
+ voice: +1 781 270 5750
+ fax: +1 781 273 3760
+-->
+
+<!-- ............................................................... -->
+<!-- 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.
+-->
+
+<!ENTITY lt "&#38;#60;">
+<!ENTITY gt "&#62;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY apos "&#39;">
+<!ENTITY quot "&#34;">
+<!ENTITY nbsp "&#160;">
+<!--
+<!ENTITY mdash "&#x2014;">
+<!ENTITY ldquo "&#x201C;">
+<!ENTITY rdquo "&#x201D;">
+-->
+
+<!-- ............................................................... -->
+<!-- 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;.
+-->
+
+<!ENTITY % local.p.class "">
+<!ENTITY % p.class "p
+ %local.p.class;">
+
+<!ENTITY % local.list.class "">
+<!ENTITY % list.class "ulist|olist|slist|glist
+ %local.list.class;">
+
+<!ENTITY % local.speclist.class "">
+<!ENTITY % speclist.class "orglist|blist
+ %local.speclist.class;">
+
+<!ENTITY % local.note.class "">
+<!ENTITY % note.class "note|issue|wfcnote|vcnote
+ |constraintnote %local.note.class;">
+
+<!ENTITY % local.illus.class "">
+<!ENTITY % illus.class "eg|graphic|scrap|htable
+ %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.
+-->
+
+<!ENTITY % local.annot.class "">
+<!ENTITY % annot.class "footnote
+ %local.annot.class;">
+
+<!ENTITY % local.termdef.class "">
+<!ENTITY % termdef.class "termdef|term
+ %local.termdef.class;">
+
+<!ENTITY % local.emph.class "">
+<!ENTITY % emph.class "emph|quote
+ %local.emph.class;">
+
+<!ENTITY % local.ref.class "">
+<!ENTITY % ref.class "bibref|specref|termref|titleref
+ |xspecref|xtermref
+ %local.ref.class;">
+
+<!ENTITY % local.loc.class "">
+<!ENTITY % loc.class "loc
+ %local.loc.class;">
+
+<!ENTITY % local.tech.class "">
+<!ENTITY % tech.class "kw|nt|xnt|code
+ %local.tech.class;">
+
+<!ENTITY % local.ednote.class "">
+<!ENTITY % 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;.
+-->
+
+<!ENTITY % div.mix
+ "%p.class;|%list.class;|%speclist.class;|%note.class;
+ |%illus.class;|%ednote.class;">
+<!ENTITY % obj.mix
+ "%p.class;|%list.class;|%speclist.class;|%note.class;
+ |%illus.class;|%ednote.class;">
+<!ENTITY % p.mix
+ "%list.class;|%speclist.class;|%note.class;|%illus.class;">
+<!ENTITY % entry.mix
+ "%list.class;|note|eg|graphic|%ednote.class;">
+<!ENTITY % hdr.mix
+ "%p.class;|%list.class;|%ednote.class;">
+<!ENTITY % termdef.mix
+ "%note.class;|%illus.class;">
+
+<!-- ............................................................... -->
+<!-- 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;.
+-->
+
+<!ENTITY % p.pcd.mix
+ "#PCDATA|%annot.class;|%termdef.class;|%emph.class;
+ |%ref.class;|%tech.class;|%loc.class;|%ednote.class;">
+<!ENTITY % head.pcd.mix
+ "#PCDATA|%annot.class;|%emph.class;|%tech.class;|%ednote.class;">
+<!ENTITY % label.pcd.mix
+ "#PCDATA|%annot.class;|%termdef.class;|%emph.class;|%tech.class;
+ |%ednote.class;">
+<!ENTITY % eg.pcd.mix
+ "#PCDATA|%annot.class;|%emph.class;|%ednote.class;|constraint">
+<!ENTITY % termdef.pcd.mix
+ "#PCDATA|term|%emph.class;|%ref.class;|%tech.class;
+ |%ednote.class;">
+<!ENTITY % bibl.pcd.mix
+ "#PCDATA|%emph.class;|%ref.class;|%loc.class;|%ednote.class;">
+<!ENTITY % tech.pcd.mix
+ "#PCDATA|%ednote.class;">
+<!ENTITY % loc.pcd.mix
+ "#PCDATA|%loc.class;|%ednote.class;">
+
+<!-- ............................................................... -->
+<!-- Entities for customizable content models ...................... -->
+
+<!--
+#1998-03-10: maler: Added customization entities.
+#1998-05-14: maler: Allowed prevlocs and latestloc in either order.
+-->
+
+<!ENTITY % spec.mdl
+ "header, front?, body, back?">
+
+<!ENTITY % header.mdl
+ "title, subtitle?, version, w3c-designation, w3c-doctype,
+ pubdate, notice*, publoc, ((prevlocs, latestloc?) |
+ (latestloc, prevlocs?))?, authlist, status, abstract,
+ pubstmt?, sourcedesc?, langusage, revisiondesc">
+
+<!ENTITY % pubdate.mdl
+ "day?, month, year">
+
+<!-- ............................................................... -->
+<!-- Entities for common attributes ................................ -->
+
+<!-- key attribute:
+ Optionally provides a sorting or indexing key, for cases when
+ the element content is inappropriate for this purpose. -->
+<!ENTITY % key.att
+ 'key CDATA #IMPLIED'>
+
+<!-- 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. -->
+<!ENTITY % def.att
+ 'def IDREF #IMPLIED'>
+<!ENTITY % def-req.att
+ 'def IDREF #REQUIRED'>
+
+<!-- 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. -->
+<!ENTITY % ref.att
+ 'ref IDREF #IMPLIED'>
+<!ENTITY % ref-req.att
+ 'ref IDREF #REQUIRED'>
+
+<!--
+#1998-03-23: maler: Added show and actuate attributes to href.
+# Added semi-common xml:space attribute.
+-->
+
+<!-- HREF and source attributes:
+ Points to the element where more information or source data
+ can be found, using the URL (XLL simple link) mechanism.
+ For some purposes, is associated with additional XLL
+ attributes. %href.att; is for optional HREF attributes,
+ and %href-req.att; is for required HREF attributes.
+ %source-req.att; is for the source attribute, which
+ is always required. -->
+<!ENTITY % href.att
+ 'xml:link CDATA #FIXED "simple"
+ href CDATA #IMPLIED
+ show CDATA #FIXED "embed"
+ actuate CDATA #FIXED "auto"'>
+
+<!ENTITY % href-req.att
+ 'xml:link CDATA #FIXED "simple"
+ href CDATA #REQUIRED
+ show CDATA #FIXED "embed"
+ actuate CDATA #FIXED "auto"'>
+
+<!ENTITY % source-req.att
+ 'xml:link CDATA #FIXED "simple"
+ xml:attributes NMTOKENS #FIXED "href source"
+ source CDATA #REQUIRED
+ show CDATA #FIXED "embed"
+ actuate CDATA #FIXED "auto"'>
+
+<!-- xml:space attribute:
+ Indicates that the element contains white space
+ that the formatter or other application should retain,
+ as appropriate to its function. -->
+<!ENTITY % xmlspace.att
+ 'xml:space (default
+ |preserve) #FIXED "preserve"'>
+
+<!-- Common attributes:
+ Every element has an ID attribute (sometimes required,
+ but usually optional) for links, and a Role attribute
+ for extending the useful life of the DTD by allowing
+ authors to make subclasses for any element. %common.att;
+ is for common attributes where the ID is optional, and
+ %common-idreq.att; is for common attributes where the
+ ID is required. -->
+<!ENTITY % common.att
+ 'id ID #IMPLIED
+ role NMTOKEN #IMPLIED'>
+<!ENTITY % common-idreq.att
+ 'id ID #REQUIRED
+ role NMTOKEN #IMPLIED'>
+
+<!-- ............................................................... -->
+<!-- Common elements ............................................... -->
+
+<!-- head: Title on divisions, productions, and the like -->
+<!ELEMENT head (%head.pcd.mix;)*>
+<!ATTLIST head %common.att;>
+
+<!-- ............................................................... -->
+<!-- Major specification structure ................................. -->
+
+<!--
+#1998-03-10: maler: Made spec content model easily customizable.
+-->
+
+<!ELEMENT spec (%spec.mdl;)>
+<!ATTLIST spec %common.att;>
+
+<!ELEMENT front (div1+)>
+<!ATTLIST front %common.att;>
+
+<!ELEMENT body (div1+)>
+<!ATTLIST body %common.att;>
+
+<!--
+#1997-09-30: maler: Added inform-div1 to back content.
+-->
+
+<!ELEMENT back ((div1+, inform-div1*) | inform-div1+)>
+<!ATTLIST back %common.att;>
+
+<!ELEMENT div1 (head, (%div.mix;)*, div2*)>
+<!ATTLIST div1 %common.att;>
+
+<!--
+#1997-09-30: maler: Added inform-div1 declarations.
+-->
+
+<!-- inform-div1: Non-normative division in back matter -->
+<!ELEMENT inform-div1 (head, (%div.mix;)*, div2*)>
+<!ATTLIST inform-div1 %common.att;>
+
+<!ELEMENT div2 (head, (%div.mix;)*, div3*)>
+<!ATTLIST div2 %common.att;>
+
+<!ELEMENT div3 (head, (%div.mix;)*, div4*)>
+<!ATTLIST div3 %common.att;>
+
+<!ELEMENT div4 (head, (%div.mix;)*)>
+<!ATTLIST div4 %common.att;>
+
+<!-- Specification header .......... -->
+
+<!--
+#1998-03-10: maler: Made header content model easily customizable.
+-->
+
+<!ELEMENT header (%header.mdl;)>
+<!ATTLIST header %common.att;>
+
+<!-- Example of title: "Extensible Cheese Language (XCL)" -->
+<!ELEMENT title (#PCDATA)>
+<!ATTLIST title %common.att;>
+
+<!-- Example of subtitle: "A Cheesy Specification" -->
+<!ELEMENT subtitle (#PCDATA)>
+<!ATTLIST subtitle %common.att;>
+
+<!-- Example of version: "Version 666.0" -->
+<!ELEMENT version (#PCDATA)>
+<!ATTLIST version %common.att;>
+
+<!-- Example of w3c-designation: "WD-xcl-19991231" -->
+<!ELEMENT w3c-designation (#PCDATA)>
+<!ATTLIST w3c-designation %common.att;>
+
+<!-- Example of w3c-doctype: "World Wide Web Consortium Working
+ Draft" -->
+<!ELEMENT w3c-doctype (#PCDATA)>
+<!ATTLIST w3c-doctype %common.att;>
+
+<!--
+#1998-03-10: maler: Made pubdate content model easily customizable.
+-->
+
+<!ELEMENT pubdate (%pubdate.mdl;)>
+<!ATTLIST pubdate %common.att;>
+
+<!ELEMENT day (#PCDATA)>
+<!ATTLIST day %common.att;>
+
+<!ELEMENT month (#PCDATA)>
+<!ATTLIST month %common.att;>
+
+<!ELEMENT year (#PCDATA)>
+<!ATTLIST year %common.att;>
+
+<!-- Example of notice: "This draft is for public comment..." -->
+<!ELEMENT notice (%hdr.mix;)+>
+<!ATTLIST notice %common.att;>
+
+<!ELEMENT publoc (loc+)>
+<!ATTLIST publoc %common.att;>
+
+<!ELEMENT prevlocs (loc+)>
+<!ATTLIST prevlocs %common.att;>
+
+<!ELEMENT latestloc (loc+)>
+<!ATTLIST latestloc %common.att;>
+
+<!-- loc (defined in "Phrase-level elements" below) -->
+
+<!ELEMENT authlist (author+)>
+<!ATTLIST authlist %common.att;>
+
+<!--
+#1997-09-30: maler: Made affiliation optional.
+#1998-03-10: maler: Made email optional.
+-->
+
+<!ELEMENT author (name, affiliation?, email?)>
+<!ATTLIST author %common.att;>
+
+<!ELEMENT name (#PCDATA)>
+<!ATTLIST name
+ %common.att;
+ %key.att;>
+
+<!ELEMENT affiliation (#PCDATA)>
+<!ATTLIST affiliation %common.att;>
+
+<!ELEMENT email (#PCDATA)>
+<!-- HREF attribute:
+ email functions as a hypertext reference through this
+ required attribute. Typically the reference would use
+ the mailto: scheme. -->
+<!ATTLIST email
+ %common.att;
+ %href-req.att;>
+
+<!--
+#1998-05-15: maler: Changed status content from %statusobj.mix;
+# to plain %obj.mix;. statusp is obsolete.
+-->
+
+<!ELEMENT status (%obj.mix;)+>
+<!ATTLIST status %common.att;>
+
+<!ELEMENT abstract (%hdr.mix;)*>
+<!ATTLIST abstract %common.att;>
+
+<!ELEMENT pubstmt (%hdr.mix;)+>
+<!ATTLIST pubstmt %common.att;>
+
+<!ELEMENT sourcedesc (%hdr.mix;)+>
+<!ATTLIST sourcedesc %common.att;>
+
+<!ELEMENT langusage (language+)>
+<!ATTLIST langusage %common.att;>
+
+<!ELEMENT language (#PCDATA)>
+<!ATTLIST language %common.att;>
+
+<!ELEMENT revisiondesc (%hdr.mix;)+>
+<!ATTLIST revisiondesc %common.att;>
+
+<!-- ............................................................... -->
+<!-- Standalone elements ........................................... -->
+
+<!-- Paragraphs .................... -->
+
+<!--
+#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.
+-->
+
+<!ELEMENT p (%p.pcd.mix;|%p.mix;)*>
+<!ATTLIST p %common.att;>
+
+<!-- Lists ......................... -->
+
+<!ELEMENT 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;
+ spacing (normal|compact) #IMPLIED>
+
+<!ELEMENT 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;
+ spacing (normal|compact) #IMPLIED>
+
+<!ELEMENT item (%obj.mix;)+>
+<!ATTLIST item %common.att;>
+
+<!ELEMENT slist (sitem+)>
+<!ATTLIST slist %common.att;>
+
+<!ELEMENT sitem (%p.pcd.mix;)*>
+<!ATTLIST sitem %common.att;>
+
+<!ELEMENT glist (gitem+)>
+<!ATTLIST glist %common.att;>
+
+<!ELEMENT gitem (label, def)>
+<!ATTLIST gitem %common.att;>
+
+<!ELEMENT label (%label.pcd.mix;)*>
+<!ATTLIST label %common.att;>
+
+<!ELEMENT def (%obj.mix;)*>
+<!ATTLIST def %common.att;>
+
+<!-- Special lists ................. -->
+
+<!ELEMENT blist (bibl+)>
+<!ATTLIST blist %common.att;>
+
+<!ELEMENT bibl (%bibl.pcd.mix;)*>
+<!-- HREF attribute:
+ bibl optionally functions as a hypertext reference to the
+ referred-to resource through this attribute. -->
+<!ATTLIST bibl
+ %common.att;
+ %href.att;
+ %key.att;>
+
+<!ELEMENT orglist (member+)>
+<!ATTLIST orglist %common.att;>
+
+<!--
+#1997-09-30: maler: Added optional affiliation.
+-->
+
+<!ELEMENT member (name, affiliation?, role?)>
+<!ATTLIST member %common.att;>
+
+<!-- name (defined in "Specification header" above) -->
+<!-- affiliation (defined in "Specification header" above) -->
+
+<!ELEMENT role (#PCDATA)>
+<!ATTLIST role %common.att;>
+
+<!-- Notes ......................... -->
+
+<!ELEMENT note (%obj.mix;)+>
+<!ATTLIST note %common.att;>
+
+<!--
+#1998-05-14: maler: Declared issue element.
+-->
+
+<!ELEMENT issue (%obj.mix;)+>
+<!ATTLIST issue %common-idreq.att;>
+
+<!ELEMENT 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;>
+
+<!ELEMENT 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.
+-->
+
+<!ELEMENT constraintnote (head, (%obj.mix;)+)>
+<!-- ID attribute:
+ cnote must have an ID so that it can be pointed to
+ from a constraint element in a production. -->
+<!-- type attribute:
+ cnote must have a type value keyword so that it can be
+ correctly characterized in the specification. -->
+<!ATTLIST constraintnote
+ %common-idreq.att;
+ type NMTOKEN #REQUIRED>
+
+<!-- Illustrations ................. -->
+
+<!--
+#1998-03-23: maler: Added xml:space attribute.
+-->
+
+<!ELEMENT eg (%eg.pcd.mix;)*>
+<!ATTLIST eg
+ %common.att;
+ %xmlspace.att;>
+
+<!ELEMENT graphic EMPTY>
+<!-- source attribute:
+ The graphic data must reside at the location pointed to.
+ This is a hypertext reference, but for practical purposes,
+ for now it should just be a pathname. -->
+<!ATTLIST graphic
+ %common.att;
+ %source-req.att;
+ alt CDATA #IMPLIED>
+
+<!--
+#1997-11-28: maler: Added prodgroup to scrap and defined it.
+#1998-05-21: maler: Added constraint to prod.
+-->
+
+<!ELEMENT scrap (head, (prodgroup+ | prod+ | bnf))>
+<!-- lang attribute:
+ The scrap can link to a description of the language used,
+ found in a language element in the header. -->
+<!ATTLIST scrap
+ %common.att;
+ lang IDREF #IMPLIED>
+
+<!ELEMENT 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;
+ pcw1 CDATA #IMPLIED
+ pcw2 CDATA #IMPLIED
+ pcw3 CDATA #IMPLIED
+ pcw4 CDATA #IMPLIED
+ pcw5 CDATA #IMPLIED
+>
+
+<!ELEMENT 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;>
+
+<!ELEMENT lhs (#PCDATA)>
+<!ATTLIST lhs %common.att;>
+
+<!ELEMENT rhs (#PCDATA|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.
+-->
+
+<!ELEMENT com (#PCDATA|loc|bibref)*>
+<!ATTLIST com %common.att;>
+
+<!-- wfc: Should generate the head of the wfcnote pointed to -->
+<!ELEMENT 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: Should generate the head of the vcnote pointed to -->
+<!ELEMENT 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: Should generate the head of the constraintnote
+ pointed to -->
+<!ELEMENT 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 production -->
+<!ELEMENT bnf (%eg.pcd.mix;)*>
+<!ATTLIST bnf
+ %common.att;
+ %xmlspace.att;>
+
+<!--
+#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.
+-->
+
+<!ENTITY % cellhalign.att
+ 'align (left|center
+ |right|justify
+ |char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED'>
+
+<!ENTITY % cellvalign.att
+ 'valign (top|middle
+ |bottom
+ |baseline) #IMPLIED'>
+
+<!ENTITY % thtd.att
+ 'abbr CDATA #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope (row
+ |col
+ |rowgroup
+ |colgroup) #IMPLIED
+ rowspan NMTOKEN "1"
+ colspan NMTOKEN "1"'>
+
+<!ENTITY % width.att
+ 'width CDATA #IMPLIED'>
+
+<!ENTITY % span.att
+ 'span NMTOKEN "1"'>
+
+<!ELEMENT table
+ (caption?, (col*|colgroup*), thead?, tfoot?, tbody+)>
+<!ATTLIST table
+ %common.att;
+ %width.att;
+ summary CDATA #IMPLIED
+ border CDATA #IMPLIED
+ frame (void|above
+ |below|hsides
+ |lhs|rhs
+ |vsides|box
+ |border) #IMPLIED
+ rules (none|groups
+ |rows|cols
+ |all) #IMPLIED
+ cellspacing CDATA #IMPLIED
+ cellpadding CDATA #IMPLIED>
+
+<!ELEMENT caption (%p.pcd.mix;)*>
+<!ATTLIST caption %common.att;>
+
+<!ELEMENT col EMPTY>
+<!ATTLIST col
+ %common.att;
+ %span.att;
+ %width.att;
+ %cellhalign.att;
+ %cellvalign.att;>
+
+<!ELEMENT colgroup (col)*>
+<!ATTLIST colgroup
+ %common.att;
+ %span.att;
+ %width.att;
+ %cellhalign.att;
+ %cellvalign.att;>
+
+<!ELEMENT thead (tr)+>
+<!ATTLIST thead
+ %common.att;
+ %cellhalign.att;
+ %cellvalign.att;>
+
+<!ELEMENT tfoot (tr)+>
+<!ATTLIST tfoot
+ %common.att;
+ %cellhalign.att;
+ %cellvalign.att;>
+
+<!ELEMENT tbody (tr)+>
+<!ATTLIST tbody
+ %common.att;
+ %cellhalign.att;
+ %cellvalign.att;>
+
+<!ELEMENT tr (th|td)+>
+<!ATTLIST tr
+ %common.att;
+ %cellhalign.att;
+ %cellvalign.att;>
+
+<!ELEMENT th (%p.pcd.mix;|%p.mix;)*>
+<!ATTLIST th
+ %common.att;
+ %thtd.att;
+ %cellhalign.att;
+ %cellvalign.att;>
+
+<!ELEMENT td (%p.pcd.mix;|%p.mix;)*>
+<!ATTLIST td
+ %common.att;
+ %thtd.att;
+ %cellhalign.att;
+ %cellvalign.att;>
+
+<!-- ............................................................... -->
+<!-- Phrase-level elements ......................................... -->
+
+<!-- bibref: Should generate, in square brackets, "key" on bibl -->
+<!ELEMENT bibref EMPTY>
+<!-- ref attribute:
+ A bibliography reference must link to the bibl element that
+ describes the resource. -->
+<!ATTLIST bibref
+ %common.att;
+ %ref-req.att;>
+
+<!ELEMENT code (%tech.pcd.mix;)*>
+<!ATTLIST code %common.att;>
+
+<!--
+#1998-03-10: maler: Declared ednote and related elements.
+-->
+
+<!ELEMENT ednote (name?, date?, edtext)>
+<!ATTLIST ednote %common.att;>
+
+<!ELEMENT date (#PCDATA)>
+<!ATTLIST date %common.att;>
+
+<!ELEMENT edtext (#PCDATA)>
+<!ATTLIST edtext %common.att;>
+
+<!ELEMENT emph (#PCDATA)>
+<!ATTLIST emph %common.att;>
+
+<!-- footnote: Both footnote content and call to footnote -->
+<!ELEMENT footnote (%obj.mix;)+>
+<!ATTLIST footnote %common.att;>
+
+<!ELEMENT kw (%tech.pcd.mix;)*>
+<!ATTLIST kw %common.att;>
+
+<!ELEMENT loc (#PCDATA)>
+<!-- HREF attribute:
+ The purpose of a loc element is to function as a 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.) -->
+<!ATTLIST loc
+ %common.att;
+ %href-req.att;>
+
+<!ELEMENT nt (#PCDATA)>
+<!-- def attribute:
+ The nonterminal must link to the production that defines
+ it. -->
+<!ATTLIST nt
+ %common.att;
+ %def-req.att;>
+
+<!--
+#1998-03-10: maler: Declared quote.
+-->
+
+<!-- quote: Scare quotes and other purely presentational quotes -->
+<!ELEMENT quote (%p.pcd.mix;)*>
+<!ATTLIST quote %common.att;>
+
+<!-- specref: Should generate italic "[n.n], Section Title" for
+ div, "n" for numbered item, "[n]" for production, or
+ "Issue n" for issue -->
+<!ELEMENT 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;>
+
+<!ELEMENT term (#PCDATA)>
+<!ATTLIST term %common.att;>
+
+<!ELEMENT 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;
+ term CDATA #REQUIRED>
+
+<!ELEMENT termref (#PCDATA)>
+<!-- ref attribute:
+ A term reference must link to the termdef element that
+ defines the term. -->
+<!ATTLIST termref
+ %common.att;
+ %def-req.att;>
+
+<!ELEMENT titleref (#PCDATA)>
+<!-- HREF attribute:
+ A title reference can optionally function as a hypertext
+ link to the resource with this title. -->
+<!ATTLIST titleref
+ %common.att;
+ %href.att;>
+
+<!ELEMENT xnt (#PCDATA)>
+<!-- HREF attribute:
+ The nonterminal must hyperlink to a resource that serves
+ to define it (e.g., a production in a related XML
+ specification). -->
+<!ATTLIST xnt
+ %common.att;
+ %href-req.att;>
+
+<!--
+#1997-12-29: maler: Declared xspecref.
+-->
+
+<!ELEMENT xspecref (#PCDATA)>
+<!-- HREF attribute:
+ The spec reference must hyperlink to the resource to
+ cross-refer to (e.g., a section in a related XML
+ specification). -->
+<!ATTLIST xspecref
+ %common.att;
+ %href-req.att;>
+
+<!ELEMENT xtermref (#PCDATA)>
+<!-- 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). -->
+<!ATTLIST xtermref
+ %common.att;
+ %href-req.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.
+-->
+
+<!-- The following elements are purposely declared but never
+ referenced. Declaring them allows them to be pasted from
+ an HTML document or an earlier version of an XML spec 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. -->
+
+<!ELEMENT div
+ (head?, (%div.mix;|ul|ol|h1|h2|h3|h4|h5|h6|div)*)>
+<!ELEMENT h1 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h2 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h3 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h4 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h5 (%head.pcd.mix;|em|a)*>
+<!ELEMENT h6 (%head.pcd.mix;|em|a)*>
+<!ELEMENT pre (%eg.pcd.mix;|em)*>
+<!ELEMENT ul (item|li)*>
+<!ELEMENT ol (item|li)*>
+<!ELEMENT li (#PCDATA|%obj.mix;)*>
+<!ELEMENT em (#PCDATA)>
+<!ELEMENT a (#PCDATA)>
+
+<!ELEMENT key-term (#PCDATA)>
+<!ELEMENT htable
+ (caption?, (col*|colgroup*), thead?, tfoot?, tbody+)>
+<!ELEMENT htbody (tr)+>
+<!ELEMENT statusp (%p.pcd.mix;|%p.mix;)*>
+
+<!-- ............................................................... -->
+<!-- Change 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.
+-->
+
+<!-- ............................................................... -->
+<!-- End of XML specification DTD .................................. -->
+<!-- ............................................................... --> \ No newline at end of file