將 Schematron 約束自動應用于 XForms 文檔

發表于:2007-05-24來源:作者:點擊數: 標簽:Schematron應用于XForms約束自動
隨著 XForms 規范第二版的發布,IBM alphaWorks 發布了一系列新的免費工具,包括 XML Forms Generator,從而幫助加快符合這個標準的表單 開發 。最近的更新允許將 Schematron 1.5 文檔中定義的約束應用于生成的表單。Schematron 本身是一個 XML 標記,它為業
隨著 XForms 規范第二版的發布,IBM alphaWorks 發布了一系列新的免費工具,包括 XML Forms Generator,從而幫助加快符合這個標準的表單開發。最近的更新允許將 Schematron 1.5 文檔中定義的約束應用于生成的表單。Schematron 本身是一個 XML 標記,它為業務規則和數據關系提供了規范,這是 XML 模式不能提供的。XForms 本身提供了對 XML 模式的檢驗,而對 Schematron 約束的任何使用必須構建在表單本身中。目前開發組織正在努力將 Schematron 約束與 XForms 集成起來 —— 比如 Origo Standards, Ltd 構建的 Instance Validator 表單(參見 參考資料)—— 很自然,下一步是自動應用這些約束。

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 約束:

  1. 作為斷言,這意味著對應用于實例文檔的特定條件進行測試。實例文檔要想有效,所有斷言的計算結果都必須是 true。
  2. 作為報告,在這種情況下也對應用的條件進行測試。但是,測試的意義與斷言的意義正好相反。如果測試結果是 true,那么文檔將處于無效狀態。

Schematron 允許將斷言和報告一起分組在稱為規則 的結構中,然后將這些規則一起分組在模式 中。

可以使用 XPath 指定測試條件,還可以指定應用測試條件的上下文。Schematron 作者還可以提供在違反條件時應用的文本。這些文本應該是人可閱讀的,用來向正在操縱數據實例的最終用戶進行說明。另外,這些文本也可以具有更強的技術性,從而向正在構造 XML 實例的 XML 開發人員指出 XML 實例必須符合給定 Schematron 文檔中定義的約束。

在本文中,我們使用 清單 1 中的簡單 XML 實例文檔。


清單 1. 簡單 XML 文檔
            <?xml version="1.0"?>
            <root xmlns="http://www.example.org"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.example.org Simple.xsd">
            <A>100</A>
            <B>0</B>
            </root>

清單 1 中的 XML 實例文檔引用一個稱為 Simple.xsd 的模式,這個模式的內容見 清單 2。


清單 2. 簡單 XML 文檔的 XML 模式
            <?xml version="1.0" encoding="UTF-8"?>
            <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.example.org"
            xmlns:ex="http://www.example.org"
            elementFormDefault="qualified">
            <xsd:element name="root" type="ex:rootType"/>
            <xsd:complexType name="rootType">
            <xsd:sequence>
            <xsd:element name="A" type="xsd:integer"/>
            <xsd:element name="B" type="xsd:integer"/>
            </xsd:sequence>
            </xsd:complexType>
            </xsd:schema>

清單 2 中的 XML 模式文檔聲明元素 A 和元素 B 的類型是 integer。但是,XML 模式無法定義對這兩個元素的值的約束 —— 例如,它們的和等于 100。但是,在 Schematron 中很容易定義這個約束,見 清單 3。


清單 3. 簡單 XML 文檔的 Schematron 定義
            <?xml version="1.0"?>
            <sch:schema xmlns:sch="http://www.ascc.net/xml/schematron">
            <sch:title>AB Example</sch:title>
            <sch:ns uri="http://www.example.org" prefix="ex" />
            <sch:pattern name="Our Only Pattern" id="pattern1">
            <sch:rule context="/ex:root" id="sum100">
            <sch:assert test="ex:A + ex:B = 100">
            The sum of the values of A and B must be 100.
            </sch:assert>
            </sch:rule>
            </sch:pattern>
            </sch:schema>

盡管目前對 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)。


圖 1. XML Forms Generator 中的 Schematron 處理選項
XML Forms Generator 中的 Schematron 處理選項

有時候,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 綁定的表單。


清單 4. 對表單提交進行約束的 XForms 綁定
            <xforms:bind nodeset="instance('instance_model_root')"
            constraint="instance('instance_model_root')[ex:A + ex:B = 100]"/>

這個 XForms 綁定元素有兩個屬性 nodesetconstraint,它們都是 XPath 表達式。在 清單 4 中,nodeset 屬性描述實例文檔中將受到約束的節點。在這個示例中,XForms instance() 函數指出命名的實例中的所有數據都受到約束。constraint 屬性包含一個布爾表達式,它定義數據必須符合的條件。這個 XPath 表達式實施在 Schematron 文檔中看到的約束,即元素 A 和 B 的和值必須等于 100。

