2011-03-30 29 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