在我的 XHTML 文档中, nxml-mode (通过其包含的XHTML Relax NG紧凑架构)标记usemap
属性的值错误Attribute value invalid
。
<img src="sample_image.png"
usemap="#sample_image_map"
alt="Sample Image"
border="0" />
问题似乎是#
属性值中存在前导usemap
字符。如果我删除#
字符, nxml-mode 表示该值有效。但是#
字符的前导usemap
字符通常是预期的,它通常用于引用文件中其他位置的map
定义。
nxml-mode 是否错误地提出了usemap
的值的验证错误?
(请注意,我使用的是 Emacs 24.2.1 以及 nxml-mode 的版本。)
以下是一个完整的XHTML示例,该示例在the W3C validator验证:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>nxml-mode Validation Problem</title>
</head>
<body>
<!-- The '#' is OK here. -->
<a href="#sample_link">Sample Link</a>
<map id="sample_image_map">
<area shape="poly" coords="100,0, 200,0, 200,50, 100,50"
alt="Sample Area"/>
</map>
<!--
* For the value of the 'usemap' attribute, 'nxml-mode'
* issues the error 'Attribute value invalid'.
*
* However, if the '#' is removed from the value
* '#sample_image_map', 'nxml-mode' indicates the value
* is valid.
-->
<img src="sample_image.png"
usemap="#sample_image_map"
alt="Sample Image"
border="0" />
</body>
</html>
答案 0 :(得分:1)
[这是我研究的结果......当然欢迎其他答案。]
在我看来, nxml-mode 可能会错误地将usemap
属性映射到IDREF
。以下是 etc / schemas / xhtml-csismap.rnc (Relax NG紧凑模式文件)中usemap
的定义:
usemap.attlist = attribute usemap { IDREF.datatype }?
当我将定义更改为将usemap
映射到URI
时, nxml-mode 很高兴:
usemap.attlist = attribute usemap { URI.datatype }?
现在,这是合法的变更吗?
根据维基百科,XHTML derives from HTML 4.01。我在XHTML 1.0 standard中找不到usemap
的具体指导。但是,the HTML 4.01 standard确实表明usemap
属性是URI:
此外,HTMLHelp.com上的HTML 4.01 documentation for the IMG
tag说:
USEMAP 属性用于客户端图像映射以提供 地图定义的位置。虽然此值可能是完整 URI - 允许将单个地图定义应用于多个 页面 - 许多浏览器只会在同一个文件中找到地图定义, 有效地将 USEMAP 值限制为片段标识符,例如 的&#34;#地图&#34; 强>
最后,请注意问题this answer中<img usemap=url>
中包含{{1}}。