Как пометить флажки 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" на "", если вы не хотите, чтобы оно было добавлено в ваш выбор, даже если пользователь выбирает его.