2011-03-30 30 views
0

我们使用php构建了一个客户端可以上传svg graphic的界面,然后单击该按钮进行XSLT转换。处理DTD被w3.org列入黑名单的好方法

接口和基础XSLT以前工作得非常好,直到最近,xslt过程总是会失败并返回如下错误:无法找到www.w3.org或者某事(记不清楚)。

我们的客户使用Adobe Illustrator中创建SVG图形,然后使用我们的工具进行转换,以及SVG图形可以直接来到Adobe Illustrator中的出了以下每个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.."字符串,然后用另一个"<!DOCTYPE.."替换整个字符串,其中url现在指向本地flatfile.dtd,保存该文件,然后开始XSLT过程。然后在翻译之后,我们执行相反的过程,即将dtd url从我们的本地dtd重置为默认的w3.org之一。

明天我会试试,我们的演示是在星期五。所以我只是在这里寻求一些建议,如果这种方法是真实的并且有任何风险?或者,任何专家能否提供一些更好的选择来处理这个问题?

在此先感谢。

+0

你需要加载DTD吗?你可能只是略过。 – Wrikken 2011-03-30 23:28:15

+0

你在使用XSLT处理什么?我怀疑目录是正确的答案,但并不是所有的工具都支持它们。 – 2011-03-31 08:07:42

+0

W3C没有专门列入黑名单 - 它拒绝了这些常用DTD的所有请求。他们根本无法应付交通。他们应该在十年前想到这一点,但他们只是认为网络上存在如此多的缓存以至于它不会成为问题。我不确定您的黑客重定向到本地副本的方法比使用实体解析器“正确”执行更好。 – 2011-03-31 08:26:59

回答

2

目前还不清楚,但我想你只是说你只需要一个临时修补程序用于演示的目的?如果是这样,为什么不添加一个条目到服务器的主机文件中,该文件将www.w3.org映射到127.0.0.1(本地主机)或您所控制的服务器的IP?然后,您可以使用适当的dtd文件填充此服务器的路径。演示之后,不要忘记删除主机条目,以便一切恢复原样。

这样做的好处在于,您不必在代码中操作DOCTYPE字符串,因为现有url将解析为您控制的服务器。

此解决方案假设您不必在www.d3.org上除此dtd之外的其他资源的取消引用。你应该可以在任何运行你的演示的服务器上进行测试。

+0

非常感谢。我已经在我的本地主机服务器上测试过了,它工作正常。但是我想知道Windows Server 2003的主机文件在哪里,并且修改主机文件会有与我的本地服务器相同的效果? – Kevin 2011-03-31 08:06:27

+0

@Robert:我相信主机在Windows中的%SytemRoot%。 [wikipedia条目](http://en.wikipedia.org/wiki/Hosts_%28file%29)很有帮助。 – stand 2011-03-31 14:46:28

1

您是否可以预处理SVG以完全删除DOCTYPE声明? (您可以将SVG视为格式合适而不是有效的,还是需要验证SVG吗?)

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

+0

你的意思是在我的php代码中删除DOCTYPE声明? – Kevin 2011-03-31 01:17:46

+0

我的意思是从SVG本身中删除DOCTYPE声明。除非需要验证SVG,否则不需要它。 – 2011-03-31 02:49:10