Как создать элемент флажка, получая значения "да" / "нет" вместо "истина" / "ложь"?

У меня есть проблема, и я надеюсь, что это только мой недостаток опыта в XForms. Мне нужно создать элемент флажка для данных, который определен как перечисление "Да" / "Нет". По сути, это просто логическое значение, но с другой парой значений. То, что я уже смог сделать, это то, что в принципе работает, но нуждается в дополнительном узле данных в модели:

<xhtml:html xmlns:xforms="http://www.w3.org/2002/xforms"
    xmlns:f="http://orbeon.org/oxf/xml/formatting"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    >

    <xhtml:head>
        <xforms:model xmlns:xforms="http://www.w3.org/2002/xforms"
                xmlns:xs="http://www.w3.org/2001/XMLSchema" id="main-model">
          <xforms:instance id="instance">
            <main>
              <Boolean>true</Boolean>
              <YesNo>Yes</YesNo>
            </main>
          </xforms:instance>
          <xforms:bind ref="Boolean" type="xsd:boolean" />
          <xforms:bind ref="YesNo" constraint=". = 'Yes' or . = 'No'" />
        </xforms:model>
    </xhtml:head>
    <xhtml:body>
      <xforms:input ref="instance('instance')/Boolean">
        <xforms:label>Boolean: </xforms:label>
        <xforms:action ev:event="xforms-value-changed">
          <xforms:setvalue ref="instance('instance')/YesNo" value="if ( instance('instance')/Boolean = 'true' ) then 'Yes' else 'No'" />
        </xforms:action>
      </xforms:input>
      <br/>
      <xforms:output ref="instance('instance')/Boolean">
        <xforms:label>Boolean:</xforms:label>
      </xforms:output>
      <br/>
      <br/>
      <xforms:select ref="instance('instance')/YesNo" appearance="full">
        <xforms:label>Yes/No: </xforms:label>
        <xforms:item>
          <xforms:label></xforms:label>
          <xforms:value>Yes</xforms:value>
        </xforms:item>
        <xforms:action ev:event="xforms-value-changed">
          <xforms:setvalue ref="instance('instance')/YesNo" value="if ( instance('instance')/YesNo = 'Yes' ) then 'Yes' else 'No'" />
        </xforms:action>
      </xforms:select>
      <br/>
      <xforms:output ref="instance('instance')/YesNo">
        <xforms:label>Yes/No:</xforms:label>
      </xforms:output>
    </xhtml:body>
</xhtml:html>

Этот пример содержит два возможных решения: Первое - это стандартный логический флажок, связанный с логическим узлом экземпляра с действием, которое устанавливает значение "Да" / "Нет" для второго узла. Это решение работает хорошо, но требует второго узла данных, который я не могу создать из-за схемы (в приведенном выше примере я обычно мог бы создать второй экземпляр для хранения этого значения, но в реальном проекте эти флажки находятся в блоке повтора, и мне пришлось бы создать дополнительную таблицу значения для этого, что кажется очень сложным), Второе - это выбрать элемент с единственным значением "Да" и действием, которое пытается установить значение "Нет", когда установлено пустое значение (невыбранный элемент). К сожалению, когда этот элемент не выбран, он не может выбрать его снова (отменяет выбор автоматически). Есть ли у вас решение для такой проблемы?

заранее спасибо

1 ответ

Решение

Надеюсь, что это решит вашу проблему..

<xhtml:html xmlns:xforms="http://www.w3.org/2002/xforms"
    xmlns:f="http://orbeon.org/oxf/xml/formatting"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    >

    <xhtml:head>
        <xforms:model xmlns:xforms="http://www.w3.org/2002/xforms"
                xmlns:xs="http://www.w3.org/2001/XMLSchema" id="main-model">
          <xforms:instance id="instance">
            <main>
              <Boolean value="true">Yes</Boolean>
            </main>
          </xforms:instance>
          <xforms:bind ref="Boolean/@value" type="xforms:boolean" readonly="false()" />
          <xforms:bind ref="Boolean" calculate="if(@value=true()) then 'Yes' else 'No'" readonly="false()" />
        </xforms:model>
    </xhtml:head>
    <xhtml:body>
      <xforms:input ref="instance('instance')/Boolean/@value">
        <xforms:label>Boolean: </xforms:label>
      </xforms:input>
      <br/>
      <xforms:output ref="instance('instance')/Boolean">
        <xforms:label>Boolean:</xforms:label>
      </xforms:output>
      <br/>
      <xforms:output ref="instance('instance')/Boolean/@value">
        <xforms:label>Boolean/@value:</xforms:label>
      </xforms:output>
      <br/>
      <br/>


    </xhtml:body>
</xhtml:html>

Если вам не разрешено использовать атрибуты для вашего узла xml, тогда используйте логические значения, пока пользователь работает с формой. При отправке события вы можете установить для логических значений значение Да или Нет и отправить данные во внешнюю систему.

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