是的,在基本 XML 级别,冒号 (:
) 允许作为名称起始字符。您引用的 BNF 规则清楚地说明了这一点。
但是,那W3C XML 推荐标准很明确 https://www.w3.org/TR/2008/REC-xml-20081126/#sec-common-syn除命名空间用途外,不应使用冒号:
Note:
XML 推荐中的命名空间[XML 名称] https://www.w3.org/TR/2008/REC-xml-20081126/#xml-names分配一个
含义包含冒号字符的名称。因此,作者
除命名空间用途外,不应在 XML 名称中使用冒号,
但 XML 处理器必须接受冒号作为名称字符。
And the XML命名空间 https://www.w3.org/TR/xml-names/标签的 BNF 规则基于QName https://www.w3.org/TR/xml-names/#NT-QName,它允许名称中的冒号仅作为分隔符Prefix
and 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 可能会提供权威的解释。然而,我怀疑这是一个关于命名空间如何设计的概念不断发展的问题。
The 1996年首次发布工作草案 https://www.w3.org/TR/WD-xml-961114W3C XML 建议书的定义是STag https://www.w3.org/TR/WD-xml-961114#sec3.1 which 不允许冒号 https://www.w3.org/TR/WD-xml-961114#NT-Name:
STag ::= '<' Name (S Attribute)* S? '>'
Name ::= (Letter | '-') (Letter | Digit | '-' | '.')*
到 1998 年,冒号被允许使用Name https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name,
Name ::= (Letter | '_' | ':') (NameChar)*
and an 早期形式 https://www.w3.org/TR/1998/REC-xml-19980210#sec-common-syn关于冒号使用的警告如下:
Note:XML 名称中的冒号字符保留用于名称空间实验。其含义预计为
在未来的某个时刻标准化,届时这些文件
使用冒号进行实验可能需要更新。
(不保证 XML 采用的任何命名空间机制
实际上将使用冒号作为名称空间分隔符。)在实践中,
这意味着作者不应在 XML 名称中使用冒号,除非
作为名称空间实验的一部分,但 XML 处理器应该
接受冒号作为名称字符。
当冒号首次被引入标签名称时,这种需求是预料到的,但确切的形式可能还不知道。