После объявления ATTLIST в браузере DTD отображается пользовательский символ

Я объявил rel="value" атрибут для <li> элемент в DTD, как это:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" [<!ATTLIST li rel CDATA #IMPLIED>]>

После этого мой код с <li rel="value"></li> был действителен, но я получил другого эмитента: браузер рендерит "]>" символ в документе.

Как это исправить?

3 ответа

Решение

Вы не должны использовать внутреннее подмножество в объявлении типа документа, потому что браузеры не понимают его или DTD вообще.

Если по какой-то причине вы используете простой добавленный атрибут, часто лучше просто быть достаточно осторожным с ним или "проверить его вручную". Но для выполнения проверки на основе DTD вам необходимо создать внешнее DTD на основе DTD, который вы хотите использовать в качестве основы, и с добавленной в него дополнительной разметкой. В этом случае вы должны скопировать HTML 4.01 Transitional DTD и заменить

<!ATTLIST LI
  %attrs;>

от

<!ATTLIST LI
  rel CDATA #IMPLIED
  %attrs;>

(То есть вам нужно предоставить полный список разрешенных атрибутов с добавленным вашим пользовательским атрибутом вместо того, чтобы объявлять список атрибутов, который разрешает только ваш атрибут [если это не то, что вы действительно хотите].)

Затем вы должны использовать объявление doctype, которое ссылается на вашу измененную копию по ее URL, с

<!DOCTYPE HTML SYSTEM "dtdurl">

где dtdurl - абсолютный URL для DTD. Дополнительная информация: Создание собственного DTD для проверки HTML.

Как правило, нежелательно добавлять собственные атрибуты, так как они могут конфликтовать с атрибутами, которые могут быть добавлены в HTML в некоторых будущих версиях. Согласно чертежам HTML5, атрибуты с именами начинаются с data- предназначены для конкретного сайта и никогда не будут иметь публично определенного значения, поэтому data-rel будет безопаснее, чем rel,

Браузеры не понимают встроенный SGML. Они просто перестают читать Doctype с первого раза > персонаж. Таким образом, они видят следующее ]> как текст, который будет представлен.

Только не используйте встроенный SGML.

Используйте псевдоатрибут & gt; разделитель вместо буквального > разделителя для выхода из вложенного > в ]>:

<!DOCTYPE HTML PUBLIC 
"-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd" 
[<!ATTLIST li rel CDATA #IMPLIED&gt;]>

Рекомендации

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