Das Problem liegt wohl in der Verarbeitung der letzten Verschachtelungsebene:
IsSelfClosing := (Length(Node.Text) = 0) and (Node.ChildNodes.Count = 0)
Das ergibt immer true, da auf Node.Text abgefragt wird - der ist ja bei einem schließenden Tag in dem Fall immer leer. Es sollte zusätzlich Node.Parent.Text überprüft werden um das Flag zu setzen.
Nee, Isselfclosing fragt sowas ab:
<nixdrin/>
oder <nixdrin></nixdrin>
das ist unabhängig vom Parent Text