我在 .NET 中制作了自定义 xhtml valdidator(通过 dtd + 一些额外规则进行验证),我注意到我的验证和 w3c 验证之间存在差异。
在我的验证器中,当 id 中有冒号时出现以下错误(假设:id="mustang:horse")
(错误)根据其数据类型,“id”属性具有无效值。
但是对于这种模式,我在 w3c 上没有收到任何错误。
我试图在 xml/xhtml 中查找属性的无效字符列表,但找不到?
谢谢您的帮助,
我在 .NET 中制作了自定义 xhtml valdidator(通过 dtd + 一些额外规则进行验证),我注意到我的验证和 w3c 验证之间存在差异。
在我的验证器中,当 id 中有冒号时出现以下错误(假设:id="mustang:horse")
(错误)根据其数据类型,“id”属性具有无效值。
但是对于这种模式,我在 w3c 上没有收到任何错误。
我试图在 xml/xhtml 中查找属性的无效字符列表,但找不到?
谢谢您的帮助,
有一个列表,它确实允许使用冒号。
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)*
并且还在这个正式定义之上说:
鼓励文档作者使用自然语言中有意义的单词或单词组合的名称,并避免名称中的符号或空格字符。请注意,明确允许使用冒号、连字符减号、句号(句点)、下划线(下划线)和中点。
(我的重点)
造成这种差异的原因是 W3C 验证器似乎没有进行命名空间感知的 XHTML 处理。尽管 XHTML 文档需要位于 XHTML 命名空间中,但这实际上是合理的,因为 HTML 文档不使用命名空间,并且 XHTML 文档(如 HTML)的规范有效结构是由 DTD 文件定义的,而 DTD 实际上并不知道命名空间。
就像@Alochi 已经指出的那样:
ID 类型的值必须与 Name 产生式匹配。
当文档被解析为不知道命名空间时,这是正确的,但如果文档需要与命名空间一致,则不是这样。XML 规范中的命名空间规定ID 必须与明确禁止冒号字符的NCName 产品相匹配。命名空间感知解析是一种常见约定,因此不建议在 id 的值中使用冒号,即使在文档解析不是命名空间感知时允许这样做。
总结:如果命名空间被忽略,一个ID
值必须是有效的Name
并且它可以包含一个冒号;否则它必须是有效的NCName
并且不能包含冒号。