The SYSTEM keyword is not the only way to reference an external DTD.
This keyword is primarily used for referencing private DTDs that are
shared among the documents of a single author or organization.
Alternatively, DTDs may be made available to the public by using the
PUBLIC keyword. When using the PUBLIC keyword, an external DTD also
gets a name by which it can be recognized. the generic format for
referencing a PUBLIC DTD loks something like...
<!DOCTYPE ROOT_ELEMENT PUBLIC "DTD_NAME"
"URL_OF_EXTERNAL_DTD">
In usage, it would look more like the following:
<!DOCTYPE CONTACTS PUBLIC "CONTACT_DTD"
"http://www.mydomain.com/dtds/contacts.dtd">
The names used for DTDs are a little different from XML names. In
particular, they may contain only alphanumeric characters, the space
and new line characaters, and the following punctuation: -
_%$#@()+:=/!*;?. Further, DTD names follow some general standards.
ISO standard DTDs begin with ISO. Approved non-ISO standard DTDs begin
with a plus (+) sign. Non approved non-ISO standard DTDs begin with a
dash (-).
Whichever the case, the initial segment is followed by two slashes (//)
and the name of the owner of the DTD. Following the name is another
slash and then the type of document the DTD describes. Finally, the
string is tagged with another slash and a language reference (ISO 639).
For example, you might see a reference like
<!DOCTYPE CONTACTS PUBLIC "-//Selena Sol//Contact Data//EN"
"http://www.mydomain.com/dtds/contacts.dtd">