2011-12-09 92 views

回答

11

在一個非常基本的水平,你使用<xsl:apply-templates>當你想自動讓處理器處理節點,並使用<xsl:call-template/>當你想在加工更精細的控制。所以,如果您有:

<foo> 
    <boo>World</boo> 
    <bar>Hello</bar> 
</foo> 

而且你有以下XSLT:

<xsl:template match="foo"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="bar"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="boo"> 
    <xsl:value-of select="."/> 
</xsl:template> 

你會得到的結果WorldHello。從本質上講,你已經說過了「處理這種方式吧」,然後讓XSLT處理器在處理這些節點時處理這些節點。在大多數情況下,這就是您應該如何在XSLT中做的事情。

雖然有時候,你想做些更有趣的事情。在這種情況下,您可以創建一個不匹配任何特定節點的特殊模板。例如:

<xsl:template name="print-hello-world"> 
    <xsl:value-of select="concat(bar, ' ' , boo)" /> 
</xsl:template> 

然後你可以調用這個模板,而你正在處理<foo>而不是自動處理foo的子節點:

<xsl:template match="foo"> 
    <xsl:call-template name="print-hello-world"/> 
</xsl:template> 

在這個特定的人爲例子,你現在得到「 Hello World「,因爲你已經覆蓋默認的處理來做你自己的事情。

希望有所幫助。

+0

到目前爲止,這是我在XSLT讀過(雖然我要補充一句,XSLT的最好解釋是不是我的事,可能永遠不會。將會) –

3

請你解釋我 <xsl:apply-template><xsl:call-template>,當我應該使用 <xsl:call-template>之間的區別?

一個可以使用<xsl:call-template>但幾乎從未應該

它是XSLT的精神,讓XSLT處理器,以確定到底是哪模板最佳匹配一個節點,來決定使用這個模板,用於處理節點。這給了我們乾淨,簡單而強大的可擴展性和多態性。

通常,比較xsl:apply-templatesxsl:call-template與將虛擬方法從基類的調用與直接調用非虛方法的方法進行比較相似。

這裏有一些重要的區別

  1. xsl:apply-templates也更加豐富,比xsl:call-templates,甚至從xsl:for-each更深只是因爲我們不知道什麼代碼將的節點上應用 的選擇 - 在一般情況下,該代碼將與節點列表的不同節點 不同。

  2. 將應用於 可寫的方式xsl:apply-templates後由 人不知道原作者的代碼。

FXSL library的實現在XSLT高階函數(HOF)是不可能的,如果 XSLT沒有足夠的<xsl:apply-templates>指令。

摘要:模板和<xsl:apply-templates>指令是XSLT如何實現和處理多態性。人們可以也應該避免使用xsl:call-template,它不允許多態性,並限制了可重用性和靈活性。

參考:看到這個整個主題:http://www.stylusstudio.com/xsllist/200411/post60540.html

相關問題