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

2024-01-08

根据W3C XML 推荐标准 https://www.w3.org/TR/2008/REC-xml-20081126/#sec-starttags,起始标记名称的定义为:

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

..where Name is:

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

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

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

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

此外,在附录 B(尽管现在已成为文档的贬值部分)下明确指出:

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

..and:

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

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

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


是的,在基本 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 处理器应该 接受冒号作为名称字符。

当冒号首次被引入标签名称时,这种需求是预料到的,但确切的形式可能还不知道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