Почему Цзин не допускает двоеточие (":") в атрибуте id?
Я бился головой о xsd:ID, не допуская двоеточие (":") в атрибуте id. Я впервые заметил это при использовании nxml-режима Джеймса Кларка в Emacs, поскольку он проверял файл XHTML, с которым я работал. Затем я запустил файл XHTML для RNG (предоставляется с nxml-mode-20041004), используя Jing, и получил следующие ошибки:
error: value of attribute "id" is invalid; must be an XML name without colons
Большинство страниц W3, которые я видел, указывают, что двоеточие допустимо. Затем я нашел это, http://www.w3.org/XML/xml-19980210-errata, которое я имею в виду: "Вы не должны использовать двоеточие в атрибуте id, но вам следует разрешить ". Учитывая эту интерпретацию, я озадачен, почему Цзин говорит, что не могу.
Спасибо,
Zachary
1 ответ
Вы смотрите на два тонко разных определения здесь. xsd:ID определяется в терминах типа NCName в пространствах имен в XML 1.0, а тип идентификатора базового стандарта XML определяется в терминах типа Name. Оба имеют следующее определение:
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]
NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 |
[#x0300-#x036F] | [#x203F-#x2040]
Name ::= NameStartChar (NameChar)*
NCName определяется как:
NCName ::= Name - (Char* ':' Char*)
имя которого минус двоеточие
Результатом этого является то, что с точки зрения самого XML значение чего-либо, напечатанного как ID, может содержать двоеточие. С точки зрения всего, что использует типы данных XML-схемы (например, вашу схему RelaxNG), существует более ограниченный тип данных, который запрещает использование двоеточия. Все, что использует атрибут, совместимый с XML-схемой, будет действительным по отношению к базовому определению, но не обязательно наоборот.