3

根据W3C XML Recommendation,开始标记名具有以下定义:

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

..哪里Name是:

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

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

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

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

此外,在附录 B 下(尽管现在是文件的贬值部分)它明确指出:

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

..和:

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

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

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

4

2 回答 2

5

是的,在基本 XML 级别,冒号 ( :) 允许作为名称开始字符。您引用的 BNF 规则清楚地说明了这一点。

但是,W3C XML 建议明确指出,除了命名空间之外,不应使用冒号:

笔记:

XML 建议中的命名空间[XML 名称]为包含冒号字符的名称分配了含义。因此,作者不应在 XML 名称中使用冒号,除非是出于命名空间的目的,但 XML 处理器必须接受冒号作为名称字符。

并且标签的XML 命名空间BNF 规则基于QName,它允许名称中的冒号仅作为和之间的分隔PrefixLocalPart

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

NameStartChar有人可能会问,为什么从一开始就不允许冒号。如果我们幸运的话,CM Sperberg-McQueen 可能会提供一个权威的解释。但是,我怀疑这是一个不断发展的关于如何设计命名空间的概念。

1996 年发布的 W3C XML 推荐的第一个工作草案有一个不允许冒号STag定义

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

到 1998 年,冒号被允许在Name,

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

关于冒号使用的早期警告形式如下:

注意: XML 名称中的冒号字符保留用于名称空间的试验。它的含义预计将在未来某个时候标准化,届时可能需要更新那些使用冒号进行实验的文档。(不能保证 XML 采用的任何命名空间机制实际上都会使用冒号作为命名空间分隔符。)实际上,这意味着作者不应在 XML 名称中使用冒号,除非它作为命名空间的一部分实验,但 XML 处理器应该接受冒号作为名称字符。

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

于 2016-11-06T05:02:36.863 回答
2

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

于 2016-11-06T09:30:13.097 回答