1

我在 .NET 中制作了自定义 xhtml valdidator(通过 dtd + 一些额外规则进行验证),我注意到我的验证和 w3c 验证之间存在差异。

在我的验证器中,当 id 中有冒号时出现以下错误(假设:id="mustang:horse")

(错误)根据其数据类型,“id”属性具有无效值。

但是对于这种模式,我在 w3c 上没有收到任何错误。

我试图在 xml/xhtml 中查找属性的无效字符列表,但找不到?

谢谢您的帮助,

4

2 回答 2

3

有一个列表,它确实允许使用冒号。

XHTML 1.0 规范在http://www.w3.org/TR/xhtml1/#h-4.10上说

...在 XHTML 1.0 中,id 属性被定义为类型 ID ...

XML 1.0 规范在http://www.w3.org/TR/2008/REC-xml-20081126/#id上说

ID 类型的值必须与 Name 产生式匹配。

名称产生在http://www.w3.org/TR/2008/REC-xml-20081126/#NT-Name

  [4] NameStartChar ::= ":" |
                       [AZ] | "_" | [az] | [#xC0-#xD6] |
                       [#xD8-#xF6] | [#xF8-#x2FF] |
                       [#x370-#x37D] | [#x37F-#x1FFF] |
                       [#x200C-#x200D] | [#x2070-#x218F] |
                       [#x2C00-#x2FEF] | [#x3001-#xD7FF] |
                       [#xF900-#xFDCF] | [#xFDF0-#xFFFD] |
                       [#x10000-#xEFFFF]

  [4a] NameChar ::= NameStartChar | "-" | “。” |
                       [0-9] | #xB7 | [#x0300-#x036F] |
                       [#x203F-#x2040]           

  [5] 名称 ::= NameStartChar (NameChar)*

并且还在这个正式定义之上说:

鼓励文档作者使用自然语言中有意义的单词或单词组合的名称,并避免名称中的符号或空格字符。请注意,明确允许使用冒号、连字符减号、句号(句点)、下划线(下划线)和中点。

(我的重点)

于 2011-06-24T19:54:28.293 回答
1

造成这种差异的原因是 W3C 验证器似乎没有进行命名空间感知的 XHTML 处理。尽管 XHTML 文档需要位于 XHTML 命名空间中,但这实际上是合理的,因为 HTML 文档不使用命名空间,并且 XHTML 文档(如 HTML)的规范有效结构是由 DTD 文件定义的,而 DTD 实际上并不知道命名空间。

就像@Alochi 已经指出的那样:

ID 类型的值必须与 Name 产生式匹配。

当文档被解析为不知道命名空间时,这是正确的,但如果文档需要与命名空间一致,则不是这样。XML 规范中的命名空间规定ID 必须与明确禁止冒号字符的NCName 产品相匹配。命名空间感知解析是一种常见约定,因此不建议在 id 的值中使用冒号,即使在文档解析不是命名空间感知时允许这样做。

总结:如果命名空间被忽略,一个ID值必须是有效的Name并且它可以包含一个冒号;否则它必须是有效的NCName并且不能包含冒号。

于 2011-07-08T14:57:30.780 回答