如何消除xmllint校验SVG时<a>元素xlink:href属性缺失警告?
问题描述
使用dot生成的SVG文件(bb.svg)内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "https://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="780pt" height="27pt" viewBox="0.00 0.00 780.00 27.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 23)"> <title>A fie</title> <!-- Node1c --> <g id="Node000001c" class="node"> <title>Node1c</title> <g id="a_Node000001c"> <a xlink:title="tooltip but no href"> <polygon fill="white" stroke="#666666" points="372.5,-19 262.5,-19 262.5,0 372.5,0 372.5,-19"/> <text text-anchor="middle" x="317.5" y="-7" font-family="Helvetica,sans-Serif" font-size="10.00">1c Set tooltip,no URL</text> </a> </g> </g> </g> </svg>
使用本地DTD文件(存放于tmp_dtd目录)执行xmllint校验命令:
xmllint --path tmp_dtd --noout --nonet --postvalid bb.svg
收到如下校验错误:
bb.svg:12: element a: validity error : Element a does not carry attribute xlink:href
解决方法
有三种方式可以处理该错误:
1. 修改SVG文件以符合DTD要求
SVG 1.1的DTD规定<a>元素必须携带xlink:href属性。给<a>标签添加一个不触发跳转的合法href即可,示例:
<a xlink:href="javascript:void(0)" xlink:title="tooltip but no href">
这样既满足DTD校验规则,又不会影响tooltip显示和页面行为。
2. 过滤xmllint的错误输出
若不想修改SVG文件,可通过shell命令过滤掉这条特定错误信息,调整后的命令如下:
xmllint --path tmp_dtd --noout --nonet --postvalid bb.svg 2>&1 | grep -v "Element a does not carry attribute xlink:href"
该命令将错误输出重定向到标准输出后,通过grep -v排除指定的错误行。
3. 修改本地DTD文件(不推荐)
若有权限修改本地svg11.dtd文件,可找到<a>元素的定义部分,将xlink:href属性从必填改为可选。但这种方法会破坏DTD的标准一致性,可能引发其他校验问题,不建议使用。
内容的提问来源于stack exchange,提问作者albert
相关产品推荐
相关产品推荐

