World Wide Web Consortium(W3C)開發的 XForms 標準用于表單數據的表示和收集。W3C Recommendation 聲稱,XForms 意圖成為 “Web 的下一代表單”。Recommendation 本身聲明,“通過將傳統的 XHTML 表單分為三個部分 —— XForms 模型、實例數據和用戶界面,它將表示從內容中分離出來,從而支持重用,提供強類型,減少與服務器的通信次數,提供設備獨立性,減少對腳本編程的需要。”
XForms 文檔提供一個數據模型,其中包含一個或多個 XML 實例文檔。表單操縱實例文檔并將 XML 提交到后端系統。因為 Schematron 本身是 XML,XForms 可以很容易地將它作為表單數據模型的一部分對待。
XForms 1.0 規范的第二版在 2006 年 3 月 14 日的發布是一個重要的里程碑。不久之后,alphaWorks 就提供了包含 Schematron 支持的 XML Forms Generator 更新。
XML Forms Generator 是什么?
XML Forms Generator 在表單開發方面提供了飛躍性進步。它快速自動地產生有效和功能性的表單,其中包含嵌入在 XHTML 文檔中的 XForms 標記。表單生成過程的輸入可以是有或沒有 XML 模式的 XML 數據實例,也可以是 Web Services Description Language(WSDL)文檔。
XML Forms Generator 是開放源碼的 Eclipse 工作臺的一個插件(見 參考資料),它是 2005 年 4 月在 alphaWorks 上首次發布的。參考資料 中有 XML Forms Generator 的 alphaWorks 頁面的鏈接,可以在這個頁面上進一步了解和安裝這個工具。
什么是 Schematron?
XML 模式廣泛用來靜態地描述 XML 的結構和內容,它非常適合這個用途。但是,它在實例的動態分析方面功能有限。例如,在 XML 模式中,不能這樣約束 XML 文檔:“元素 A 和 B 的值的和必須等于 100。”
在 Schematron 中,可以輕松地指定這樣的約束。與 XML 模式相似,Schematron 本身是 XML,因此自然地適合 XForms,XForms 本身是一個用于操縱 XML 數據的 XML 標記。Schematron 使用很小的標記集和 XPath 等熟悉的語法,因此它很容易學習和編寫,但是也很強大。
國際標準化組織(ISO)正在對 Schematron 進行標準化;已經形成了一個規范草案(見 參考資料)。在目前,Schematron 1.5 已經被廣泛采用,而且 XML Forms Generator 只處理 Schematron 1.5 文檔。
Schematron 文檔基本上是一組應用于 XML 數據的約束??梢砸詢煞N方式之一表達具體的 Schematron 約束:
true
。 true
,那么文檔將處于無效狀態。 Schematron 允許將斷言和報告一起分組在稱為規則 的結構中,然后將這些規則一起分組在模式 中。
可以使用 XPath 指定測試條件,還可以指定應用測試條件的上下文。Schematron 作者還可以提供在違反條件時應用的文本。這些文本應該是人可閱讀的,用來向正在操縱數據實例的最終用戶進行說明。另外,這些文本也可以具有更強的技術性,從而向正在構造 XML 實例的 XML 開發人員指出 XML 實例必須符合給定 Schematron 文檔中定義的約束。
在本文中,我們使用 清單 1 中的簡單 XML 實例文檔。
|
清單 1 中的 XML 實例文檔引用一個稱為 Simple.xsd 的模式,這個模式的內容見 清單 2。
|
清單 2 中的 XML 模式文檔聲明元素 A 和元素 B 的類型是 integer
。但是,XML 模式無法定義對這兩個元素的值的約束 —— 例如,它們的和等于 100。但是,在 Schematron 中很容易定義這個約束,見 清單 3。
|
盡管目前對 Schematron 的介紹還很簡短,但是您可以很容易地看出這個文檔的作用。對于應用這個文檔的任何 XML 數據,A 和 B 的和值必須等于 100,這是由惟一的 assert
元素的 test
屬性中的 XPath 表達式聲明的。
在 XML Forms Generator 中如何指定 Schematron 文檔?
在 XML Forms Generator 中,使用 XML Forms Generator 首選項類別下面的全局首選項設置(Window > Preferences)指定在生成表單期間要處理的 Schematron 文檔。
可以用兩種操作之一指定 Schematron 文檔。在后面會深入討論這些操作,但是目前只需知道能夠選擇這些選項之一來激活 Schematron schema location 首選項。然后可以選擇 Browse 來指定要應用于生成的表單的模式文檔(見 圖 1)。
有時候,Schematron 約束包含在 XML 模式文檔中,常常在 XML 模式的 appinfo
元素中。但是 XML Forms Generator 只處理單獨的 Schematron 文檔。
如何將約束應用于表單?
在 XForms 中,可以為實例數據指定約束,必須滿足約束才能提交此數據。Schematron 首選項頁面中的第一個選項 Apply constraints found in a schematron schema 讓 XML Forms Generator 將 Schematron 文檔中定義的約束應用于它生成的任何 XForms 文檔。
XForms 將約束綁定到實例數據,從而應用約束。如果對 清單 1 中的數據運行 XML Forms Generator,使用 清單 3 中的 Schematron 文檔并選擇 Apply constraints 選項,那么會產生具有 清單 4 中的 XForms 綁定的表單。
|
這個 XForms 綁定元素有兩個屬性 nodeset
和 constraint
,它們都是 XPath 表達式。在 清單 4 中,nodeset
屬性描述實例文檔中將受到約束的節點。在這個示例中,XForms instance()
函數指出命名的實例中的所有數據都受到約束。constraint
屬性包含一個布爾表達式,它定義數據必須符合的條件。這個 XPath 表達式實施在 Schematron 文檔中看到的約束,即元素 A 和 B 的和值必須等于 100。
如果這個表達式的計算結果不是 true
,那么 nodeset
屬性指定的數據(在這個示例中是整個文檔)就是無效的,不能提交。圖 2 顯示 XML Forms Generator 生成的簡單表單在 Mozilla Firefox 中的樣子。
在 圖 2 中,如果修改 A 和 B 的值,讓它們的和不等于 100,那么應用于這個表單的約束就會起作用。在這種情況下,按 Submit 按鈕時什么事情也不會發生,因為綁定使當前數據成為無效的。另一方面,如果提供了可接受的值,那么按 Submit 按鈕就會導致提交 XML 數據。
如何為被違反的條件提供詳細消息?
XForms 還可以動態地隱藏或顯示控件,這同樣要在數據上使用綁定,但是這一次使用稱為 relevant
的模型項屬性(XForms 規范詳細解釋了 XForms 模型項屬性,見 參考資料)。XML Forms Generator 首選項(圖 1)中提供的另一個 Schematron 選項 Generate validation message outputs from schematron messages 利用這種機制有條件地顯示 Schematron 文檔中為各個斷言和報告指定的消息。
在這個示例中,希望根據相關 Schematron 斷言或報告指定的測試來分別控制每個消息的顯示。因此,每個斷言或報告有自己的相關性綁定,就像 清單 5 中這樣。
|
清單 5 顯示的綁定是為 Schematron 示例文檔中的約束生成的。與約束綁定一樣,這個綁定元素有一個 nodeset
屬性,這個屬性指定綁定將應用于 XML 數據實例中的哪個節點(在這個示例中是 Schematron 文檔)。每個元素還包含一個 relevant
屬性,它根據 Schematron 文檔中對應的斷言或報告的測試指定條件。只有在 relevant
屬性值的計算結果為 true
的情況下,nodeset
屬性值指定的節點才是相關的。如果一個數據節點是相關的,那么瀏覽器會顯示與這個節點關聯的任何 XForms 控件。如果節點不是相關的,那么通常會隱藏任何關聯的控件。
因為表單可以將 Schematron 文檔本身作為實例數據使用,所以可以將控件綁定到 Schematron 文檔中的節點。對于這些節點,希望顯示文本而不是提供輸入數據的機會,所以 xforms:output
控件是自然的選擇。
因為已經有了對 Schematron 消息應用相關性的數據綁定,所以可以使用 output
元素上的 bind
屬性將每個控件與一個消息綁定在一起,見 清單 6。
|
圖 3 中的屏幕圖顯示這個表單在 Firefox 中的樣子,其中值的和不等于 100。
清單 7 給出完整的表單源代碼,它是用約束生成和消息生成選項生成的。注意兩個實例:一個實例引用 XML 實例數據,另一個引用 Schematron 文檔。
|
進一步的應用方向
在本文中,通過使用一個包含單一斷言的簡單 Schematron 文檔,演示了 XML Forms Generator 的 Schematron 處理功能。XML Forms Generator 可以處理包含任意數量的規則聲明的 Schematron 文檔,還可以處理 Schematron report
元素和 Schematron assert
元素。
當然,您可能希望用約束在比較復雜的表單中實現其他效果。例如,當違反條件時,可能希望在信息性消息中提供違反條件的字段的鏈接。例如,Origo Standards Ltd. 開發的 Instance Validator 表單(見 參考資料)允許導航到發生問題的字段附近。但是注意,即使在簡單的示例中,也可能不容易判斷哪個字段是錯的。例如,如果 A 和 B 的和不等于 100,那么不能只指出 A 錯了或 B 錯了。
生成的表單沒有引用樣式表,它包含的格式化特性也不多。XML Forms Generator 提供了本文沒有討論的許多選項,可以使用它們改進表單的外觀和功能。XML Forms Generator 在 Eclipse 幫助系統中內置了豐富的文檔。另外,它提供了許多示例,包括一個與本文示例相似的簡單 Schematron 示例。還可以使用 Visual XForms Designer(也可以從 alphaWorks 獲得,見 參考資料)根據自己的需要調整生成的表單。
利用這些免費工具,就可以輕松地構建功能完整的符合標準的表單。
原文轉自:http://www.anti-gravitydesign.com