Как пометить флажки XForms недействительными, если выбрана опция "Ничего из вышеперечисленного"?

Сценарий:

<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 ответа

Вы можете сделать это с помощью ограничения XPath, которое выглядит следующим образом:

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

Это делает следующее:

  • если выбрано значение "none", убедитесь, что есть только это значение (count() = 1)
  • если это не так, элемент управления помечается как недействительный
  • если не выбрана ни одна опция, элемент управления действителен

В качестве альтернативы или дополнения, как указывает Алекс выше, вы можете автоматически отменить выбор других опций, когда пользователь выбирает опцию "none":

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

Что это делает:

  • если выбрано значение "none", убедитесь, что для него установлено только "none"
  • в противном случае сохраните значение как есть
  • также убедитесь, что значение не доступно только для чтения (что будет использоваться по умолчанию при использовании вычисления)

ОБНОВЛЕНИЕ 2016-11-25:

Исходное решение также может быть выражено как:

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

Содержит () функция xpath лучше всего подходит для ваших требований. код будет как ниже.

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

Однако, как говорили другие, вы можете заменить "none" на "", если вы не хотите, чтобы оно было добавлено в ваш выбор, даже если пользователь выбирает его.

Другие вопросы по тегам