built-in shelf
A built-in stream
shelf that provides the name of the document element.
#doctype
is attached as soon as OmniMark encounters the document element name at
the start of the DTD, following the DOCTYPE
keyword. Prior to this, #doctype
is unattached. Specifically, it is never attached in the following contexts:
document-start
, process
, process-start
, or process-end
rule.
do xml-parse
or do sgml-parse
block prior to the first %c
or suppress
, unless a pre-compiled DTD is used.
The #doctype is attached
test can be used to determine whether the document element name is
available.
The following example shows how to use the name of the document element to find an external entity when the
external identifier at the head of the DTD has neither a public nor system identifier (for example, <!doctype doc system>
). For example, if the file name of the DTD can be
obtained by appending a .dtd
suffix to the name of the document element, then
external-text-entity #dtd unless entity is (system | public) output file (#doctype || ".dtd")
The #doctype
shelf is normally set by the parser and is available only for reading, but you can
modify its value in the following specific contexts:
do sgml-parse
or a validating do xml-parse
action scope,
external-text-entity #dtd
rule,
dtd-start rule
, and
dtd-end
rule.
Once the parser encounters the first element in the document instance, it will expect it to match the value of
#doctype
whether it was set by the parser or manually. A markup error will be issued otherwise. If #doctype
is unattached
or is open
, a #program-error
will be thrown instead.
Setting the #doctype
shelf is usually performed after #current-dtd
is assigned. The following
example function can be used to validate a well-formed XML instance against a compiled XML DTD without knowing
the document element of the instance.
define markup source function parse-xml-against-dtd (value xml-dtd target-dtd, value string source xml-document) as do scan xml-document match any ** lookahead "<" (letter [letter | digit | "-_.:"]*) => root-element do xml-parse document scan xml-document set #current-dtd to target-dtd set #doctype to root-element output #content done done