跳转到内容

XForms/Facet 验证

来自维基教科书,开放的书籍,开放的世界

XML 模式包含大量的数据元素约束信息,而不仅仅是数据类型。对特定数据类型的这些限制被称为“方面”。不同的数据类型具有不同类型的方面。例如,字符串可能具有最小和最大长度值,而整数可能具有最小和最大数值。

此程序演示了 XForms 如何根据 XML 模式中的方面来验证数据集。

注意: 此程序在 Firefox 0.6 扩展中无法运行。

X-Smiles 浏览器用于演示此程序。

屏幕图像

[编辑 | 编辑源代码]

此屏幕图像取自 X-Smiles 的 XForms 实现。

使用 X-Smiles 进行方面验证

请注意,第二个字段的长度至少为三个字符,因此该字段无效,并且根据无效字段的 CSS 样式,背景被设置为粉红色。

XML 模式 (schema.xsd)

[编辑 | 编辑源代码]

这是一个简单的 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 demonstration of XML Schema string facets.</xs:documentation>
      </xs:annotation>
      <xs:complexType>
         <xs:sequence>
            <xs:element name="string-length-2">
               <xs:simpleType>
                  <xs:restriction base="xs:string">
                     <xs:length value="2"/>
                  </xs:restriction>
               </xs:simpleType>
            </xs:element>
            <xs:element name="string-min-3">
               <xs:simpleType>
                  <xs:restriction base="xs:string">
                     <xs:minLength value="3"/>
                  </xs:restriction>
               </xs:simpleType>
            </xs:element>
            <xs:element name="string-max-5">
               <xs:simpleType>
                  <xs:restriction base="xs:string">
                     <xs:maxLength value="5"/>
                  </xs:restriction>
               </xs:simpleType>
            </xs:element>
            <xs:element name="string-5-7">
               <xs:simpleType>
                  <xs:restriction base="xs:string">
                     <xs:minLength value="5"/>
                     <xs:maxLength value="7"/>
                  </xs:restriction>
               </xs:simpleType>
            </xs:element>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:schema>

示例实例 (instance.xml)

[编辑 | 编辑源代码]
<?xml version="1.0" encoding="UTF-8"?>
<Data
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="schema.xsd">
   <string-length-2>MN</string-length-2>
   <string-min-3>abcd</string-min-3>
   <string-max-5>abcd</string-max-5>
   <string-5-7>abcdef</string-5-7>
</Data>

示例程序

[编辑 | 编辑源代码]

以下程序从两个外部文件(schema.xsd 和 instance.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>Facet validation using X-Smiles.</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: medium;
            padding-right: 5px;
            width: 130px;
         }
         
         *:required {
             background-color: yellow;
         }
         
         *:invalid  {
            background-color: pink;
         }
      </style>
      <xf:model id="test" schema="schema.xsd">
         <xf:instance src="instance.xml" />
      </xf:model>
   </head>
   <body>
      <xf:group model="test" nodeset="/Data">
         <p>
            <xf:input ref="string-length-2" incremental="true">
               <xf:label>Length exactly 2:</xf:label>
            </xf:input>
         </p>
         <p>
            <xf:input ref="string-min-3" incremental="true">
               <xf:label>Length 3 or more:</xf:label>
            </xf:input>
         </p>
         <p>
            <xf:input ref="string-max-5" incremental="true">
               <xf:label>Length 5 or less:</xf:label>
            </xf:input>
         </p>
         <p>
            <xf:input ref="string-5-7" incremental="true">
               <xf:label>Length 5 to 7:</xf:label>
            </xf:input>
         </p>
      </xf:group>
   </body>
</html>

加载 XML 模式和实例数据的两行代码是

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

另请注意,输入字段的 incremental 属性设置为 true。这允许逐字符验证。每次按键时都会重新验证表单。

下一页: 动态加载 JavaScript | 上一页: 使用模式类型验证
首页: XForms
华夏公益教科书