我在.NET中定制了xhtml valdidator(通过dtd验证了一些额外的规则),我注意到我的验证和w3c验证之间存在差异。
在我的验证器中,当id中有冒号时,我得到以下错误(比方说:id =“mustang:horse”)
(错误)'id'属性根据其数据类型具有无效值。
但是我对w3c没有任何错误。
我试图在xml / xhtml中找到属性的无效字符列表但找不到它?
感谢您的帮助,
答案 0 :(得分: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类型的值必须与名称生成匹配。
名称生成定义为http://www.w3.org/TR/2008/REC-xml-20081126/#NT-Name
[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#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] Name ::= NameStartChar (NameChar)*
并且在上面的正式定义中也说过:
鼓励文档作者使用 名字是有意义的单词或 自然词汇的组合 语言,并避免象征性或 名称中的空格字符。注意 COLON ,HYPHEN-MINUS,完全停止 (句号),LOW LINE(下划线),和 明确允许MIDDLE DOT。
(我的重点)
答案 1 :(得分:1)
这种差异的原因是W3C验证器似乎没有进行名称空间感知的XHTML处理。虽然XHTML文档需要位于XHTML命名空间中,但这实际上是合理的,因为HTML文档不使用命名空间,XHTML文档的规范有效结构(如HTML)由DTD文件定义,而DTD实际上并不支持命名空间。 / p>
就像@Alochi已经注意到的那样:
ID类型的值必须与Name匹配 生产
当文档被解析为不支持名称空间时,这是正确的,但如果文档需要符合名称空间,则不是这样。 XML规范中的命名空间声明IDs must match NCName production明确禁止冒号字符。名称空间感知解析是一种常见的约定,因此,即使在文档解析不支持名称空间时允许使用冒号,也不建议使用冒号。
摘要:如果忽略名称空间,ID
值必须是有效的Name
,并且它可以包含冒号;否则它必须是有效的NCName
,并且不能包含冒号。