Почему это не допустимый XML DTD? (Параметр объекта и #PCDATA)

Используя здесь валидатор DTD, мне сообщили, что следующий DTD недействителен.

<!ENTITY % text "(#PCDATA|L)*">
<!ELEMENT H         (%text;)+>
<!ELEMENT L         (#PCDATA)>

Сообщение об ошибке: "A" ('символ или тип элемента требуется в объявлении типа элемента "H"."В строке 2, столбец 22.

Кто-нибудь может указать, почему это недействительно? И как я могу сделать это действительным? Сообщение об ошибке не совсем дружелюбно для меня. Благодарю.

1 ответ

Решение

Вы не можете принудительно установить, что элемент со смешанным содержимым должен иметь хотя бы один дочерний узел. Ваш DTD становится

<!ELEMENT H         ((#PCDATA|L)*)+>

когда сущность расширяется. Единственная разрешенная форма для элементов со смешанным содержимым

(#PCDATA | A | B | C)*

где A, B и C являются возможными дочерними элементами. #PCDATA должен быть первым выбором, и набор должен иметь возможность повторяться 0-бесконечность раз, т.е. требуется звездочка.

Другие вопросы по тегам