如果這個表達式的計算結果不是 true,那么 nodeset 屬性指定的數據(在這個示例中是整個文檔)就是無效的,不能提交。圖 2 顯示 XML Forms Generator 生成的簡單表單在 Mozilla Firefox 中的樣子。


圖 2. Firefox 中的表單
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 消息
            <xforms:bind id="pattern_Our Only Pattern_rule_1_assert_1"
            nodeset="instance('instance_model_root_schematron')/
            sch:pattern[@name='Our Only Pattern']/sch:rule[1]/sch:assert[1]"
            relevant="instance('instance_model_root')[not( ex:A + ex:B = 100 )]"/>

清單 5 顯示的綁定是為 Schematron 示例文檔中的約束生成的。與約束綁定一樣,這個綁定元素有一個 nodeset 屬性,這個屬性指定綁定將應用于 XML 數據實例中的哪個節點(在這個示例中是 Schematron 文檔)。每個元素還包含一個 relevant 屬性,它根據 Schematron 文檔中對應的斷言或報告的測試指定條件。只有在 relevant 屬性值的計算結果為 true 的情況下,nodeset 屬性值指定的節點才是相關的。如果一個數據節點是相關的,那么瀏覽器會顯示與這個節點關聯的任何 XForms 控件。如果節點不是相關的,那么通常會隱藏任何關聯的控件。

因為表單可以將 Schematron 文檔本身作為實例數據使用,所以可以將控件綁定到 Schematron 文檔中的節點。對于這些節點,希望顯示文本而不是提供輸入數據的機會,所以 xforms:output 控件是自然的選擇。

因為已經有了對 Schematron 消息應用相關性的數據綁定,所以可以使用 output 元素上的 bind 屬性將每個控件與一個消息綁定在一起,見 清單 6。


清單 6. 顯示 Schematron 消息的控件
            <xforms:output bind="pattern_Our Only Pattern_rule_1_assert_1"
            model="model_root"/>

圖 3 中的屏幕圖顯示這個表單在 Firefox 中的樣子,其中值的和不等于 100。


圖 3. Firefox 中的表單,其中的值不符合 Schematron 約束
Firefox 中的表單,其中的值不符合 Schematron 約束

清單 7 給出完整的表單源代碼,它是用約束生成和消息生成選項生成的。注意兩個實例:一個實例引用 XML 實例數據,另一個引用 Schematron 文檔。


清單 7. 表單的源代碼
            <?xml version="1.0" encoding="UTF-8"?>
            <html xmlns="http://www.w3.org/1999/xhtml"
            xmlns:xforms="http://www.w3.org/2002/xforms"
            xmlns:sch="http://www.ascc.net/xml/schematron"
            xmlns:ex="http://www.example.org">
            <head>
            <title>AB Form</title>
            <xforms:model id="model_root" schema="../data/Simple.xsd">
            <xforms:instance id="instance_model_root" src="../data/Simple.xml"/>
            <xforms:instance id="instance_model_root_schematron" src="../data/Simple.sch"/>
            <xforms:bind id="pattern_Our Only Pattern_rule_1_assert_1"
            nodeset="instance('instance_model_root_schematron')/
            sch:pattern[@name='Our Only Pattern']/sch:rule[1]/sch:assert[1]"
            relevant="instance('instance_model_root')[not( ex:A + ex:B = 100 )]"/>
            <xforms:bind nodeset="instance('instance_model_root')"
            constraint="instance('instance_model_root')[ex:A + ex:B = 100]"/>
            <xforms:submission id="submit_model_root" ref="instance('instance_model_root')"
            action="http://xformstest.org/cgi-bin/showinstance.sh"
            method="post"/>
            </xforms:model>
            </head>
            <body>
            <xforms:group>
            <xforms:label>AB Form</xforms:label>
            </xforms:group>
            <xforms:input ref="instance('instance_model_root')/ex:A" model="model_root">
            <xforms:label>A</xforms:label>
            </xforms:input>
            <xforms:input ref="instance('instance_model_root')/ex:B" model="model_root">
            <xforms:label>B</xforms:label>
            </xforms:input>
            <xforms:output bind="pattern_Our Only Pattern_rule_1_assert_1" model="model_root"/>
            <xforms:submit submission="submit_model_root">
            <xforms:label>Submit</xforms:label>
            </xforms:submit>
            </body>
            </html>

進一步的應用方向

在本文中,通過使用一個包含單一斷言的簡單 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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97