2010-02-09 36 views
2

我正在將xslt應用於HTML文件(已經過篩選並將其整理爲可解析爲XML)。應用XSLT時訪問w3.org時出錯

我的代碼如下所示:

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
this.xslt = transformerFactory.newTransformer(xsltSource); 
xslt.transform(sanitizedXHTML, result); 

不過,我收到錯誤的發現這樣的每一個文檔類型:

ERROR: 'Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/html4/loose.dtd '

我沒有問題,從我的瀏覽器訪問的DTD。

我幾乎不能控制被解析的HTML,並且不能翻譯DOCTYPE,因爲我需要它們用於實體。

任何幫助,歡迎。

編輯:

我試圖禁用DTD驗證這樣的:

private Source getSource(StreamSource sanitizedXHTML) throws ParsingException { 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    spf.setNamespaceAware(false); 
    spf.setValidating(false); // Turn off validation 

    XMLReader rdr; 

    try { 
     rdr = spf.newSAXParser().getXMLReader(); 
    } catch (SAXException e) { 
     throw new ParsingException(e); 
    } catch (ParserConfigurationException e) { 
     throw new ParsingException(e); 
    } 

    InputSource inputSrc = new InputSource(sanitizedXHTML.getInputStream()); 
    return new SAXSource(rdr, inputSrc); 
} 

,然後就調用它...

Source source = getSource(sanitizedXHTML); 
    xslt.transform(source, result); 

的錯誤仍然存​​在。

編輯2:

寫了實體解析器,並得到了HTML 4.01過渡DTD我的本地磁盤上。不過,現在我得到這個錯誤:

ERROR: 'The declaration for the entity "HTML.Version" must end with '>'.'

DTD是,從w3.org

回答

2

下載我在answer一些建議,以一個相關的問題。

尤其是,在解析XML文檔時,您可能需要關閉DTD驗證,以防止解析器嘗試獲取DTD。或者,您可以使用自己的實體解析器返回DTD的本地副本,而不是通過網絡獲取它。


編輯:只是呼籲SAX解析器工廠setValidating(false)可能不足以阻止解析器加載外部DTD。解析器可能需要將DTD用於其他目的,例如實體定義。 (也許你可以改變你的HTML衛生/預處理階段,以取代所有的實體引用與等效的數字字符實體引用,消除對DTD的需要?)

我不認爲有一個standard SAX feature flag這將確保外部DTD加載完全禁用,因此您可能必須使用特定於解析器的內容。因此,例如,如果您使用Xerces,則可能需要查找Xerces-specific features,並請撥打setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)來確保。

+0

感謝您的建議,但問題仍然存在。我剛剛編輯顯示我試圖禁用DTD驗證。 – Johnco 2010-02-09 23:43:04

+0

您的編輯做到了! – Johnco 2010-02-11 02:27:38

1

假設您想要加載DTD(對於您的實體),您將需要使用解析器。您遇到的基本問題是W3C出於性能原因限制對DTD的URL的訪問(如果不這樣做,它們不會得到任何性能)。

現在您應該使用DTD的本地副本並使用目錄來處理此問題。你應該看看Apache Commons Resolver。如果您不知道如何使用目錄,那麼它們在Norm Walsh's article

中有詳細記錄。當然,如果您進行驗證,則會出現問題。這是一個SGML DTD,你正試圖將它用於XML。這將無法正常工作(可能)

+0

試過了,從磁盤解析本地DTD時出錯。請檢查我的編輯。 – Johnco 2010-02-10 01:44:08