Это валидный документ, но утилита xmllint его не пропустит с ошибкой: model offer is not determenist. Это из-за name, который встречается в нескольких альтернативных вариантах схемы. Насколько я понял (может я ошибаюсь) это особенность libxml. Можно ли программно в php отвалидировать xml без DOMDocument::validate() и libxmgeterrors ?
<!DOCTYPE offers [
<!ELEMENT offers (offer+)>
<!ELEMENT offer ((name, cost) | (id?, name, tag, desc?) | (prefix, title, desc?))>
<!ELEMENT name (#PCDATA)>
<!ELEMENT cost (#PCDATA)>
<!ELEMENT tag (#PCDATA)>
<!ELEMENT desc (#PCDATA)>
<!ELEMENT prefix (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT id (#PCDATA)>
] >
<offers>
<offer>
<name>Name1</name>
<cost>123</cost>
</offer>
<offer>
<id>123</id>
<name>Name2</name>
<tag>sale</tag>
<desc>Some Description</desc>
</offer>
<offer>
<prefix>Book</prefix>
<title>Little Pony</title>
</offer>
</offers>