XForms/从 XML 模式加载
许多时候,您的数据的类型是在外部 XML 模式文件中定义的。要使用此信息,而不是必须显式地将实例绑定到数据类型,您可以只加载 XML 模式文件来初始化模型中的实例数据。数据类型将从 XML 模式文件中推断出来。
为此,您必须在模型中添加一个schema
属性,其中参数的值是 XML 模式源文件。请注意,参数是schema
而不是src
。src
用于读取实例数据。
<xf:model id="test" schema="data-types.xsd">
<xf:instance src="instance-data.xml"/>
</xf:model>
这是一个示例程序的屏幕图像。请注意,日期和布尔数据类型的输入表单是从 XML 模式自动推断出来的,并且不同的控件被放置在用户界面中。
请注意,在此示例中,控件的顺序也已更改。
以下是具有可见数据类型的 XML 模式图。请注意,数据类型直接显示在数据元素下方。此图还使用虚线显示可选数据元素以及数据元素的基数。
<?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 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 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 内联模式类型