巧用 Data Instance 實現 XForms 中的資料處理

genusBIT發表於2008-07-17
XForms 是下一代 Web 表單的資料處理技術,它通過 Data Instance(資料例項),定義表單上所有和後端應用關聯的資料資訊,實現各種資料處理。本文首先對 XForms / Data Instance 及 IBM Lotus Forms 進行簡單介紹,然後結合作者的專案開發經驗,提出了 XForms 在實際表單應用中的一個典型的資料處理應用場景。針對該應用場景,本文列舉了兩種 Data Instance 的設計處理方法,通過對比,闡述瞭如何巧妙的利用 XPath 設計合理的 Data Instance,以達到利用電子表單靈活方便處理後端資料的需求。

簡介

電子表單在當今的軟體應用程式中無處不在,標準化的、資料驅動的方法有助於構建表單生成技術。電子表單的標準化格式支援建立容易理解的、可移植的表單,而資料驅動的方法使基於所收集的資料表示來生成電子表單變得更容易。

W3C 針對表單資料的表示和採集提出了 XForms 標準。如 W3C Recommendation 中所述,XForms 的目的是成為“下一代 Web 表單”。和現有的 HTML 表單相比,XForms 有許多突出的優點。正如 Recommendation 中所說的,“通過將傳統的 XHTML 表單分成三部分—— XForms 模型、例項資料和使用者介面,從而把表示從內容中分離出來,提高重用性和實現強型別,可以減少和伺服器通訊的次數,提供裝置獨立性,並減少指令碼的使用”。

為了適應電子表單應用飛速發展的市場需求,IBM 推出了 Lotus Forms 電子表單解決方案,通過採用 XForms 等電子表單技術,IBM Lotus Forms 能夠很方便的實現後端資料處理和後端應用整合,為所有公共或私有部門組織提供高安全性的電子表單,以充分利用現有的資源和系統來更好地為客戶服務,提高運營效率。

XForms 模型表示表單的內容,它能獨立於任何用來顯示資料值的視窗元件集,來宣告資料項和結構。它是一個 XML 資料塊,包含一個或多個 XML 例項文件,包括資料例項 (Data Instances)、繫結 (Binds)、提交 (Submissions) 三部分。其中,表單的資料包含在資料例項中;表單的邏輯元件定義其行為,包括繫結和提交等。XForms 為處理這些 XML 資料提供了多種強大的機制,表單操縱這些例項文件,並負責將 XML 提交到後端系統。

Data Instance 是用於在表單中嵌入任意 XML 資料塊的一種機制。它定義表單上所有和後端應用進行關聯的資料資訊。一個 Data Instance 可以用於儲存表單上的任何輸入數值,為表單上某些使用者域進行資料預呈現,或者動態的生成資料可選項列表。

本文作者曾參與了多個與 IBM Lotus Forms 電子表單相關專案的前期需求分析、例項編寫和應用搭建。在實施過程中,根據使用者需求動態生成資料可選項列表,往往是電子表單應用中最常見的一種設計要求,也是 Data Instance 在使用過程中最廣泛的一種應用模式。而更多的應用場景,往往都包含多個相互關聯的資料可選項列表,即第二個可選項列表中的可選數值會隨著第一個可選列表中選定數值的變化而發生變化,依此類推。這種場景,使用傳統的應用開發方法,是非常簡單易於實現的,但是使用 XForms 進行設計,如果設計不好,就會大大降低表單應用的靈活性。下文將舉一個具體例項,對這一問題進行詳細描述,說明如何巧妙的設計 Data Instance 來靈活的進行表單中的資料處理。



應用場景描述

圖 1 是使用 IBM Lotus Forms Designer 設計的電子表單的一部分使用者介面。使用者在填寫表單過程中,需要填寫詳細地址資訊。其中,當使用者在“國家”下拉選單中選擇了國家之後,“省份 / 州”下拉選單中的可選項將隨之發生變化,列出該國家可選的省份 / 州。


圖 1. 用 Designer 設計的表單的部分使用者介面
圖 1. 用 Designer 設計的表單的部分使用者介面

