在SVG中插入favicon链接标记的正确方法

时间:2014-01-21 11:01:02

标签: xml svg w3c-validation

插入指向favicon的链接标记的正确方法是什么? 我尝试了以下内容,但W3C Validator报告元素“xhtml:link”未定义

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <title>De mægtige vikinger</title>
  <defs>
    <xhtml:link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
  </defs>
</svg>

2 个答案:

答案 0 :(得分:1)

来自An XHTML + MathML + SVG Profile Specification

  

MathML上只允许MathML和XLink名称空间声明   无法声明元素和XHTML或SVG名称空间。

所以从本质上讲,@ErikDahlström对于新的验证配置文件是正确的。但是,公共领域中的一个已经存在。 http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd 它缺少XLINK定义,但我们可以轻松添加它。

解决方案相当冗长,但这就是XML的本质。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC
    "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
    "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"[
<!ENTITY % XLINK.xmlns "http://www.w3.org/1999/xlink" >
<!ENTITY % SVG.prefixed "IGNORE" >
<!ENTITY % XHTML.prefixed "INCLUDE" >
<!ENTITY % XHTML.prefix "xhtml" >
<!ENTITY % MATHML.module "IGNORE" >
]>
<svg version="1.1" id="denmark" viewBox="0 0 1280 800" preserveAspectRatio="xMidYMid slice"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <title>De mægtige vikinger</title>
  <switch>
    <foreignObject width="0" height="0">
      <xhtml:link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
     </foreignObject>
  </switch>
  <script type="application/ecmascript" xlink:href="js/lib/svg.js"></script>
</svg>

以上内容将在W3C Validator中验证。 最终更新: W3C Validator实际上验证上述内容,因为它表示xmlns属性不存在。如果未设置SVG,则没有浏览器会呈现SVG,因此它显然是W3C Validator中的错误。

注释

由于我找不到没有MathML的DTD,而且我不需要它,我只是选择忽略它。因此:<!ENTITY % MATHML.module "IGNORE" >

我用xhtml + math + svg找到的dtd没有XLink(我们需要能够添加脚本),所以它包含在:<!ENTITY % XLINK.xmlns "http://www.w3.org/1999/xlink" >

使用Firefox,Safari时,favicon正在运行。它从未在IE中工作,但我怀疑图形设计师使用的是png而不是位图。在Chrome和Safari上,仅在本地未提供时才有效。

以下是临时示例:http://www.demægtigevikinger.dk/prototype/v0.5/ - 网站不再在线

答案 1 :(得分:0)

验证器本身并没有错,因为你拥有的不是纯svg,它是svg加上一些xhtml而验证器没有这样的配置。我看到它的方式有两种选择:

  1. 接受这就是浏览器现在的情况,并为此用例创建一个新的验证配置文件/自定义DTD。
  2. 通过更改标记并删除xml标题并设置<!DOCTYPE html>,将svg作为html5传递出去。然后你可以像往常一样把链接放在头部。请注意,这可能意味着您将无法将该文件作为svg引用(因为它是html),因此请务必在您定位的所有浏览器中进行测试。