DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 用於數據的XML: 用EXSLT擴展XSLT的功能
用於數據的XML: 用EXSLT擴展XSLT的功能
編輯:XML詳解     

正如在過去的幾篇專欄文章中所看到的那樣,XSLT 1.0 提供了很好的文本轉換功能,但實際上它還不夠完善,不足以提供好的數據操作能力。客觀地說,它從未打算要做到這一點;設計 XSLT 1.0 時,它的創建者無法知道它將會有怎樣的復雜用法。但是,XSLT 1.0 規范的的確確提供了通過額外的元素和函數來擴展 XSLT 功能的機制。規范中的相關段落如下:

  元素擴展機制允許將名稱空間指定為擴展名稱空間。當將名稱空間指定為擴展名稱空間,並且模板中出現帶有該名稱空間中名稱的元素時,那麼認為該元素是指令而不是文字結果元素。名稱空間確定了指令的語義。 如果 FunctionCall 表達式中的 FunctionName 不是 NCName (也就是說,如果它包含了一個冒號),那麼就將它當作是對擴展函數的調用。使用求值上下文中的名稱空間聲明將 FunctionName 擴展成一個名稱。

  這意味著,如果 XSLT 處理器開發人員想要添加更多的功能,他們可以隨意而為 - 只要支持該功能的元素和函數名稱出現在他們自己的名稱空間裡。利用這一特性而獲得的首要成就之一就是 Mike Kay 的 Saxon XSLT 處理器:通過包括 saxon: 名稱空間中的元素和屬性,開發人員可以創建能執行復雜源文檔操作的樣式表。其弊端是這些樣式表不再是可移植的了:它們在非 Saxon 處理器中不能正常運行。同樣地,XSLT 的某些 Java 實現通過使用 java: 名稱空間允許從樣式表直接進行 Java 調用,從而擴展功能,但是在不支持該名稱空間中元素和屬性的處理器上,該樣式表無法正常工作。

  EXSLT 是什麼?

  為使 XSLT 擴展更加可移植,一組開發人員已經創建出了 EXSLT 規范。這是在設法標識對 XSLT 1.0 的有用擴展功能並將它們分成可在“照菜單點”的基礎上實現的功能組。EXSLT 工作是開放式的;希望對此做出貢獻的任何人都可以如願以償。

目前所定義的 EXSLT 模塊有:

  Dates and Times提供了大量的日期操作功能,包括計算兩個日期之間的差,以及檢索本地系統的當前日期和時間。

  Dynamic為處理動態生成的 XPath 表達式提供了一種機制,來完成各種任務,包括檢索值並選擇最小和最大值。

  Common提供了幾個基本擴展函數,比如用於創建多個輸出文件的機制和返回一個字符串的函數,該字符串包含了傳入該函數的對象的類型。

  Functions為用戶提供了用來定義他們自己函數的機制。

  Math提供了簡單的數學函數,比如三角函數和對數函數。

  Regular Expressions提供了正則表達式處理功能,包括選擇字符串中與給定正則表達式相匹配的子字符串的函數,以及用不同的文字值替換匹配的子字符串的函數。

  Sets提供了用於節點集操作的函數,包括返回兩個節點集的交集和返回出現在一個節點集中而不在另一節點集中的節點。

  Strings提供了一些非常有用的字符串操作函數,比如將字符串作為標志放入標志元素節點集的函數,以及連接節點集中所有節點的字符串值的函數。

  使用 EXSLT

  因為 EXSLT 還沒有被任何標准團體正式接受,所以 EXSLT 中功能的實現往往是有時成功有時不成功。這些函數可能有幾種不同的實現方法,下面根據遞減的可移植性次序列出了這些方法:

  XSLT 模板。EXSLT 中的許多函數只是那些可以通過使用 XSLT 模板來完成的等價行為的快捷方式。對於這些函數,EXSLT 作者已經提供了可以導入到現有樣式表的 XSLT 模板。這種方法提供了最強的可移植性,因為所有符合 XSLT 1.0 的處理器都能正確解釋該模板並提供該功能。

  EXSLT 函數。如果您正在使用的 XSLT 處理器支持來自 XSLT 中函數名稱空間的函數元素,那麼您可以利用為某些函數所提供的 EXSLT 函數實現。這種方法的可移植性比 XSLT 模板的稍微差點,但是您可以將該函數用作樣式表中其它表達式的一部分。

  特定於語言的實現。對於某些函數,它們簡單得足以用類似 JavaScript 這樣的語言來實現,您可以將這些函數的實現加到支持那些語言的處理器中,從而可以使用這些實現。諸如 math 名稱空間中的那些函數在這點上是非常理想的。

  由特定處理器進行的本機實現。包括了對 EXSLT 函數本機支持的處理器能夠提供大多數的功能。某些 EXSLT 函數(比如動態名稱空間中的那些函數)只能在本機實現。

  根據您需要使用哪個函數以及您的樣式表所需的可移植性程度,這些解決方案中可能有一些最符合您的需要。您可以在 EXSLT 網站上找到有關 EXSLT 中每個函數或元素實現狀態的完整文檔。

  那麼 EXSLT 對您來說是個好主意嗎?

  照例,EXSLT 是否適合某個特定的編程任務,這確實要取決於您的特定環境。如果您正在編寫可能“鎖定”於某一特定處理器平台的樣式表(比如用於轉換服務器上文檔的樣式表),那麼您可能會選擇實現您所需的擴展函數和元素的處理器。如果您需要可移植的樣式表(例如,用於客戶機端的樣式化,或是在多個 XSLT 處理器的環境中),那麼您可能需要將 XSLT 限制用於那些可以用 XSLT 模板實現的函數。好消息是 XSLT 2.0 包含了許多函數和元素,它們與那些在 EXSLT 中所找到的相似或相同 - 因此如果您現在致力於 EXSLT 實現,那麼將它們移植到 XSLT 2.0 應當會是相當簡單的任務。您甚至可以使用一個樣式表來將許多 EXSLT 樣式表轉換成 XSLT 2.0 樣式表 - 但那是另一篇專欄文章的內容了。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved