我正在使用 HTML Tidy(版本 5.8.0)来清理源自 Web 的 HTML,以便使用 XSLT 进行转换。 这通常工作得很好,直到我发现一个页面,其中 2 个
<use/>
元素具有相同的重复 xmlns:xlink 定义。
示例.html:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<svg>
<use xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#gel-icon-search" href="#gel-icon-search" role="presentation"/>
</svg>
<svg>
<use xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#gel-icon-no" href="#gel-icon-no" role="presentation"/>
</svg>
</body>
</html>
当通过 HTML Tidy 运行时,这不会被注意到:
$ tidy --output-xhtml 1 example.html > /dev/null
Info: Document content looks like XHTML 1.0 Transitional
No warnings or errors were found.
但由于同样的原因,它严重地导致了我的 XSLT 处理器和 xmllint 的故障:
$ xmllint example.html
example.html:8: parser error : Attribute xmlns:xlink redefined
:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
^
example.html:11: parser error : Attribute xmlns:xlink redefined
:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
^
我希望 HTML Tidy 能够规范化重复的
xmlns:xlink...
属性,就像处理普通属性一样(它保留第一个或最后一个)。
用
xmlns:xlink...
删除重复的 sed
很简单,但它仍然是双重处理。
我只是错过了正确的 Tidy 选项吗?
以下选项没有区别:
--output-xml 1
--drop-proprietary-attributes 1
--doctype strict
--strict-tags-attributes 1
--repeated-attributes keep-first
我怀疑这是Tidy中的一个错误,如果没有简单的解释,我会提交它。
使用
xmllint --recover
将显示警告,但会去除双重属性(比使用 sed
更好的选择)。
xmllint --recover ~/tmp/test.html
结果
/home/lmc/tmp/test.html:8: parser error : Attribute xmlns:xlink redefined
:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
^
/home/lmc/tmp/test.html:11: parser error : Attribute xmlns:xlink redefined
:xlink="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink"
^
<?xml version="1.0"?>
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<svg>
<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#gel-icon-search" href="#gel-icon-search" role="presentation"/>
</svg>
<svg>
<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#gel-icon-no" href="#gel-icon-no" role="presentation"/>
</svg>
</body>
</html>
警告发送至 stderr,以便可以从输出中删除
xmllint --recover ~/tmp/test.html 2>/dev/null