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

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

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

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

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


person His    schedule 10.05.2010    source источник
comment
Я могу ошибаться, что это ошибка, но после разрешения %text; у вас есть две вложенные скобки.   -  person Boldewyn    schedule 10.05.2010
comment
Хммм, а наличие двух вложенных круглых скобок в XML DTD является недопустимым? Точно сказать не могу. Но если я удалю #PCDATA из объявления объекта %text;, чтобы он стал <!ENTITY % text "(L)*">, DTD станет действительным.   -  person His    schedule 10.05.2010


Ответы (1)


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

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

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

(#PCDATA | A | B | C)*

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

person jasso    schedule 01.06.2011