2009-10-03 20 views
1

我想要做的是拿一個XML文檔,比如說http://example.org/data.xml,並用一個XSL樣式表應用。 (我不能修改文檔本身並添加指令)Firefox會對外部實體執行XSLT嗎?

因此,有幾個實用的XML文件是這樣的:

wrapper.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE wrapper [ 
    <!ENTITY content SYSTEM "http://example.org/data.xml"> 
]> 
<?xml-stylesheet type="text/xsl" href="unwrap.xsl" ?> 
<wrapper> 
    &content; 
</wrapper> 

unwrap.xsl:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:import href="stylesheet.xsl"/> 

    <xsl:template match="/wrapper/node()[1]"> 
    <xsl:apply-imports/> 
    </xsl:template> 
</xsl:stylesheet> 

所以總結一下:stylesheet.xsl是爲http://example.org/data.xml編寫的,瀏覽器指向wrapper.xml,用戶應該看到transforme d http://example.org/data.xml

這是在IE(和Chrome)中按預期工作但在Firefox中無法正常工作的罕見情況之一。

AFAIK Firefox支持外部XML實體,但看起來它們在XSL代碼中是不可見的。我從2006年發現this article,它在Firefox 1.5中描述了這個問題(我正在使用3.5.3)

有沒有解決這個問題的方法?

回答

1

That XML looks familiar;)

目前,Firefox將不加載外部DTD的和實體引用,因爲服務問題的安全性和拒絕的。例如:http://en.wikipedia.org/wiki/Billion_laughs

有一個開放的Mozilla bug說明原因和有關是否冗長的辯論,以使它的東西,是可配置的:https://bugzilla.mozilla.org/show_bug.cgi?id=22942

There does appear to be one workaround to loading DTDs但我猜這可能對你來說不是一個可行的解決方案

C:\Program Files\Mozilla Firefox\res\dtd\... 

爲Linux目錄:

/**mileage may vary**/MozillaFirefox/lib/res/dtd/ 

一個想法,如果你把它們放在此目錄中的Windows

Firefox將載入本地 DTD文件

以避開使用實體引用: 如果您可以控制wrapper.xml的內容,那麼您可以獲取http://example.org/data.xml(服務器端)的內容,並將其作爲包裝文件的完整內容進行回顯,並添加樣式表處理指令(假設您有一些動態的服務器端功能)。

+0

我也剛剛意識到瀏覽器將不會獲取當前文檔域以外的XML文檔。因此,除非wrapper.xml也在example.org上託管,否則我無法告訴它獲取http://example.org/data.xml。但在這種情況下,我可能會修改數據。xml無論如何;) 這裏的意圖是讓客戶端做所有的工作,服務器也將使用每個請求的恆定數量的帶寬。本來我認爲會是一個整潔的黑客攻擊,但是這個安全性在這一輪持有王牌。 =) – Serguei