以上應用需求,使用 Lotus Forms Designer 進行設計,最簡單的方式是使用傳統的 XFDL 來實現,將所有國家和省份 / 州的列表資料直接寫死賦值給這些下拉選單欄位域。顯而易見,這種方法雖然簡單,但是沒有任何靈活性。當可選國家、省份 / 州的數值列表發生變化時,必須通過 Lotus Forms Designer 修改這個電子表單(.xfdl 檔案),修改之後,才能重新生效。因此,採用 XForms,使用 Data Instance,通過 XML 進行資料獲取和交換,保證資料層和展現層的分離,是較好的解決方法。

那麼,如何根據表單介面的需求,設計靈活合理的 Data Instance 呢?



常用的 Data Instance 設計

最被普遍使用的也最容易想到的 Data Instance 結構,如清單 1 所示:


清單 1. 常用的 Data Instance

    
        
             
                ………
                
                    
                        
                    
                    
                        
                    
                    
                        
                    
                ……
                
            
        
    


其中, 代表所有可選國家名稱的列表,然後根據國家名稱的具體數值,再通過 列出該國家下可選的省份 / 州名稱。例如: 列舉的是“中國”這個國家可以選擇的省份名稱, 列舉的是“美國”這個國家可以選擇的州的名稱。

相對應的使用者介面設計如下:


清單 2. 對應的使用者介面設計程式碼(“國家”下拉選單)

    
        
        
            
            
        
    
    ……



清單 3. 對應的使用者介面設計程式碼(“省份 / 州”下拉選單)

    
        
        
            
            
        
    
    ……


最終介面顯示效果如圖 2 所示。從顯示效果來看,“省份 / 州”的資料選項確實可以根據“國家”選項的不同而發生相應的變化,滿足了使用者的需求。


圖 2. 電子表單介面顯示效果
圖 2. 電子表單介面顯示效果

但是,這種被普遍採用的方法存在著很大的缺陷:

  1. 在 Data Instance 設計中, 需要與 值一一對應。當“國家”選項發生變化時(增加 / 修改等),整個 Data Instance 都需要進行相應的修改。例如:如果 增加了’United King’,則 Data Instance 中還需要增加 及其 ,用於表示’United King’國家可選的省份 / 州資訊。
  2. 從上述使用者介面程式碼可以看出,“省份 / 州”的資料選項值通過 nodesetchoose 函式獲取,類似於其他程式語言中的’if – then - else’語句。它根據 的選項,以獲取對應的 值。因此,一旦 值發生了變化,這部分程式碼也需要重新修改。例如:如果 增加了’United King’,則該部分程式碼需要修改為:
choose(instance('INSTANCE')/PAGE1/Country 
    = 'China', ../../SelectionLists/ChinaProvinces/option,
choose(instance('INSTANCE')/PAGE1/Country 
    = 'United States', ../../SelectionLists/USAProvinces/option,
 ./../SelectionLists/UKProvinces/option))

由此可見,這種方法在資料選項內容固定的情況下使用,是非常簡單易用的。但是對於資料選項經常發生變化或者無法預先獲知的情況,其靈活性則非常差。為此,必須對其進行改造,使其具備更好的通用性和靈活性。


改進後的 Data Instance

Data Instance 中的資料元素,可以通過使用 XPath 表示式,進行定位引用及相關運算操作。由於篇幅原因,本文不對 XPath 進行具體闡述。在 XPath 豐富的運算子和函式中,有一類可以很好地解決上述方法的缺陷,這就是 <instance>/<element>/<option>[@<attribute>=’VALUE’]。這個表示式的大意是:在 instance 中選取所有的 element,它具備屬性 attribute 並且值等於 VALUE。例如://book[@lang=’en’],該表示式的運算結果是選取所有具備屬性’lang’且其值等於’en’的’book’元素。

上述表示式中,‘屬性’(attribute) 是關鍵。通過對


清單 4. 改進後的 Data Instance

    
        
             
                ………
                
                    
                        
                    
                    
                        
                    
                
            
        
    


與上文所述最普遍使用的 Data Instance 相比,“國家” () 的例項結構沒有任何變化,“省份 / 州”的例項結構做了相應改動,由原來為每個“國家”設計一個結構 (),變成了一個通用的帶有屬性‘country’的 結構。

經過這樣的修改,“省份 / 州”這個使用者介面域對應的程式碼片斷變化如下:


