2008-12-02 47 views
4

我知道XSLT在程序方面不起作用,但不幸的是,我一直在做過程式語言太久。任何人都可以通過簡單地解釋apply-templates的工作方式來幫助我,並幫助像我這樣的人瞭解它。不能停止以程序術語思考XSLT ......幫助申請模板

+0

完全同意Greg Beech的博客文章。有關此主題的更多詳細信息,請參閱我的答案。 – 2008-12-02 18:01:27

回答

5

是什麼讓你覺得程序術語在這裏不適用?這只是因爲調用約定比您傳統上期待的要隱含得多,因爲涉及到一個不可見的上下文。一切apply-templates確實可以用程序術語表示。

基本上,apply-templates只不過是for-each循環。從您當前在文檔中的位置(上下文中,考慮「this」)開始,它遍歷子節點。

對於每一個孩子,處理器選擇匹配xsl:template具有最高優先級(根據各自matchpriority屬性),將手頭的情況下給孩子,並運行此模板(認爲「function」)。模板返回後,上下文快速返回,它是下一個孩子的回合。

即使事情變得遞歸(在XSLT中有些難以避免),整個過程也不會變得更加複雜。上下文「指針」移動,模板被調用。

可以限制節點設置apply-templates迭代,使用select屬性:

<!-- all children of the context node regardless --> 
<xsl:apply-templates /> 

<!-- all children of the context node being "data" with a @name of "Foo" --> 
<xsl:apply-templates select="data[@name='Foo']" /> 

您可以排序的節點集合之前的迭代,如果你想:

<!-- all children of the context node being "data" with a @name of "Foo", 
    ordered by their respective "detail" count --> 
<xsl:apply-templates select="data[@name='Foo']"> 
    <xsl:sort select="count(detail)" data-type="number" order="descending"/> 
</xsl:apply-templates> 

如果需要,可以將參數傳遞給模板,就像使用常規函數調用一樣:

<!-- pass in some parameter --> 
<xsl:apply-templates select="data[@name='Foo']"> 
    <xsl:with-param name="DateSetIcon" select="$img_src" /> 
</xsl:apply-templates> 

這就是關於它的一切。

編輯:

我知道最後的評論有點挑釁。這是非常有意的,因爲對apply-templates的工作原理的基本瞭解或多或少。這種影響和可能性來自於這樣的事實,即不是你定義要調用的模板,而是讓處理器爲你選擇合適的模塊,這當然比未經訓練的耳朵更大。整個事情的聲明/隱含的方法肯定需要一段時間才能沉入其中。

5

我寫a blog entry年齡前,顯示寫入使用xsl:for-each和使用xsl:apply-templates相當於一個「程序」風格簡單的樣式表。這絕不是一個全面的指南,但希望它有一些用處。

+0

我不確定我是否同意這種觀點 - 對於每一個結構來說,*更容易!XSLT傢伙理解並且XSLT被太多已經被看作是巫術(可讀性) - 但它是一篇寫得很好的文章 – annakata 2008-12-02 09:52:55

+0

This確實開始削弱圍繞魔法應用模板的神祕主義。另外,我剛剛發現使用Visual Studio(2008)逐步完成示例也有所幫助。 – Xetius 2008-12-02 10:16:35

+0

完全同意博客文章。有關此主題的更多詳細信息,請參閱我的答案。 – 2008-12-02 18:00:24

2

我非常同意Greg Beech的回答和博客文章。

對於<xsl:for-each><xsl:apply-templates>之間更詳細的比較看my answer問題 「的xsl:for-每個主場迎戰XSL:申請模板」 中的XSL-名單,並享受the whole thread

XSL:申請模板比XSL更豐富,更深層次:對,每次,甚至 僅僅是因爲我們不知道什麼代碼將在 節點上應用的選擇 - 在一般情況下此外,將應用 的代碼可以在寫入xsl:apply模板之後寫入,也可以由 不知道原始作者的人寫入 」。

與過程式編程語言的另一個區別是,模板將被應用的順序不是預定義的。純函數式編程語言中沒有「狀態」或「執行順序」的概念。

既不XSLT 2.0也不XSLT 1.0指定應用所選擇的模板規則的任何特定的順序 - 僅他們的結果將根據節點的順序(排序序列中被組合,如果存在在任何<xsl:sort>指令或以其它方式文檔的節點順序),在其上應用模板。

XSLT 2.0 Spec說:

被評估每個模板規則產生項作爲其結果的序列所得到的序列(一個用於排序序列中的每個節點),然後連接在一起,以形成單一的。順序它們被連接保留排序序列中節點的順序最終連接序列形成了xsl的結果:。應用模板指令

XSLT 1.0規範說:

實現可以通過任何方式處理源文檔,這樣可以產生與使用此處理模型處理的結果相同的結果。」

XSLT實現甚至有可能並行應用模板(或<xsl:for-each>的主體)。