rule
document-type-declaration condition?
local-declaration*
action*
document-type-declaration is a rule that fires on the document type declaration (DTD), if any, of a
parsed input. As a region rule, document-type-declaration fires on the whole of the DTD and must process either
%c or #content. Both in the rule guard and in the body of the rule, the built-in shelf #doctype
can be used to access the DTD's name. In the body of the rule, #doctype can be assigned to change the actual
document type of the input being processed.
The following SGML input defines element a as the document type.
<!doctype a [ <!element a - - (#pcdata)> <!element b o o (a)> <!element c - - (#pcdata)> ]> <a>Hello, World!</a>
If we wanted to change this to b to, for instance, perform additional processing, we could use a
simple document-type-declaration rule, as in the program below:
process do sgml-parse document scan #main-input output "%c" done document-type-declaration set #doctype to "b" suppress element #implied output "<%q>%c</%q>"
Execution of this program would yield the output
<B><A>Hello, World!</A></B>
When changing the document type in this fashion, the transformation must result in a markup stream that
conforms to the validation rules in effect for the input. For instance, in the example SGML DTD above, element
b was declared as being omissible and its content model allowed for one instance of element a.
It could thus serve as a parent element for the element a that appeared explicitly in the input, even
though it itself does not appear in the input. If, on the other hand, we had attempted to change the document type to
c, three validation errors would have been triggered:
c is not omissible,
and therefore must be physically present in the document instance,
c cannot contain element a, and
c is not omissible,
and therefore must be physically present in the document instance.
Similarly, if we had attempted to change the document type to d, a run-time error would have been
triggered, since there is no such element in the DTD.
The document-type-declaration rule completes its execution before any prolog-end rule is
fired.
The document-type-declaration rule begins its execution before any external-text-entity #dtd
rule is fired, but completes is execution after any external-text-entity #dtd has completed.
A document-type-declaration rule cannot appear in the same module as a dtd-start rule, nor as
a dtd-end rule.