Как я могу пометить флажки 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>

Когда выбран вариант «Ничего из вышеперечисленного», если также выбран любой другой параметр, элемент управления должен быть помечен как недопустимый. Как я могу этого добиться?


person Orbeon Community    schedule 03.01.2011    source источник
comment
В качестве альтернативы, вместо того, чтобы делать элемент управления недействительным, когда выбрано ничего из вышеперечисленного и что-то еще, вы можете автоматически отменить выбор любого другого элемента, когда ничего из вышеперечисленного не выбрано, используя <xforms:bind calculate="…">.   -  person avernet    schedule 04.01.2011
comment
@Dmitre, не знаю, почему вы удалили тег xpath, поскольку в ответе требовался XPath!   -  person ebruchez    schedule 04.01.2011


Ответы (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"/>
person ebruchez    schedule 03.01.2011

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

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

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

person Jayy    schedule 08.09.2011