Почему Цзин не допускает двоеточие (":") в атрибуте 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-схемой, будет действительным по отношению к базовому определению, но не обязательно наоборот.

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