He probado la validez del documento XML con el DTD utilizando xmllint.
Al principio me agregó un error para propósitos de prueba.
La segunda vez la validación tuvo éxito.
1. el DTD:
<!ELEMENT html (head?, body)>
<!ELEMENT head (title, meta*)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT meta EMPTY>
<!ATTLIST meta charset (US-ASCII|ISO-8859-1|UTF-8) "UTF-8"
name CDATA #IMPLIED
content CDATA #IMPLIED>
<!ELEMENT body (#PCDATA|h1|h2|h3|h4|h5|h6|p|br)*>
<!ELEMENT h1 (#PCDATA|a|br)*>
<!ELEMENT h2 (#PCDATA|a|br)*>
<!ELEMENT h3 (#PCDATA|a|br)*>
<!ELEMENT h4 (#PCDATA|a|br)*>
<!ELEMENT h5 (#PCDATA|a|br)*>
<!ELEMENT h6 (#PCDATA|a|br)*>
<!ELEMENT p (#PCDATA|a|br|table)*>
<!ELEMENT a (#PCDATA|br)*>
<!ATTLIST a href CDATA #REQUIRED>
<!ELEMENT br EMPTY>
<!ELEMENT table (tr)+>
<!ELEMENT tr (th|td)+>
<!ELEMENT th (#PCDATA|a|br)*>
<!ELEMENT td (#PCDATA|a|br)*>
2. el documento miniHTML:
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head>
<title>Mi documento miniHTML</title>
<meta name="description" content="Un documento miniHTML"/>
<meta name="keywords" content="miniHTML,XML,DTD"/>
<meta name="author" content="Nicolas Kaiser"/>
<meta charset="UTF-8"/>
</head>
<body>
<h3>Este es un título</h3>
<p>
Este es un párrafo.<br/>
<table>
<tr>
<th>English</th>
<th>Español</th>
</tr>
<tr>
<td>title</td>
<td>título</td>
</tr>
<tr>
<td>paragraph</td>
<td>párrafo</td>
</tr>
<tr>
<td>link</td>
<td>enlace</td>
</tr>
</table>
</p>
</body>
</html>
3. una captura de pantalla:
$ xmllint --dtdvalid miniHTML.dtd --noout miniHTML.xml
miniHTML.xml:34: parser error : Opening and ending tag mismatch: p line 12 and body
</body>
^
miniHTML.xml:35: parser error : Opening and ending tag mismatch: body line 10 and html
</html>
^
miniHTML.xml:36: parser error : Premature end of data in tag html line 2
^
$ xmllint --dtdvalid miniHTML.dtd --noout miniHTML.xml
$