跳转到内容

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
华夏公益教科书