PAYATHON 2026

如何用 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 中,检查以下内容:

  1. scnElectricalWork 是否是实际元素名,且位于公式可访问的文档中。
  2. 这些元素上是否存在必填属性,属性值是 true、true() 还是其他内容。
  3. 这些元素是否是 scnElectricalWork 的后代。当前的 * 只匹配元素节点,不匹配 scnElectricalWork 自身。

如果必填状态只配置在 Orbeon 表单定义的控件或绑定信息中,而表单实例数据没有对应的 required 属性,那么在实例数据上运行 count() 无法直接统计表单定义中的必填控件。此时需要确认 Orbeon 提供的表单定义访问方式,或按业务规则显式计算必填项数量。仅改写这个 XPath 路径无法解决问题。

注意事项

如果目标 XML 使用命名空间,路径中的元素名也要使用该 XPath 求值环境支持的命名空间前缀。还要确认公式的计算节点上下文:绝对路径 // 会从当前 XPath 文档根部查找,但不会自动切换到另一个 XML 文档或表单定义。

备注:内容仅供参考。