Почему я получаю «без имени для атрибута», когда я проверяю свой XML-файл с DTD? - PullRequest
1 голос
/ 05 апреля 2019

Я хочу установить объект параметра для объявления атрибутов, общих для нескольких элементов.

Я пытаюсь сделать так, чтобы элемент "elem" имел атрибут "width CDATA" 0 ". После того, как я это сделаю, я бы использовал его для большего количества элементов.

Вот код, который я придумал:

<?xml version="1.0"?>
<!DOCTYPE example [
    <!ENTITY % attrs 'width   CDATA   "0"'>

    <!ELEMENT example (elem) >
    <!ELEMENT elem (#PCDATA) >
    <!ATTLIST elem %attrs; > <!-- <This errors with "no name for attribute" -->
]>

<example>
    <elem width="20">Hi how are you</elem>
</example>

Код, который я использую, основан на принятом ответе на аналогичный вопрос ( Как объявить атрибуты, общие для нескольких элементов? ). Однако, когда я запускаю свой код через валидаторы XML (Exalt on SublimeText или xmlvalidation.com , он ошибается.

На сайте, указанном выше, ошибка:
The attribute name must be specified in the attribute-list declaration for element "elem1".

В Exalt ошибка:
ATTLIST: no name for Attribute at [...]

Что я понимаю, так это отсутствие имени атрибута. Но я поставил имя атрибута на объекте параметра, так как его нельзя обнаружить?

Если я заменю% attrs; с 'width CDATA "0"', он работает нормально.

Почему я получаю ошибку?

1 Ответ

1 голос
/ 05 апреля 2019

Это связано с ограничениями на сущности параметров во внутреннем подмножестве.

Одним из ограничений является то, что ссылки на сущности параметров нельзя использовать в объявлениях разметки.

Fromспецификация :

Ограничение правильной формы: PE во внутреннем подмножестве

Во внутреннем подмножестве DTD ссылки на объект-параметр не должны встречаться в пределахдекларации разметки;они могут возникать там, где могут появляться объявления разметки.(Это не относится к ссылкам, которые встречаются во внешних объектах параметров или во внешнем подмножестве.)

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

...