清單 5. 改進 Data Instance 後的使用者介面設計程式碼(“省份 / 州”下拉選單)

    
        
        
            
            
        
    
    
    
    ……..


其中,加粗部分的 XPath 表示式說明,“省份 / 州”域的可選項列表數值將取決於 @country 這個屬性值,該值是在選取“國家”域值時賦予的。最終介面顯示效果與圖 2 相同,完全符合使用者的需求。

經過這樣的改動,可以很好地解決上文所述清單 1 的 Data Instance 的缺陷,具有非常好的靈活性和通用性:

  1. 通過增加 country 屬性,使得整個 Data Instance 的結構不會在“國家”選項發生變化時(增加 / 修改等),進行相應的修改。唯一有所變動的僅僅是 country’屬性的值。清單 7 加粗部分,說明了當 由最初的 ChinaUnited States 兩項,到增加 United King 後,發生的變化。可以看出,這種變化,並沒有引起整個 Data Instance 結構的變化。



    清單 6. Data Instance 資料值舉例
                            
    
        
        
    
    
        
         
        
        
     
    



    清單 7. Data Instance 資料值舉例 ( 增加 United King 值後的變化 )
                            	
    
        
        
        
    
    
        
         
        
        
        
                            
    
    

  2. 對應的使用者介面程式碼(清單 4)具有非常好的靈活性,也不會因為 值發生變化而進行相應修改。

其他設計時考慮的問題

使用 IBM Lotus Forms Designer 設計基於 XForms 的表單,最主要的作用是為了更方便更靈活的實現後端資料處理,比如從後端系統中獲取數值為表單上某些使用者域進行資料預呈現,動態的生成資料可選項列表,捕獲表單上的輸入數值並儲存到後端應用系統等等。在本文所描述的應用場景中,類似於“國家”、“省份 / 州”這樣的可選數值在實際專案應用中,應該是在使用者開啟表單時,就將後端系統中的儲存資料預呈現給使用者。使用 IBM Lotus Forms 提供的 Java API,編寫應用程式 (servlet),這是最簡單也是最直接的實現方式。但是這種方式需要使用者客戶端始終線上,能實時與伺服器進行通訊。

本文作者參與的電子表單專案,大多數都有離線操作的要求,這也是 IBM Lotus Forms 產品的一大優勢之一。在離線狀況下,上述使用 API 編寫 servlet,實時與伺服器保持通訊的方法就不再適用。為此,IBM Lotus Forms 提供了 IFX 機制,通過擴充 Lotus Forms Viewer 客戶端的功能,滿足更多的使用者需求。由於篇幅原因,本文不對 IFX 的原理和實現步驟作詳細的描述,僅將使用 IFX 實現上述離線功能的設計思路簡述如下:

  1. 預先將後端系統資料值組裝成一個 xml 檔案,該檔案的結構與 XForms 中 Data Instance 結構匹配。
  2. 使用者在離線狀態下開啟表單時,觸發 IFX 編寫的相應函式,讀取這個 xml 檔案,將其中的資料值與表單中的 Data Instance 進行繫結,從而為相應的使用者介面欄位域預呈現可選的資料項列表。
  3. 之後,使用者正常操作表單,進行各種工作。

本文最後提供了相應的程式程式碼,以供下載參考。


結束語

XForms 在表單資料模型及其表示之間增加了一層新的、功能強大的抽象,把表示從內容中分離出來,提高靈活性和重用性。使用 IBM Lotus Forms 設計基於 XForms 的電子表單,通過 Data Instance,可以很方便的實現後端的資料處理。Data Instance 中的資料元素,是通過 XPath 表示式,進行定位引用及相關運算操作的。因此,充分掌握 XPath 的語法語義,設計合理的 Data Instance 結構,是實現資料靈活處理的關鍵。本文通過一個典型應用場景的運用描述,說明了如何巧用 XPath 來巧妙設計 Data Instance,從而為靈活處理後端資料提供支援。當然,設計靈活合理的電子表單,不僅僅只侷限於 Data Instance 的巧妙設計,XForms 還提供了很多強大的機制,比如操作 (actions)、事件 (events) 等,只有充分應用這些機制,才能真正發揮 XForms 的功能,為電子表單應用提供最有效的幫助。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-402628/,如需轉載,請註明出處,否則將追究法律責任。

相關文章