我知道XSLT在程序方面不起作用,但不幸的是,我一直在做過程式語言太久。任何人都可以通過簡單地解釋apply-templates的工作方式來幫助我,並幫助像我這樣的人瞭解它。不能停止以程序術語思考XSLT ......幫助申請模板
回答
是什麼讓你覺得程序術語在這裏不適用?這只是因爲調用約定比您傳統上期待的要隱含得多,因爲涉及到一個不可見的上下文。一切apply-templates
確實可以用程序術語表示。
基本上,apply-templates
只不過是for-each循環。從您當前在文檔中的位置(上下文中,考慮「this
」)開始,它遍歷子節點。
對於每一個孩子,處理器選擇匹配xsl:template
具有最高優先級(根據各自match
和priority
屬性),將手頭的情況下給孩子,並運行此模板(認爲「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
的工作原理的基本瞭解或多或少。這種影響和可能性來自於這樣的事實,即不是你定義要調用的模板,而是讓處理器爲你選擇合適的模塊,這當然比未經訓練的耳朵更大。整個事情的聲明/隱含的方法肯定需要一段時間才能沉入其中。
我寫a blog entry年齡前,顯示寫入使用xsl:for-each
和使用xsl:apply-templates
相當於一個「程序」風格簡單的樣式表。這絕不是一個全面的指南,但希望它有一些用處。
我非常同意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>
指令或以其它方式文檔的節點順序),在其上應用模板。
「被評估每個模板規則產生項作爲其結果的序列所得到的序列(一個用於排序序列中的每個節點),然後連接在一起,以形成單一的。順序它們被連接保留排序序列中節點的順序最終連接序列形成了xsl的結果:。應用模板指令「
的XSLT 1.0規範說:
「實現可以通過任何方式處理源文檔,這樣可以產生與使用此處理模型處理的結果相同的結果。」
XSLT實現甚至有可能並行應用模板(或<xsl:for-each>
的主體)。
- 1. 申請終止幫助
- 2. XSLT - 內申請模板
- 3. 申請停止
- 4. 模板語法幫助
- 5. 規劃提出申請需要幫助
- 6. 模算術幫助
- 7. 申請流程停止在SKPaymentTransactionStatePurchasing
- 8. 申請停止用的setContentView
- 9. 三星A5停止申請
- 10. 申請停止使用ILMerge
- 11. php貸款申請設計幫助
- 12. 需要C#術語幫助
- 13. 模板術語
- 14. 在preg_replace幫助申請例外
- 15. 應用程序意外停止。請再次嘗試,請幫助meee
- 16. codeigniter模板幫助
- 17. 需要幫助停止corona的功能
- 18. 幫助! Joomla模板!
- 19. 如何停止思考「關係」
- 20. 請幫助。不能投出
- 21. 請Smarty的模板錯誤幫助
- 22. 致電XSLT模板參考
- 23. Flash模板幫助
- 24. PHP模板幫助
- 25. GridView模板幫助
- 26. Html幫助程序語法
- 27. 從haml模板移動代碼以查看幫助程序
- 28. C++模板幫助
- 29. 需要幫助來停止BackgroundWorker線程
- 30. 請幫助onjquery懸停
完全同意Greg Beech的博客文章。有關此主題的更多詳細信息,請參閱我的答案。 – 2008-12-02 18:01:27