Orbeon 2018.1提交时可复用组件重复节字段缺失fr:relevant属性
关于Orbeon 2018.1可复用组件重复节字段缺失fr:relevant属性的问题
我来帮你分析这个问题的情况和可行的解决思路:
这是已知问题吗?
是的,Orbeon 2018.1版本确实存在这个相关的已知bug。在早期版本中,当可复用组件包含带有可见性条件的重复节字段时,表单提交序列化过程中,这些重复节内的字段不会自动带上fr:relevant属性,而其他非重复节内的字段则能正常生成该属性。这个问题主要是当时重复节组件的属性序列化逻辑存在漏洞,没有正确处理嵌套在可复用组件内的重复字段状态。
可行的解决办法
1. 调整事件处理逻辑(修正你之前的尝试)
你之前尝试用xf:insert手动添加属性但没成功,大概率是因为事件触发时机和上下文指向不对。xforms-disabled/xforms-enabled事件是控件状态变化时触发,但此时修改的可能是控件节点而非表单实例节点,导致提交时无法被序列化。建议改用表单提交前的事件来处理,比如xxforms-prepare或xforms-submit:
<xf:action event="xxforms-prepare"> <!-- 为重复节内隐藏的字段添加fr:relevant="false" --> <xf:insert context="instance('fr-form-instance')//*[not(@visible = 'true') and ancestor::fr:repeat]" origin="xf:attribute('fr:relevant', 'false')"/> <!-- 移除重复节内显示字段的fr:relevant属性 --> <xf:delete ref="instance('fr-form-instance')//*[@visible = 'true' and ancestor::fr:repeat]/@fr:relevant"/> </xf:action>
这段代码会在表单准备提交时,直接操作表单实例节点,确保fr:relevant属性被正确添加或移除。
2. 升级Orbeon版本(最彻底的方案)
这个bug在Orbeon后续的版本(比如2019.1及之后的稳定版)中已经被官方修复。如果你的项目允许升级,这是最省心的解决方式,后续版本对重复节和可复用组件的属性处理逻辑做了优化,能自动维护fr:relevant属性。
3. 自定义序列化事件处理
如果暂时无法升级,可以通过监听xxforms-serialize事件,在表单序列化提交的最后阶段手动补充属性:
<xf:action event="xxforms-serialize"> <xf:var name="hidden-repeat-fields" value="instance('fr-form-instance')//*[not(@visible = 'true') and ancestor::fr:repeat]"/> <xf:insert context="$hidden-repeat-fields" origin="xf:attribute('fr:relevant', 'false')"/> </xf:action>
这个事件会在表单实例被序列化为提交内容前触发,确保修改的属性能被包含在最终提交的数据里。
内容的提问来源于stack exchange,提问作者masha.knezevic
相关产品推荐
相关产品推荐

