Consider the following DTD snippet....
<!ELEMENT CONTACT (NAME, EMAIL)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
In this case, we expect to see XML along the lines of
<CONTACT>
<NAME>Jim Sanger</NAME>
<EMAIL>sanger@sanger.com</EMAIL>
</CONTACT>
Alternatively, the following code would be valid:
<CONTACT>
<EMAIL>sanger@sanger.com</EMAIL>
<NAME>Jim Sanger</NAME>
</CONTACT>
We used a comma to order the list because all children must be ordered.
We could use a pipe to delimit a list of non-ordered, optional elements, however.
[thanks to Jason Suwala for pointing our error on unordered children--ed].
Thus if we redefined our DTD to use
<!ELEMENT CONTACT (NAME, EMAIL)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
Then the following XML would be valid
<CONTACT>
<NAME>Jim Sanger</NAME>
<EMAIL>sanger@sanger.com</EMAIL>
</CONTACT>
but the following XML would be invalid because the EMAIL element would
not be allowed to precede the NAME element.
<CONTACT>
<EMAIL>sanger@sanger.com</EMAIL>
<NAME>Jim Sanger</NAME>
</CONTACT>