我在 Tomcat 8 上使用 Orbeon 2019.2 CE,使用普通的 XForms。
我有 xml 文档的 xml 架构,将由几个人完成,所以我需要知道文档在完成之前是否有效。对于日期字段,我了解创建“日期或空白”类型的三种主要方法:
- 使用
xsi:nil
- 制作 xs:date 和空字符串的联合类型
- 使用包含长度为 0 或 1 的 xs:date 的列表类型。
我尝试了第二种和第三种方法,这对 xml 验证按预期工作,但是在我在模型中指定模式的 XForms 中,datepicker 控件似乎不适用于自定义类型。我想使用模式验证并让一个空的日期字段有效。(我知道xf:date
允许没有价值与xs:date
不允许)。不使用模式验证时没有问题,但我真的希望能够使用它,因为它在某种程度上“外部化”了验证规则。我也在使用表单运行错误摘要组件。当使用验证(<model schema='uri_to_schema'>
)和模式中的“日期或无”类型(如上所述)时,我看到了:
- 如果日期字段绑定未指定
xs:date
orxf:date
,则该xf:input
字段不会出现日期选择器。键入格式为“2000-01-01”的日期是有效的,空白字段是有效的,并且其他任何内容都被标记为无效(通过错误组件和外部验证)。我还注意到 Orbeon 知道这是一种自定义类型,因为该类xforms-type-custom-date-or-nothing
出现在 HTML 中(“date-or-nothing”是类型的名称)。 - 如果我
type='xs:date'
为日期字段输入绑定,则不会出现日期选择器,并且输入被标记为无效(直到您输入日期值) - 如果我放入
type='xf:date'
绑定,则该字段最初显示时没有日期选择器。如果我输入了一个有效的日期(格式:yyyy-mm-dd),它不会被标记。如果我放了其他任何东西(比如'abc'),它会被错误组件标记,然后日期选择器会出现,但它会是空的。但是,在 FormInspector 中,该字段仍然具有无效值,并且文档(通过外部验证)无效。如果我随后从日期选择器中选择了一个有效日期,标记的错误就会消失,但该字段再次为空白。 - 如果我将模式更改为使用
xs:date
而不是自定义类型(“date-or-nothing”),那么使用模式验证一切正常,除了文档在具有日期值之前无效。 - 我在 xform 中引用了架构实例。我确实尝试通过在 xform 中包含模式的命名空间,然后将
type='mydoc:date-or-nothing'
. - 如果我从模型中删除模式并
xf:date
在绑定中使用,一切都很好,但现在我没有模式验证。
有没有人可以选择使用自定义类型并显示日期选择器?我没有看到太多关于在 xforms 中使用 XML 模式的文档,所以我猜这可能是一个不受支持的“边缘情况”。有没有办法“强制”Orbeon 渲染日期选择器?(我查看是否可以在那里指定“form-runner”组件,但文档只提到了其他日期控制类型)。在搜索中,我想我看到 xforms 规范允许在“xf:input”上使用“appearance='date'”属性,但这可能是错误的,因为我找不到其他提及这一点。
如果我不得不放弃对任何具有日期字段的文档的基于模式的验证,那将是非常令人失望的。在某些情况下,我可以“逃避”让文档的第一个贡献者必须填写日期字段,但有这个选项会好得多。感谢您的任何建议!