xslt計數迴圈 在XSLT中使用遞迴進行迴圈

2021-10-07 19:48:17 字數 2216 閱讀 2757

xslt計數迴圈

xslt已經完成。 這意味著只要有足夠的記憶體,xslt就可以計算任何其他圖靈完備的語言(例如c ++)可以計算的任何東西。 對於習慣於更傳統語言的程式設計師來說,這有點令人驚訝。 畢竟,xslt缺少一些對許多演算法都很重要的功能,包括迴圈和可變變數。

注意:xslt所謂的變數在大多數其他語言中稱為常量。 與傳統的程式設計變數相比,它們更像代數變數。

剛才提到的遺漏不是疏忽。 xslt是一種功能語言,而不是過程性語言。 在諸如c或pascal的過程語言中,程式被定義為一系列步驟,按指定的順序執行將產生最終結果,作為該順序中的最後一步。 用功能語言將程式定義為由其他功能組成的功能,對其求值可得出最終結果。 函式式語言的最大優點是執行順序無關緊要。 作為乙個簡單的示例,請考慮以下兩個(代數)函式:

f(x) = 2*x

g(x) = x - 3

現在考慮函式h(x)fg

h(x) = f(g(x))
你可以評估這個函式或者g第一:

h(x) = f(x - 3) = 2 * (x - 3) = 2x - 6
f首先:

h(x) = 2 * g(x) = 2 * (x - 3) = 2x - 6
兩者產生相同的答案。 語言的功能性質使其更適合並行處理,因為可以同**估程式的多個部分,而不用擔心在其他部分之前需要評估哪個部分。 執行緒安全是自動的。

包括xslt在內的功能語言不能包含傳統迴圈,因為迴圈是按時間順序排列的。 即,編寫並編譯乙個典型的迴圈,使得i==1必須在i==2之前發生。 當然,您可以向後而不是向前執行迴圈,或者將迴圈計數器增加1以外的值,甚至可以像while語句中那樣完全消除迴圈計數器。 但是,無論迴圈的型別如何,執行的順序都很重要,這與功能程式設計相反。

在函式式語言中,大多數由傳統語言中的迴圈完成的任務都由遞迴完成。 引數代替變數。 例如,最近我被問到如何在編譯時不知道要列印的數字的情況下列印一定數量的點(句點)。 例如,在格式化餐廳選單時,這可能會很有用,在選單名稱和**之間通常需要不同數量的點:

crawfish etoufee.......$9.95

fried chicken..........$6.95

在c中,您將編寫乙個簡單的函式,如下所示:

void printdots(int n) 

}

但是,這不是解決問題的唯一方法。 可以使用遞迴來代替迴圈,如下所示:

void printdotsrecursively(int n) 

}

這在c語言中是不常見的。但是,在xslt中,遞迴是唯一的選擇。

下面的模板生成精確傳入的點數作為count引數的值。 邏輯很簡單:如果$count的值大於零,則輸出乙個句點並以乙個count引數減一的方式再次呼叫該函式。 否則,什麼都不做。 這基本上是與printdotsrecursively函式使用的演算法相同的演算法,只是它是在xslt中而不是c中實現的:

0">

.

例如,要列印100個點,可以使用100作為count引數的值來呼叫模板:

您可以傳遞一些其他值來計算要列印的點數,而不必傳遞恆定值。 例如,以下指令在考慮了**的長度和主菜名稱(更具體地說,priceentree的字串值的長度)後,列印了將菜單行填充到80個字元所需的點數上下文節點的子元素):

無論是在c,xslt還是scheme中,用遞迴替換迴圈都需要一些習慣。 但是,這種技術具有一定的優雅性。 您不需要在xslt中經常使用它,但是它使您可以完成棘手的任務,而這些任務是在標準xslt中無法以其他方式完成的。

翻譯自:

xslt計數迴圈

在 XSLT 中用遞迴實現迴圈

擴充套件 xslt 能力的技術 xslt 是一種函式式程式語言,類似於 haskell 或 scheme,但是與 c 和 fortran 不同。因此這種語言沒有迴圈,也沒有可變的變數。相反,必須用遞迴和引數來代替這些結構。這篇技巧示範了如何使用命名模板和xsl call template xsl w...

在Delphi中用XSLT轉換xml檔案格式

uses xmldoc,xmlintf function transform xmlcontent string xslcontent string widestring var xml ixmldocument xsl ixmldocument begin xml loadxmldata xmlc...

在Delphi中用XSLT轉換xml檔案格式

uses xmldoc,xmlintf function transform xmlcontent string xslcontent string widestring var xml ixmldocument xsl ixmldocument begin xml loadxmldata xmlc...