2013-02-27 86 views
2

我有一個將XML格式轉換爲HTML的大型XSLT樣式表。我想在輸入XML文件中添加對XInclude的支持。目標是每個包含文件都可以獨立進行XSD驗證,以及包含XML文件。我對XML模式中的所有變化進行了控制(我認爲);只有特定的XML元素可以移出來包含文件,並且只有一個級別的包含文件嵌套。我已經在Eclipse的XML編輯器中工作了,它很好地驗證了包含文件和每個包含文件。將Xinclude支持添加到XSLT樣式表中

XSLT樣式表是用在兩個方面,這裏我們更接近我的問題:

  1. 在通過使用LXML爲XSLT轉換Python腳本的建設環境。 Python腳本集成到基於構建的構建環境中,並集成到Eclipse的Ant腳本中。

  2. 在包含XML文件的xsl-stylesheet指令中。這是針對人們希望立即在Web瀏覽器中看到他們在任何XML文件中所做的更改的情況。迄今爲止,這已證明是一個非常有效的環境,所以我不想放棄這一點。

我能夠得到用例1.通過使用Python腳本中的ElementTree.xinclude()方法工作。但是,對於用例2來說,這並不是解決方案。

另外,我的確瞭解如何編寫僅執行Xinclude解析的XSLT樣式表,並且這在理論上可以用作第一個轉換,然後是現有的XSLT XML到HTML轉換的樣式表。問題是XML文件只能有一個xsl-stylesheet指令。

另一個想法是將XInclude分辨率保留到Web瀏覽器。但是,我不知道任何支持該功能的Web瀏覽器。此外,我討厭限制使用一個特定的瀏覽器。到目前爲止,我們支持所有最常見的瀏覽器。

另一個想法是將XInclude解析支持添加到現有的XSLT樣式表中。但是,我在輸入什麼和輸出是什麼,因爲這些實際上是三個階段(XML輸入就像文件 - > FLAT XML,Xinclude已解決 - > HTML。XInclude解析部分需要執行第一個轉換。與現有的XSLT代碼將執行第二我不知道這是可能的一個樣式表

我的問題是:

  1. 有什麼辦法,我怎麼可以得到兩個XSLT樣式表調用時用網絡瀏覽器打開(含)XML文件?

  2. 有沒有什麼辦法可以改進使用XInclude支持現有的XSLT樣式表,以便它保持單個樣式表?

  3. 在XSLT樣式表中是否有任何方法來修改輸入?

  4. Web瀏覽器在XInclude解決方案中提供任何支持嗎?

感謝 安迪

回答

0

你或許應該看看XPROC做

看來你的使用情況太令人費解以單XSLT來完成

2

1有什麼辦法可以在 用Web瀏覽器打開(包括)XML文件時調用兩個XSLT樣式表?

2有什麼辦法可以改進現有的XSLT樣式表和 XInclude支持,以便它仍然是一個樣式表?

[3]在XSLT樣式表中有沒有辦法修改輸入?

[4] Web瀏覽器在XInclude解決方案中提供任何支持嗎?

應對以相反的順序問題,因爲它更容易這樣:

(4)我還沒有看到任何的Web瀏覽器做的XInclude擴展。 (3)我不知道「修改輸入」是什麼意思:XSLT將輸入轉換爲(或修改)輸入到輸出中。除非你問:可以 你在一個步驟中修改輸入,然後再次轉換輸出 ?是的:如果瀏覽器支持exslt:node-set,那麼您可以使用 創建一個帶有一個變換結果的變量,然後選擇 該變量用於其他變換。您可以使用模式爲不同步驟選擇 一組不同的模板。

是這樣的:

<xsl:variable name="doc.all"> 
    <xsl:apply-templates mode="p1" select="/" /> 
</xsl:variable> 

用的模式= 「P1」 模板的集合,以及某處 模板選擇該變量作爲一個節點集:

<xsl:template match="/" > 
    <xsl:apply-templates select="exslt:node-set($doc.all)" /> 
    </xsl:template> 

[XSLT -2.0可以更直接地處理節點集,但是沒有瀏覽器本地支持XSLT-2.0 heets看起來像,但可能:是的。 當你想到它必然是兩個單獨的 步驟來執行XInclude處理和xslt的其餘部分時,您正在程序思考。如果您正在執行使用XSLT進行XInclude擴展,則xinclude只是另一組匹配的模式。

你可能想是這樣的模板做的XInclude擴展:

<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)]"> 
     <xsl:apply-templates select="document(@href)/*" /> 
    </xsl:template> 

modified from the answer to this question:添加了「/ *」後的文件(@href) 以避免再次調用根模板所包含的文件以及基地 文件。

然後包含一個匹配=「/」模板來設置外部html,其餘的轉換模式創建內部節點。

這兩個步驟隱含在這裏:第一步是將輸入源重定向到 xi:include/@ href,當它遇到該元素時。步驟是根據其他匹配模板處理該文檔中的節點 。 (1)您只能使用PI運行一個樣式表,但是,您在瀏覽器中使用了Javascript,因此只要您避免了跨域安全問題,您就應該可以在程序上做到這一點。

幾點考慮:

我不知道什麼是瀏覽器做,如果作爲一個變換的結果,你產生了不同的指令另一個文件。它會繼續嗎?值得嘗試。如果沒有,您可以明確地在JavaScript中進行處理,然後應用第二個轉換。

您在瀏覽器中有xslt,javascript和css支持:您可以將javascript和css注入到輸出中。和CSS可以風格的XML以及HTML。

Michael Kay已發佈Saxon CE,這是一個編譯爲javascript的XSLT 2.0實現,以便它可以在瀏覽器中運行。