2011-04-29 84 views
9

我有基本查詢。我一直在使用xsl:template並使用call tempate對模板進行遞歸調用。我看到了xsl:函數,它也可以像遞歸模板調用一樣進行遞歸函數調用,並實現相同的功能。什麼時候應該使用xsl:function以及何時應該使用xsl:template。我不確定兩者之間有什麼區別,什麼時候應該使用它們。他們每個人的特點是什麼?有人可以幫助我更好地理解這一點。XSL遞歸調用 - xsl:函數與xsl:帶調用模板的模板

+0

好問題,+1。請參閱我的答案以獲得解釋,比較和建議。 – 2011-05-01 19:36:34

回答

1

我發現Dimitre的回覆 - http://www.stylusstudio.com/xsllist/200811/post00400.html - 有幫助。使用<xsl:function/>

優點:

  1. 組合性。

  2. 在使用它作爲參數的表達式中看起來不錯,因爲 返回值或作爲部分 應用程序。

  3. 可讀性(緊湊性)和可維護性。

  4. 更多鬆耦合(不依賴隱式上下文節點上)

  5. 可以在XPath表達式中引用

缺點:

  1. 參數是僅由位置標識(不按名稱)

  2. 可以是不純的(可以有副作用,如創建新節點(S)) 和只是看着表達 引用這個功能的人可能 不明白,它有一個側 效果。然而,如果使用適當的命名,則可以消除這種混淆的可能性。

我傾向於總是使用<xsl:function/>。 在功能創建 新節點的情況下,我按照 的慣例開始其本地名稱, 字符串「make」,如makePerson()中所示。

2

從概念上說,xsl:apply-templates是一個映射,它具有爲所聲明的所有規則表示的多態函數。 xsl:function聲明瞭一個「常規」函數,您可以在任何接受XPath表達式的任何其他指令或聲明中使用該函數。指令「調用」一個特定的命名模板(你可以把它看作某種功能)。

因爲這樣,關於每個評估上下文如何涉及評估上下文有所不同:xsl:apply-templates定義了一個新的上下文列表,從中獲取上下文節點以及接近位置; xsl:function沒有定義上下文節點(依賴它是錯誤的); xsl:call-template不會更改評估上下文。

其他明顯不同的是它們與輸出的關係:當XSLT指令輸出其構造的序列時,它們都是xsl:apply-templatesxsl:call-template; xsl:function作爲它不包含的XPath表達式的一部分。

+0

@Alejandro:我在你的答案中找到兩個有問題(不完全正確)的陳述。 1)''xsl:function'沒有定義上下文節點(依賴於它是錯誤的);「更準確地說,如果在主體中遇到相對XPath表達式,XSLT處理器必須發出錯誤信號的功能。 2)「xsl:函數作爲它不包含的XPath表達式的一部分(輸出構造的序列)」。這不是真的。 'xsl:function'可以創建節點並返回它們 - 我使用這種技術。是的,'xsl:function'可能有副作用。 – 2011-05-02 13:18:05

+0

@Dimitre:From http://www.w3.org/TR/xslt20/#stylesheet-functions _「在樣式表函數的主體中,焦點最初是未定義的;這意味着任何嘗試引用上下文項,上下文位置或上下文大小是一個不可恢復的動態錯誤。「_關於兩個:它不是輸出到結果樹的函數,而是XSLT指令。關於副作用,好吧,它可能會引起爭議:即使構造新節點作爲結果的函數也會爲相同的參數構造相同的結果,除此之外它可能不具有相同的節點標識。 – 2011-05-02 14:08:43

+0

@Dimitre:主題:它看起來像是一個主要的retag,它改變了'xpath'的所有'xpathengines'標籤,甚至改變了該版本的屬性(如果我用'xpathengines'標記,現在它說我已經標記了它與'xpath')。請參閱http://meta.stackexchange.com/questions/89005/what-did-happen-with-xpathengines-and-xqueryengines-tags – 2011-05-02 14:16:58

6

這是how I replied to a similar question近3年前:

使用<xsl:function/>的好處:

  1. 組合性。

  2. 在使用它作爲參數的表達式中看起來不錯,因爲 返回值或作爲部分 應用程序。

  3. 可讀性(緊湊性)和可維護性。

  4. 更多鬆耦合(不依賴隱式上下文節點上)

  5. 可以在XPath表達式中引用

缺點:

  1. 參數是僅由位置標識(不按名稱)

  2. 可以是不純的(可以有副作用,如創建新節點(S)) 和只是看着表達 引用這個功能的人可能 不明白,它有一個側 效果。然而,如果使用適當的命名,則可以消除這種混淆的可能性。

我傾向於總是使用<xsl:function/>。 在功能創建 新節點的情況下,我按照 的慣例開始其本地名稱, 字符串「make」,如makePerson()中所示。

我只能添加到這個:

總是儘可能使用<xsl:function>

在XPath 3.0中,函數是語言的第一類數據類型(又名HOF - 高階函數)。它們可以作爲參數傳遞或作爲結果返回到其他函數或從其他函數返回。

這是一個令人難以置信的強大的飛躍使用命名模板。

0
Templates are useful when you have the requirement to store the results of each recursion into a variable as a attribute (at the end of each recursion before calling the next). 

**Example:** 

    <xsl:variable name="test"> 
    <record> 
     <xsl:call-template name="templateRecursion"> 
       <xsl:with-param name="xyz" select="xyz"/> 
     </xsl:call-template> 
    <record> 
    </xsl:variable> 

**templateRecursion:** 

    <xsl:template name="templateRecursion"> 

    <!-- Do processing --> 
    <xsl:attribute name="" value="" 

    </xsl:template> 

So, the variable test will have 

    <record> 
    <attribute_name="" value=""/> 
     . 
     . 
    </record>