带有'usemap'属性的'nxml-mode'验证错误

时间:2014-09-09 15:31:31

标签: xml validation emacs xhtml relaxng

在我的 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>

1 个答案:

答案 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:

  

usemap = uri [CT]

此外,HTMLHelp.com上的HTML 4.01 documentation for the IMG tag说:

  

USEMAP 属性用于客户端图像映射以提供   地图定义的位置。虽然此值可能是完整    URI - 允许将单个地图定义应用于多个   页面 - 许多浏览器只会在同一个文件中找到地图定义,   有效地将 USEMAP 值限制为片段标识符,例如   的&#34;#地图&#34;

最后,请注意问题this answer<img usemap=url>中包含{{1}}。