1

设想:

<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>

When the "None of the above" option is selected, if any other option is selected as well, the control should be marked as invalid. 我怎样才能做到这一点?

4

2 回答 2

2

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

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

它的作用如下:

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

或者,或者另外,正如亚历克斯在上面指出的那样,当用户选择“无”选项时,您可以自动取消选择其他选项:

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

这是做什么的:

  • 如果选择了“无”值,则确保该值仅设置为“无”
  • 否则,保持原样
  • 还要确保该值不是只读的(这将是使用计算时的默认值)

2016 年 11 月 25 日更新:

原解也可以表示为:

<xf:bind
    ref="my-value"
    constraint=". = 'none' or count(tokenize(., '\s+')) != 1"/>
于 2011-01-03T19:34:42.437 回答
0

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

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

但是,正如其他人所说,如果您不希望将其添加到您的选择中,即使用户选择了它,您也可以将 'none' 替换为 ''。

于 2011-09-08T13:10:52.417 回答