Как пометить флажки XForms недействительными, если выбран параметр «Ничего из вышеперечисленного»? - PullRequest
1 голос
/ 03 января 2011

Сценарий:

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

2 голосов
/ 03 января 2011

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

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

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

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

В качестве альтернативы или дополнения, как указывает Алекс выше, вы можете автоматически отменить выбор других параметров, когда пользователь выбирает параметр «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"/>
0 голосов
/ 08 сентября 2011

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

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

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

...