如果选择“以上都不是”选项,如何标记XForms复选框无效?

时间:2011-01-03 19:31:39

标签: xforms orbeon

情景:

<xf:select appearance="full">
    <xf:item>
        <xf:label>Vanilla</xf:label>
        <xf:value>vanilla</xf:value>
    </xf:item>
    <xf:item>
        <xf:label>Strawberry</xf:label>
        <xf:value>strawberry</xf:value>
    </xf:item>
    <xf:item>
        <xf:label>None of the above</xf:label>
        <xf:value>none</xf:value>
    </xf:item>
</xf:select>

如果选择“以上都不是”选项,如果同时选择了任何其他选项,则控件应标记为无效。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用如下所示的XPath约束来执行此操作:

<xf:bind
    ref="my-value"
    constraint="
        if (tokenize(., '\s+') = 'none') then
            count(tokenize(., '\s+')) = 1
        else
            true()"/>

这是做什么的:

  • 如果选择了“无”值,请确保只有该值(count() = 1
  • 如果不是这样,则控件被标记为无效
  • 如果未选择“无”选项,则控件有效

另外,或者另外,正如Alex指出的那样,当用户选择“none”选项时,你可以自动取消选择其他选项:

<xf:bind
    ref="my-value"
    calculate="if (tokenize(., '\s+') = 'none') 'none' else ."
    readonly="false()"/>

这是做什么的:

  • 如果选择了“none”值,则确保该值仅设置为“none”
  • 否则,保持该值不变
  • 还要确保该值不是readonly(这将是使用calculate时的默认值)

更新2016-11-25:

原始解决方案也可以表示为:

<xf:bind
    ref="my-value"
    constraint=". = 'none' or count(tokenize(., '\s+')) != 1"/>

答案 1 :(得分:0)

contains()xpath函数最适合您的要求。代码如下。

<xforms:bind nodeset="instance('myform')/node1"
     constraint="not(contains(.,'none'))" />

然而正如其他人所说,如果你不想将它添加到你的选择中,你可以用''替换'none',即使用户选择了它。