XRX/配置文件编辑器
您有一个 XML 配置文件,一次只有一个用户可以编辑它。您希望简化配置文件编辑,以便非技术用户(不了解 XML)或偶尔用户不会在编辑文件时出错。
请注意,如果多个用户可能同时编辑同一个文件或记录,则此方法可能不合适。有关此过程的更多详细信息,请参阅记录锁定部分。
我们将把整个文件加载到单个 XForms 实例中,对其进行编辑,然后保存整个文件。这可以通过在 XForms 应用程序中进行一次提交和在 eXist(或类似数据库)中进行一次 store() 操作来完成。即使配置文件非常复杂且包含多个部分和多个重复元素,也可以完成此操作。无论文件复杂程度如何,您只需要在服务器上调用一个函数来存储文件。
假设该文件存储在单个 eXist 集合中,例如 my-config.xml。要将此文件加载到 XForms 应用程序中,只需将文档放入 XForms 模型中的一个实例中
<html xmlns:xf="http://www.w3.org/2002/xforms">
<head>
<xf:model>
<xf:instance src="my-config.xml" id="config"/>
</xf:model>
</head>
<body>
...
</body>
</html>
然后,您可以通过在模型中添加一个提交元素来保存文件,该元素将在客户端数据发生更改后将文件保存回数据库。
<xf:submission id="save" ref="config" method="post"/>
...
<xf:submit id="save">
<xf:label>Save</xf:label>
</xf:submit>
请注意,在此示例中,您需要使用 "post" 而不是 "put"。提交元素在您的表单中创建一个带有 "保存" 标签的按钮。
有很多方法可以 "自动生成" 用于在浏览器中编辑配置文件的 XForms 应用程序,即使您的配置文件很复杂,并且包含多个重复元素。
一种方法是使用一个转换程序,该程序将 XML 模式转换为 XForms 文件。一个例子是 NIEM 转换。尽管存在其他此类转换的示例,但大多数示例要求您拥有配置文件的 XML 模式。如果您没有 XML 模式,则有一些工具可以根据一个或多个实例文档生成 XML 模式。
如果您没有 XML 模式,则可以使用商业 XForms 工具(如 IBM Workplace Forms Designer) "绘制" 您的 XForms 客户端。这个拖放环境使非程序员可以轻松构建和维护复杂的表单。
如果您正在构建一个预算有限的表单,则另一个选择是使用 Orbeon XForms Builder,它是一个 XForms 应用程序,可以为您构建表单。
如果您有一个安全的 Intranet,则可以使用 HTTP PUT 运算符将配置文件直接保存到 Web 文件系统。有时,您需要能够在允许保存之前对用户进行身份验证。这可以通过传统的登录和会话管理系统来完成,或者您可以创建一个具有正确权限的单个脚本。
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace xmldb="http://exist-db.org/xquery/xmldb";
(: put the collection we want to save our data to here :)
let $my-collection := '/db/config-files'
let $my-config-file-name := 'my-config.xml'
(: get the data we want to update from the HTTP POST :)
let $my-posted-data := request:get-data()
(: make sure we have write access to this collection :)
let $login := collection($my-collection, 'my-userid', 'my-password')
let $store-return-status := xmldb:store($my-collection, $my-config-file-name, $my-posted-data)
(: this is what we return. You can also return an XHTML file. :)
return
<return>
<message>File {$my-config-file-name} saved in collection {$my-collection}</message>
<result-code>{$store-return-status}</result-code>
</return>