Кстати, вопрос из любопытства (сам не знаю, но может кто разбирался и в курсе).
Если мы работаем с XML, то имеем чётко структурированную информацию, которая "парсится" в дерево элементов, обладающих значениями.
В случае HTML информация не настолько чётко структурирована, поскольку текст, например, может содержать внутри себя "плавающие" в нём элементы, типа:
<p>Это <em>слово</em> выделено.</p>
Просто так в дерево p/em это не преобразуется, поскольку непонятно, в какой позиции текста элемента p находится элемент em.
Как поступают в таких случаях?
Может добавляют неявные элементы? Типа:
<p><normal>Это</normal><em>слово</em><normal>выделено.</normal></p>
Тогда появляется чёткое дерево p/(normal,em,normal).