2012-01-05 45 views
2

(讓我風險總體戰略問題可能冒犯協議和爲難我。)XSLT 1.0初步處理策略

我輸入XML轉換成HTML的元素乘元素轉換之前,我需要確定的順序其中將呈現元素。這樣做需要遞歸分析,包括合併有序列表和跟蹤圖形,全部基於要呈現的元素的屬性。

經過那個處理後,我實際上得到了一個有序的屬性值列表,並且我將呈現按該列表排序的元素。

哪種策略更好?

1)將預分析的結果爲一個全局變量,這將是屬性值的列表,然後通過該列表循環,這樣的事情:

<xsl:variable name=orderOfPresentation> 
    <xsl:call-template name="analyses"> 
</xsl:variable> 


<xsl:template match="root"> 
    <xsl:for-each select="$orderOfPresentation"> 
     <xsl:apply-templates select="/" /> 
    </xsl:for-each> 
</xsl:template> 

2)應用格式深的分析,一旦確定有序列表模板,沒有收出遞歸,是這樣的:

<xsl:template match="root"> 
    <xsl:call-template name="analysis"> 
     [with, as parameters, various sets of attribute nodes, extracted from the input XML] 
    </xsl:call-template> 
</xsl:template> 


<xsl:template name="analysis"> 
    [recursions that include calls to sub-analysis] 
</xsl:template> 

<xsl:template name="sub-analysis"> 
    [recursions that include calls to sub-sub-analysis]] 
</xsl:template> 

<xsl:template name="sub-sub-analysis"> 
    [more work, which eventually produces an ordered list, $orderOfPresentation] 
    <xsl:for-each select="$orderOfPresentation"> 
     <xsl:apply-templates select="/" /> 
    </xsl:for-each> 
</xsl:template> 

在F第一種策略可能只是暴露程序語言程序員的想法,但似乎有利於在處理真正的變革業務之前讓處理器清理乾淨。

但是,XLST 1.0(我必須在其中工作,沒有擴展名)沒有簡單的方法來表示字符串值列表,並且(如果我正確理解這一點)只能傳遞迴全局變量a Result樹片段(我不明白的東西)。所以戰略(1)看起來很糟糕。但是(2),一種從遞歸內部調用所有真實轉換的策略似乎效率低下,難以維護。

這些策略之一是最佳實踐嗎?還是他們都是頭腦混亂的證據?

+0

環境是如何看待您的XSLT處理器從哪裏調用的?是否有機會將第一個XSLT程序應用於排序,將結果XML存儲在某處並通過第二個執行「XML到HTML」轉換的XSLT程序來處理?這是我想在這裏嘗試的。 – 2012-01-05 17:30:42

+0

轉換正在客戶端完成,在Web瀏覽器中。所以,不,我不能存儲中間XML。 – JPM 2012-01-05 17:33:21

+0

嗯,我對JavaScript沒有太多瞭解,但是不可能通過使用JavaScript來達到目的?這個例子http://www.w3schools.com/xsl/xsl_client.asp看起來像它可以很容易地修改兩次運行XSLT處理器。 – 2012-01-05 17:38:07

回答

0

預處理的需要的結果是一個字符串列表(屬性值的有序列表),所以:

忽視的事實是一個RTF是一個樹片段,只是把它當作一個字符串。在被調用的模板中,不要創建XML節點,只需使用value-of plus分隔符輸出字符串。

全局變量只是一個字符串列表。 (該功能substring-before(, delimiter)substring-after(, delimiter)可以形成列表中一個可愛的小流行功能。)

因此,獲得第一完成預處理的好處(策略1),而不是從深預處理內啓動轉型(策略2)但是通過將全局變量視爲不是RTF,而是將其視爲有序的字符串列表來實現。

+0

我不能依賴節點集()擴展,因爲這是瀏覽器中的客戶端轉換。我想避免使用Javascript來使樣式表易於他人使用,適應和維護。這裏的策略是輕量級的,目前運行良好。 – JPM 2012-01-07 18:37:23

1

和Doc Brown一樣,我會使用第三種策略:生成目標樣式表,然後執行它。這很有可能在瀏覽器中用一些Javascript來完成。