You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

分析与结论

  1. 命名空间属性的特殊性:xmlns:*属于XML命名空间声明,不属于普通HTML属性,Tidy的常规重复属性清理逻辑未覆盖这类特殊属性。Tidy的核心定位是HTML修复,对XML规范的严格性支持可能存在缺失。
  2. 是否为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:31:09