Почему это не допустимый XML DTD? (Параметр объекта и #PCDATA) - PullRequest
3 голосов
/ 10 мая 2010

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

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

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

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

1 Ответ

8 голосов
/ 01 июня 2011

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

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

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

(#PCDATA | A | B | C)*

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

...