级别: 中级 Steve K Speicher (sspeiche@us.ibm.com), 高级软件工程师, IBM Jan J. Kratky (kratky@us.ibm.com), 顾问软件工程师, IBM Kevin E. Kelly (kekelly@us.ibm.com), 高级技术人员, IBM
2006 年 5 月 24 日 使用 XForms 技术可以为已有的 XForms 集合提供一个轻量级的编辑器。探讨一种方便、快捷的表单编辑方法来提高数据采集的效率。即使最简单的修改,表单编辑通常也需要单独的应用程序。XForms 处理 XML 数据并将其提交给服务器,因此非常适合进行简单的修改然后通过提交来重新部署。
无论高级编辑还是简单修改,多数复杂的表单都需要使用表单编辑环境。这些编辑器可能会占用大量资源。基于客户机的表单处理程序可以放在高端的个人计算机上,也可以放在低端的可移动设备上。没有强大计算机的用户可能无法更新需要快速修改和部署的表单。
如果能够重用用户设备如个人计算机或个人数字助理(PDA)上已经安装的 XForms 处理程序,就可以使用另一个表单来修改原来的表单。表单用于修改 XML 数据并提交以便进一步处理。这个 XML 实例数据也可以是已有表单的 XML 数据模型。换句话说,就是以 XForms 标记作为其数据模型的一个 XForms 应用程序。本文以疾病爆发表单、后续的修改和重新部署为例考察了这种方法。通过该例,我们说明了用轻量级编辑器快速编辑终端用户表单并立即部署这些表单的意义,可以改进数据采集。
关于 XForms
万维网联盟(W3C)开发 XForms 标准用于表单数据的表示和采集。如 W3C 推荐标准中所述,XForms 的目标是成为 “下一代 Web 表单”。与现有的 HTML 表单技术相比,XForms 具有一些特殊的优点。推荐标准中指出,“通过将传统 XHTML 表单划分成三部分 —— XForms 模型、实例数据和用户界面,它把表示和内容分开、允许重用、支持强类型,从而减少了与服务器通信的往复次数,提供了设备独立性,减少了对脚本的需求。” 随着新实现的涌现,原有实现的不断改进,XForms 日渐普及。现在有很多客户端或服务器端处理程序、编辑工具和工作流产品支持 XForms 标准。
本文描述了使用 XForms 修改表单的一般模式。关于 XForms 的更多 developerWorks 文章和其他参考资料请参阅 参考资料。
应用场景
我们将介绍一种使用表单报告疾病爆发的情形。报告疾病突发时会遇到这种情况,如果能够通过编辑取消、增加某些字段或者修改选项,用于采集数据的表单会更加方便。用表单采集数据的人员通过可移动设备收集和提交数据。某些人比如字段管理者有权快速修改和重新部署这些表单,以便采集的疾病突发信息更准确。用户通常离线填充这些表单然后建立网络连接并提交。
图 1. 示例用例
要编辑的表单
图 2 中的 Disease Outbreak 表单包含用户输入以分析可能出现的疾病暴发情况的基本信息(为了说明核心概念我们简化了表单)。数据采集人员使用该表单,它是主应用程序的一部分。必须了解该表单及其组成才能建立编辑它的表单。
Disease Outbreak 表单使用了基于简单字符串类型的基本字段控件。其他字段绑定到选择列表(<xforms:select1> 和 <xforms:select>)。为了简化日期录入,基于日期的字段与 XML Schema date 类型关联,处理程序提供日期选择器来输入日期。为了划分字段,可以简单地将控件划分到 <xforms:group> 中。
表单通过 Submit Form 按钮提交,这是一个 <xforms:submission>,它仅仅把与表单相联系的实例数据保存到磁盘。要加载外部表单来编辑该表单,可以单击 Edit Form 按钮,它使用 <xforms:trigger> 来启动 <xforms:load>。
图 2. Disease Outbreak 表单
完整源代码请参阅 下载 部分。
编辑表单
编辑器表单也称为元表单,不是要提供完整的编辑环境而是为一组表单提供简单的功能。该表单的 XML 实例数据就是前面突出显示的 XHTML + XForms 文档。确定哪些节点是要操纵的键值并将这些节点绑定到用户界面控件。
图 3. 编辑 Disease Outbreak 表单的表单
因为基本的应用场景是移动应用,所以 PDA 上的元表单与此相同。它使用模拟器运行 Mozilla 的 Minimo 浏览器和 Mozilla XForms 扩展。
图 4. 编辑 Disease Outbreak 表单的表单(移动设备)
检查框用于分段,以便处理复杂的长表单。对该例来说,元表单允许修改表单中的三个主要方面:XForms 数据模型、Victim 信息和 Outbreak 细节。为了降低表单的复杂性,没有显示这些表单部件的所有可能属性。
增加新的输入字段
Disease Outbreak 表单已经部署,而字段管理者决定为数据采集者增加一个字段来记录一般性说明。为此,管理者打开 Disease Outbreak 表单的元表单,并导航到 Outbreak Details 部分。
图 5. 输入字段
想想如何来实现。可以使用 <xf:repeat> 显示输入字段列表,如 清单 1 所示。
清单 1. 遍历输入节点
<xforms:repeat model="model_html" id="repeat_outbreak_input"
nodeset="/xhtml:html/xhtml:body/xforms:group[@id =
'outbreak_details']/xforms:input">
<xforms:input ref="./@ref" model="model_html">
<xforms:label>ref</xforms:label>
</xforms:input>
<xforms:input ref="xforms:label" model="model_html">
<xforms:label>label</xforms:label>
</xforms:input>
</xforms:repeat>
|
循环用 ID “outbreak_details” 从 <xf:group> 元素中选择输入字段。将输入字段分组并为每个组提供一个惟一的标识符,这样就可以不依赖于各组在表单中顺序方便地选择分组。
选择 Add Input 来提供另一个 <xf:input> 元素。修改节点使其引用 /do:outbreak/notes 并设置标签 Notes:,会得到:
图 6. 增加 notes 输入字段
要输入新 <xf:input> 节点,可使用 <xf:trigger>,它与按钮很相似,调用 <xf:insert> 动作,如 清单 2 所示。
清单 2. 增加新输入字段的触发器
<xforms:trigger>
<xforms:label>Add Input</xforms:label>
<xforms:insert ev:event="DOMActivate" at="index('repeat_outbreak_input')"
position="after"
nodeset="/xhtml:html/xhtml:body/xforms:group[@id = 'outbreak_details']/xforms:input"
model="model_html"/>
</xforms:trigger>
|
激活该按钮时将在数据模型中插入新的输入节点,如上图所示。
要覆盖原来的表单,向下滚动然后选择 Save Form。可以将该提交动作 Save Form 连接到一个 Web 服务,通过它提交表单并重新部署。
重新打开原来的表单。图 7 显示了新增加的 Notes 输入字段。
图 7. 增加了 notes 输入字段的 Disease Outbreak 表单
清单 3 显示了表单的源代码。
清单 3. notes 输入字段
<xforms:input ref="/do:outbreak/notes" model="model_outbreak">
<xforms:label>Notes:</xforms:label>
</xforms:input>
|
通过这一节我们看到,元表单修改已有的表单再返回去进行快速处理是多么简单有效。您看到的是增加输入字段。还可以删除字段,修改标签或者改变字段绑定的数据节点。
为列表增加新选项
另一种情况是,Outbreak Details 部分可能没有共同的症状供数据采集人员选择,比方说头昏眼花。要增加症状,字段管理者需要加载元表单并修改症状选项。这样需要修改 Symptom <xforms:select 节点(参见 图 8):
图 8. 症状列表
这里再次利用 <xforms:repeat> 显示 <xforms:select> <xforms:item> 集合,如 清单 4 所示。
清单 4. notes 输入字段
<xforms:repeat model="model_html" id="repeat_item2_model_html"
nodeset="xforms:item">
<xforms:input ref="xforms:label" model="model_html">
<xforms:label>label</xforms:label>
</xforms:input>
<xforms:input ref="xforms:value" model="model_html">
<xforms:label>value</xforms:label>
</xforms:input>
</xforms:repeat>
|
<xforms:repeat> 嵌套在 <xforms:group> 中,便于选择 Symptom <xforms:select> 节点集。然后 <xforms:repeat> 选择 <xforms:item> 节点,这些节点组成了 Disease Outbreak 表单中 Symptoms 的选项。
为了增加标签 Dizziness 和值 dizziness,管理者选择 Add Symptom,如 图 9 所示:
图 9. 新增症状选项
如 图 9 中所示,这里也使用 <xforms:trigger> 和 <xforms:insert> 为 <xforms:select> 节点创建新的 <xforms:item>。
保存该表单并重新打开将在 <xforms:select> 中产生新的 <xforms:item>,如 图 10 所示:
图 10. 增加症状选项后的 Disease Outbreak 表单
该表单的源代码如 清单 5 所示。
清单 5. notes 输入字段
<xforms:item>
<xforms:label>Dizziness</xforms:label>
<xforms:value>dizziness</xforms:value>
</xforms:item>
|
通过这一节可以发现元表单的另一个优点,不需要了解表单编程的细节或者使用单独的开发工具就能快速更新表单。插入新的选项仅仅是一种可能的用法。使用这个简单的元表单还可以修改选项标签和值或者完全删除一个选项。
关于表单开发的说明
您也许发现探讨这些表单是如何创建和修改的很有价值。从 Disease Outbreak 表单开始,我们通过手工编写 outbreak.xsd 建立了它的数据模式。然后根据得到的 XML 模式生成一个示例 XML 文档。这里我们使用了基于 Eclipse 的 Web Tools Platform (WTP) 工具,具体而言就是对 XML Schema 执行 Generate > XML File 操作。然后使用 WTP XML 编辑器修改 XML 文档以便生成 XHTML + XForms 文件。我们使用 XML Forms Generator (XFG) 并选择新的 XML 文件,然后执行 Generate XHTML/XForm 操作。我们用 WTP XML 编辑器和 Compound XML Document Toolkit (CXDTK) 修改得到的文件。修改内容包括提供分组和使用已有的 CSS 样式表。
完成 Disease Outbreak 表单值后,我们可以自动生成修改它的表单。为了使用原来的 Disease Outbreak XHTML/XForm 文件作为外部数据模型生成元表单 XHTML/XForm 文件,我们选择 Disease Outbreak 表单(将其命名为 DiseaseOutbreak.xml)并执行 XFG 操作 Generate XHTML/XForm。最后我们使用 WTP XML 编辑器和 CXDTK 修改元表单来提供逻辑分组和删除不需要的输入字段。WTP XML 编辑器以及 CXDTK 提供内容辅助的编辑和验证。
总之,我们很快就开发出了表单,没有费多少事。运行这些例子的基本 XForms 处理程序是运行在 Firefox 1.5.0.2 上的 Mozilla XForms 扩展 0.5。
结束语
本文仅仅通过一些简单的例子来说明用 XForm 修改 XForm 的思路。可以扩展到其他的应用场合,比如:
- 增加或修改提示和帮助文本
- 改变控件类型(比如将 <xforms:select1> 改为 <xforms:select> 或者设置成开放选择或封闭选择)
- 增加或删除组
- 改变组和字段的顺序
- 修改数据模型绑定
对于传统的基于表单的应用程序来说,XForms 已经证明自身是一种可靠的、有用的表单技术。本文说明了 XForms 的另一种用法,也说明 XForms 可以大大简化应用程序。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Samples from XForms for XForms article. | x-xforms4xforms-source.zip | 5KB | HTTP |
|---|
参考资料 学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- 准备使用 XForms(developerWorks,2002 年 9 月):从头学习如何建立可扩展的、适合于任何平台的在线表单。
- 模型驱动的 XML 表单生成(developerWorks,2005 年 8 月):利用 XML Forms Generator、Model Driven Development 概念和 Eclipse Modeling Framework 从 XML 实例数据生成符合标准的表单。
- XML 技术文档库:developerWorks XML 专区提供大量技术文章和技巧、教程、标准以及 IBM 红皮书。
- W3C XForms 站点:学习和使用 XForms 的起点。
- XForms 1.0 Second Edition(W3C,2006 年 3 月):深入学习 XForms 规范,了解重用、强类型和对下一代 Web 表单的改进。
获得产品和技术
讨论
作者简介  | |  | Steve Speicher 是一位从事新标准研究的 IBM 高级软件工程师,Compound XML Document Toolkit 的首席开发人员。Speicher 先生是 W3C Compound Document Formats (CDF) 工作组的成员,他利用模型驱动的开发(MDD)来改进标准的开发。以前他曾经在 Rational 部门和 IBM 内部工具部门研究 “构建” 和软件配置管理(SCM)工具。 |
 | |  | Jan Joseph Kratky 是开发 XML Forms Generator 和 Visual XForms Designer 的技术主管,W3C XForms 工作组成员。Kratky 先生是一位 Sun 认证的 Java 程序员和 Web 组件开发人员,从 1997 年开始使用 Java 技术,2001 年开始接触 Eclipse 技术。他目前是位于北卡罗来纳 Research Triangle Park 的 IBM Emerging Software Standards 的一名软件工程师。 |
 | |  | Kevin E. Kelly 是一位从事软件标准的 IBM 高级技术人员。Kelly 先生曾经参加过 W3C XForms 工作组,现在是 W3C Compound Document Formats 工作组的主席。他主要研究基于开放标准的技术的开发,通过基于 XML 和模型驱动的方法更快、更有效地推动标准的采用。 |
对本文的评价
|