Расширение XHTML DTD для использования специальных символов в атрибутах ID - PullRequest
4 голосов
/ 24 сентября 2011

Я хочу проверить шаблоны XML, которые являются расширением XHTML. Теперь в атрибутах идентификатора есть специальные символы, такие как { и |. Можно ли расширить DTD XHTML, чтобы перезаписать ограничение на символы, разрешенные в атрибуте ID? Или символы определены в спецификации XML?

1 Ответ

5 голосов
/ 24 сентября 2011

Вы не можете использовать символы '{' и '|' непосредственно в атрибутах id, потому что в спецификации XML написано

Значения типа ID должны совпадать с именем производства. Имя не должно появляться более одного раза в документе XML как значение этого типа; то есть значения идентификаторов должны однозначно идентифицировать элементы, которые их несут.

Название производства здесь . Если вы развернете правило синтаксиса, вы увидите, что единственные символы, разрешенные в имени, задаются этими продукциями:

[4] NameStartChar :: = ":" | [A-Z] | "_" | [a-z] | [# xC0- # xD6] | [# xD8- # xF6] | [# xF8- # x2FF] | [# x370- # x37D] | [# x37F- # x1FFF] | [# x200C- # x200D] | [# x2070- # x218F] | [# x2C00- # x2FEF] | [# x3001- # xD7FF] | [# xF900- # xFDCF] | [# xFDF0- # xFFFD] | [# X10000- # xEFFFF]

[4a] NameChar :: = NameStartChar | "-" | "" | [0-9] | # xB7 | [# x0300- # x036F] | [# X203F- # x2040]

К сожалению, левая скоба и труба не допускаются. Кодовые точки для этих символов # 7B и # 7C соответственно; не в допустимых диапазонах символов.

TL; DR: допустимые символы для атрибутов ID принадлежат спецификации XML, а два ваших символа недопустимы.

ДОПОЛНЕНИЕ

Вот несколько примеров. Следующий документ проходит проверку для XHTML на сайте проверки W3C:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
  <head>
    <title>A title</title>
  </head>
  <body id="anid">
  </body>
</html>

но следующее не будет

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
  <head>
    <title>A title</title>
  </head>
  <body id="ani{d">
  </body>
</html>

Получаем ошибку:

Line 8, Column 16: character "{" is not allowed in the value of attribute "id"

Теперь довольно интересно, что если вам действительно нужна левая фигурная скобка в имени идентификатора, вы можете попробовать вот это:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
  <head>
    <title>A title</title>
  </head>
  <body id="ani&#x7B;d">
  </body>
</html>

Но вы получаете такую ​​же ошибку! Вы можете попробовать это; Валидатор показывает строку с хэшом амперсанда x семь b точка с запятой, но считает, что там есть левая скобка.

Суть в том, что вы просто не можете иметь идентификаторы с символами, отличными от тех, которые разрешены спецификацией XML.

...