处理由w3.org列入黑名单的DTD的好方法

时间:2011-03-30 23:13:08

标签: php xslt w3c dtd

我们使用php建立了一个客户端可以上传svg图形的界面,然后点击按钮进行XSLT转换。

接口和底层的XSLT以前工作得非常好,直到最近,xslt进程总是会失败并返回错误,如:找不到www.w3.org或sth(记不清楚)。

我们的客户使用Adobe Illustrator创建SVG图形,然后使用我们的工具进行转换,直接来自Adobe Illustrator的SVG图形在每个SVG文件的顶部都有以下三行:

<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00       
  Build0)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG   
 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

我们进行了一些研究,我们得出结论,w3.org将我们客户的服务器(Windows Server 2003)列入黑名单。正常的解决方法是做一个解析器。由于客户端只给我们1个小时左右的时间对他们的东西进行远程控制,所以我在想是否有更简单的方法来处理这个问题。

一种建议的方法是我们可以在客户端服务器上放置一个flatfile.dtd,所以每个传入的SVG文件都可以引用它,我们使用php来操作SVG文件,扫描文件直到它找到"<!DOCTYPE.." string,然后用另一个"<!DOCTYPE.."替换整个字符串,其中url现在指向本地flatfile.dtd,保存文件然后开始XSLT进程。然后在翻译之后,我们执行相反的过程,即将dtd url从我们的本地dtd重置为默认的w3.org。

明天我会尝试这样做,我们的演示是星期五。所以我只是在这里寻求一些建议,如果这种方式是现实的并且有任何风险吗?或者,任何专家都可以提供一些更好的替代方案来处理这个问题吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

目前尚不清楚,但我认为你说你只需要一个临时修复来进行演示?如果是这样,为什么不在服务器的主机文件中添加一个条目,该文件将www.w3.org映射到127.0.0.1(localhost)或者你控制的服务器的ip?然后,您可以使用适当的dtd文件填充此服务器的路径。在演示之后,不要忘记删除主机条目,以便所有内容都恢复原状。

关于这一点的好处是您不必操作代码中的DOCTYPE字符串,因为现有的URL将解析为您控制的服务器。

此解决方案假设除了此dtd之外,您不必在www.w3.org上取消引用任何其他资源。您应该能够在运行您的演示的任何服务器上测试它。

答案 1 :(得分:1)

您可以预先处理SVG以完全删除DOCTYPE声明吗? (您能否将SVG视为格式良好而非有效,或者您是否也需要验证SVG?)

我在使用SVG从XSL-FO创建PDF时遇到了问题。如果SVG具有DOCTYPE声明,则处理器将解析声明。我没有收到任何错误,因为它能够解析DOCTYPE,但它是 SLOW 。在运行时剥离DOCTYPE极大地提高了速度。