跳轉到內容

XForms/從 XML 模式載入

來自華夏公益教科書

許多時候,您的資料的型別是在外部 XML 模式檔案中定義的。要使用此資訊,而不是必須顯式地將例項繫結到資料型別,您可以只加載 XML 模式檔案來初始化模型中的例項資料。資料型別將從 XML 模式檔案中推斷出來。

為此,您必須在模型中新增一個schema 屬性,其中引數的值是 XML 模式原始檔。請注意,引數是schema 而不是srcsrc 用於讀取例項資料。

   <xf:model id="test" schema="data-types.xsd">
      <xf:instance src="instance-data.xml"/>
   </xf:model>

螢幕影像

[編輯 | 編輯原始碼]

這是一個示例程式的螢幕影像。請注意,日期和布林資料型別的輸入表單是從 XML 模式自動推斷出來的,並且不同的控制元件被放置在使用者介面中。

將控制元件繫結到資料型別的示例

請注意,在此示例中,控制元件的順序也已更改。

[編輯 | 編輯原始碼]

從 XML 模式載入資料型別

XML 模式圖

[編輯 | 編輯原始碼]

以下是具有可見資料型別的 XML 模式圖。請注意,資料型別直接顯示在資料元素下方。此圖還使用虛線顯示可選資料元素以及資料元素的基數。

XML 模式圖 (XMLSpy)

示例程式

[編輯 | 編輯原始碼]
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xf="http://www.w3.org/2002/xforms"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <head>
      <title>Loading data from an XML Schema file</title>
      <style type="text/css">
      @namespace xf url("http://www.w3.org/2002/xforms");
         xf|input {
            display: table-row;
            line-height: 2em;
         }
         
         xf|label {
            display: table-cell;
            text-align: right;
            font-family: Ariel, Helvetica, sans-serif;
            font-weight: bold;
            font-size: small;
            padding-right: 5px;
            width: 150px;
         }
         
         *:required {
             background-color: yellow;
         }
         
         *:invalid  {
            background-color: pink;
         }
      </style>
      <xf:model id="test" schema="data-types.xsd">
         <xf:instance src="instance-data.xml"/>
      </xf:model>
   </head>
   <body>
      <xf:group model="test" nodeset="/Data">
         <xf:input ref="date">
            <xf:label>Date:</xf:label>
         </xf:input>
         <xf:input ref="string-required">
            <xf:label>Required String:</xf:label>
         </xf:input>
         <xf:input model="test" ref="string-optional">
            <xf:label>Optional String:</xf:label>
         </xf:input>
         <xf:repeat nodeset="string-unbounded">
         <xf:input ref=".">
            <xf:label>Unbounded String:</xf:label>
         </xf:input>
         </xf:repeat>
         <xf:input ref="integer">
            <xf:label>Integer:</xf:label>
         </xf:input>
         <xf:input ref="positive-integer">
            <xf:label>Positive Integer:</xf:label>
         </xf:input>
         <xf:input ref="short">
            <xf:label>Short:</xf:label>
         </xf:input>
         <xf:input ref="byte">
            <xf:label>Byte:</xf:label>
         </xf:input>
         <xf:input ref="unsignedByte">
            <xf:label>Unsigned Byte:</xf:label>
         </xf:input>
         <xf:input ref="boolean">
            <xf:label>Boolean:</xf:label>
         </xf:input>
      </xf:group>
   </body>
</html>

XML 模式

[編輯 | 編輯原始碼]
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="Data">
      <xs:annotation>
         <xs:documentation>A listing of 10 XML Schema data types</xs:documentation>
      </xs:annotation>
      <xs:complexType>
         <xs:sequence>
            <xs:element name="date" type="xs:date"/>
            <xs:element name="string-required" type="xs:string"/>
            <xs:element name="string-optional" type="xs:string" minOccurs="0"/>
            <xs:element name="string-unbounded" type="xs:string" maxOccurs="unbounded"/>
            <xs:element name="integer" type="xs:integer"/>
            <xs:element name="positive-integer" type="xs:positiveInteger"/>
            <xs:element name="short" type="xs:short"/>
            <xs:element name="byte" type="xs:byte"/>
            <xs:element name="unsignedByte" type="xs:unsignedByte"/>
            <xs:element name="boolean" type="xs:boolean"/>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:schema>

XML 例項

[編輯 | 編輯原始碼]
<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML instance file-->
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="data-types.xsd">
   <date>2006-09-21</date>
   <string-required>The quick brown fox jumped over the lazy dog.</string-required>
   <string-optional>This string is optional.</string-optional>
   <string-unbounded>One of many.</string-unbounded>
   <string-unbounded>Two of many.</string-unbounded>
   <string-unbounded>Three of many.</string-unbounded>
   <integer>-123</integer>
   <positive-integer>2</positive-integer>
   <short>4096</short>
   <byte>127</byte>
   <unsignedByte>255</unsignedByte>
   <boolean>true</boolean>
</Data>

測試資料型別是否從 XML 模式檔案正確載入的一種方法是嘗試輸入特定資料型別的無效值。XForms 應該自動檢查輸入欄位是否滿足 XML 模式檔案中指定的資料要求。

例如,在正整數字段中,您可以嘗試輸入“-1”。完成此操作並輸入“Tab”後,表單的背景應該以粉紅色顯示為警告。這就是螢幕應有的樣子

您顯示無效控制元件的方式由 CSS 檔案中的以下行控制

   *:invalid  {
      background-color: red;
   }

這被稱為偽元素。雖然沒有名為“invalid”的資料元素,但 XForms 只將此屬性新增到每個輸入控制元件,然後樣式表會根據您在樣式表中提供的屬性新增任何屬性。

此程式還使用 CSS 來顯示資料元素。

已知錯誤

[編輯 | 編輯原始碼]

請注意,如果不存在示例例項資料,則繫結不起作用。

除了本節之外,它可能在其他 Xform 平臺中不受支援。在 XSLTForms 中測試,它不起作用,最新版本截至 2010 年 6 月 9 日。使用 FormFaces,它起作用了,但無法正確渲染 css。

還存在跨瀏覽器相容性問題。

參考文獻

[編輯 | 編輯原始碼]

http://betterform.wordpress.com/using-schema-datatypes/ betterForm 內聯模式型別

下一頁: 驗證 | 上一頁: 表格列總計
主頁: XForms
華夏公益教科書