2016-11-06 9 views
2

Согласно W3C XML Recommendation, открывающий тег-имена имеют определение:Является ли двоеточие законным первым символом в имени тега XML?

STag ::= '<' Name (S Attribute)* S? '>' 

..where Name является:

Name ::= NameStartChar (NameChar)* 
NameStartChar ::= ":" | [A-Z] | ... 

.. (нб, утверждает, что двоеточие может появиться в качестве первого символа) предполагая следующее является действительным документом XML:

<?xml version="1.0" ?><:doc></:doc> 

..но любой парсер я стараюсь это в показывает двоеточие как форматирование Erro р.

Кроме того, в соответствии с Приложениями B (хотя ныне остаточную часть документа) она прямо говорится:

Characters ':' and '_' are allowed as name-start characters. 

..и:

<?xml version="1.0" ?><_doc></_doc> 

..is, принятые в XML-анализаторами I «Пробовал.

Итак, это двоеточие действительного первого символа в имени тега, и используемые мной парсеры ошибочны, или я неправильно читаю спецификацию?

ответ

3

Да, на базовом уровне XML, двоеточие (:) разрешено в качестве символа начала имени. Правила BNF, которые вы цитируете, четко указывают на это.

Однако W3C XML Recommendation is clear, что колоны не следует использовать для пространств имен целей, за исключением:

Примечание:

В Пространства имен в XML Рекомендации [XML Names] присваивает значение для имен, содержащих символы двоеточия. Поэтому авторы не должны использовать двоеточие в именах XML, кроме целей пространства имен, , но XML-процессоры должны принимать двоеточие в качестве символа имени.

И XML Namespace BNF правила для тегов основаны на QName, которые допускают двоеточия в имени только как разделение между Prefix и LocalPart:

QName   ::= PrefixedName | UnprefixedName 
PrefixedName ::= Prefix ':' LocalPart 
UnprefixedName ::= LocalPart 
Prefix   ::= NCName 
LocalPart  ::= NCName 
NCName   ::= Name - (Char* ':' Char*) /* An XML Name, minus the ":" */ 

Можно было бы спросить, почему толстой кишки не был отменен в NameStartChar с самого начала. Если нам повезет, то C. M. Sperberg-McQueen может предложить авторитетное объяснение. Тем не менее, я подозреваю, что это вопрос эволюционного представления о том, как предполагается, что пространства имен будут разработаны.

first published working draft in 1996 в W3C XML Рекомендации было определение STag который did not allow colon:

STag ::= '<' Name (S Attribute)* S? '>' 
Name ::= (Letter | '-') (Letter | Digit | '-' | '.')* 

К 1998 году колоны были разрешены в Name,

Name ::= (Letter | '_' | ':') (NameChar)* 

и earlier form из предостережения об использовании толстой кишки следующим образом:

Примечание: Двоеточия в именах XML зарезервирован для экспериментирования с пространствами имен. Ожидается, что его значение будет , стандартизованное в какой-то будущей точке, после чего эти документы с использованием двоеточия для экспериментальных целей, возможно, потребуется обновить. (Нет гарантии, что какой-либо механизм пространства имен, принятый для XML , фактически будет использовать двоеточие в качестве разделителя пространства имен.) На практике означает, что авторы не должны использовать двоеточие в именах XML, кроме , как часть экспериментов с именами, но что процессоры XML должны принять двоеточие как символ имени.

Потребность была ожидаема, но точная форма, возможно, еще не была известна, когда двоеточие было впервые введено в имена тегов.

1

Они разрешены в XML, отличном от пространства имен, но они не допускаются в XML с пространством имен. Более конкретно, базовая XML-рекомендация позволяет им, но рекомендация Namespaces запрещает их. Очень немногие люди в настоящее время используют XML, не поддерживающий пространство имен (и я не уверен, что его поддерживают парсеры), поэтому лучше предположить, что они недопустимы.