冒号是 XML 标记名称中合法的第一个字符吗?

Is a colon a legal first character in an XML tag name?

根据 W3C XML Recommendation,起始标记名定义为:

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

..其中 Name 是:

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

..(n.b., 指出冒号可以作为第一个字符出现) 表明以下是有效的 XML 文档:

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

..但是我在其中尝试的任何解析器都将冒号显示为格式错误。

此外,在附录 B 下(虽然现在是文档的折旧部分)它明确指出:

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

..和:

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

..被我试过的 XML 解析器接受。

那么,冒号是否是标记名称中有效的第一个字符,我使用的解析器是错误的,还是我阅读的规范有误?

是的,在基础 XML 级别,允许冒号 (:) 作为名称的起始字符。你引用的BNF规则明确说明了这一点。

但是,W3C XML Recommendation is clear 除了命名空间之外,不应使用冒号:

Note:

The Namespaces in XML Recommendation [XML Names] assigns a meaning to names containing colon characters. Therefore, authors should not use the colon in XML names except for namespace purposes, but XML processors must accept the colon as a name character.

XML Namespace BNF rules for tags are based on QName,它允许名称中的冒号仅作为 PrefixLocalPart 之间的分隔符:

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 of the W3C XML Recommendation had a definition of STag which did not allow colon:

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

到 1998 年,Name

中允许使用冒号
Name  ::= (Letter | '_' | ':') (NameChar)*

和关于冒号使用的警告 earlier form

Note: The colon character within XML names is reserved for experimentation with name spaces. Its meaning is expected to be standardized at some future point, at which point those documents using the colon for experimental purposes may need to be updated. (There is no guarantee that any name-space mechanism adopted for XML will in fact use the colon as a name-space delimiter.) In practice, this means that authors should not use the colon in XML names except as part of name-space experiments, but that XML processors should accept the colon as a name character.

这种需求是预料之中的,但在第一次将冒号引入标记名称时,可能还不知道确切的形式。

它们在非命名空间感知 XML 中是允许的,但在命名空间感知 XML 中是不允许的。更具体地说,基础 XML 建议允许它们,但命名空间建议禁止它们。现在很少有人使用非名称空间感知 XML(而且我不确定哪些解析器支持它)所以最好假设它们是不允许的。