Orbeon Forms:通过按钮批量设置多组单选按钮值
问题解决方法
你的代码问题出在两次<xf:setvalue>遍历的是完全相同的节点集合,第二次设置的OK会直接覆盖第一次的Done值,所以最终所有节点都会变成OK。要实现批量分别设置,核心是区分两类单选按钮对应的节点,针对不同组分别赋值。
修正方案
根据Orbeon XForms的特性,你可以通过节点绑定的选项集来区分两类单选按钮,然后分别批量赋值:
<xf:action event="DOMActivate"> <!-- 给所有使用 Done/Not done 选项的单选按钮设置为 Done --> <xf:setvalue xxf:iterate="//SubScn2YearlyMaintenance//*[empty(*) and exists(xxf:binding(.)/xf:itemset/xf:item[xf:value = 'Done'])]" value="'Done'"/> <!-- 给所有使用 OK/Not OK 选项的单选按钮设置为 OK --> <xf:setvalue xxf:iterate="//SubScn2YearlyMaintenance//*[empty(*) and exists(xxf:binding(.)/xf:itemset/xf:item[xf:value = 'OK'])]" value="'OK'"/> </xf:action>
方案说明
xxf:binding(.):获取当前节点对应的XForms绑定定义,通过它可以访问单选按钮的选项集合exists(xxf:binding(.)/xf:itemset/xf:item[xf:value = 'Done']):判断当前节点的选项是否包含Done,以此区分属于Done/Not done组的单选按钮- 同理,第二个
<xf:setvalue>只针对选项包含OK的节点赋值
如果你的表单里两类节点有更直观的区分特征(比如节点名称包含特定前缀、父节点有特定标识),也可以简化遍历条件。比如假设Done组的节点都以done_开头:
<xf:action event="DOMActivate"> <xf:setvalue xxf:iterate="//SubScn2YearlyMaintenance//*[empty(*) and starts-with(local-name(), 'done_')]" value="'Done'"/> <xf:setvalue xxf:iterate="//SubScn2YearlyMaintenance//*[empty(*) and starts-with(local-name(), 'ok_')]" value="'OK'"/> </xf:action>
这样就能一次性完成50+任务的批量赋值,不用逐个设置字段。
内容的提问来源于stack exchange,提问作者Pete Atkin
相关产品推荐
相关产品推荐

