HTML Tidy未清理重复xmlns:xlink属性,致XSLT处理器报错求解决
HTML Tidy 5.8.0未处理重复xmlns:xlink属性导致XSLT/xmllint报错
问题背景
用HTML Tidy 5.8.0清理网页HTML用于后续XSLT转换,多数场景下处理正常,但遇到页面中的<use/>元素存在重复的相同xmlns:xlink定义时,Tidy处理后既无警告也无错误,输出内容却会触发XSLT处理器和xmllint报错:Attribute xmlns:xlink redefined。
已尝试的无效配置
试过以下Tidy参数,均无法解决问题:
--output-xml 1--drop-proprietary-attributes 1
需求
希望Tidy能像处理普通重复属性那样,对重复的xmlns:xlink属性做归一化处理(保留首个或最后一个实例),需确认是遗漏了正确配置,还是这属于Tidy的bug。
分析与结论
- 命名空间属性的特殊性:
xmlns:*属于XML命名空间声明,不属于普通HTML属性,Tidy的常规重复属性清理逻辑未覆盖这类特殊属性。Tidy的核心定位是HTML修复,对XML规范的严格性支持可能存在缺失。 - 是否为bug:根据XML规范,同一元素上重复声明相同命名空间属于非法结构,Tidy作为支持输出XML的工具,未对这种情况做处理或提示,大概率属于功能缺陷(bug)。
临时解决方案
- 预处理正则替换:在交给Tidy处理前,用正则移除重复的
xmlns:xlink属性,例如:import re # 保留第一个xmlns:xlink声明,移除后续重复项 cleaned_html = re.sub(r'(<use[^>]+?xmlns:xlink="[^"]+")(.*?)xmlns:xlink="[^"]+"', r'\1\2', raw_html) - 后处理XML解析:Tidy处理完成后,用支持XML规范的解析器(如Python的
lxml)加载输出内容,解析器会自动合并重复的命名空间声明:from lxml import etree tidy_output = ... # Tidy处理后的内容 root = etree.fromstring(tidy_output.encode('utf-8')) fixed_html = etree.tostring(root, encoding='unicode')
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

