如何用 XPath 统计指定区段中的必填控件?
数据阿明
结论
先检查公式运行时能访问的 XML,确认控件是否对应带有 required 属性的元素。原公式只统计 scnElectricalWork 的后代中,required 属性值恰好为字符串 true 的元素。如果属性值是 true(),或者必填设置保存在表单定义中、没有出现在当前实例数据里,公式就不会按预期计数。
题目给出的公式是:
count(//scnElectricalWork//*[@required='true'])
按 XML 中的实际值调整
如果运行时可访问的 XML 中确实有这样的元素:
<control required="true()"/>
可以把比较值改成字符串 true():
count(//scnElectricalWork//*[@required = 'true()'])
属性值为 true 时,原公式的比较值才会匹配。XPath 不会把属性内容当作 XPath 表达式执行;@required = 'true()' 比较的是属性的文本值。
检查公式的求值范围
在 Test Form 或生成的 XML 中,检查以下内容:
scnElectricalWork是否是实际元素名,且位于公式可访问的文档中。- 这些元素上是否存在必填属性,属性值是
true、true()还是其他内容。 - 这些元素是否是
scnElectricalWork的后代。当前的*只匹配元素节点,不匹配scnElectricalWork自身。
如果必填状态只配置在 Orbeon 表单定义的控件或绑定信息中,而表单实例数据没有对应的 required 属性,那么在实例数据上运行 count() 无法直接统计表单定义中的必填控件。此时需要确认 Orbeon 提供的表单定义访问方式,或按业务规则显式计算必填项数量。仅改写这个 XPath 路径无法解决问题。
注意事项
如果目标 XML 使用命名空间,路径中的元素名也要使用该 XPath 求值环境支持的命名空间前缀。还要确认公式的计算节点上下文:绝对路径 // 会从当前 XPath 文档根部查找,但不会自动切换到另一个 XML 文档或表单定义。
备注:内容仅供参考。
