Как создать элемент флажка, получая значения "да" / "нет" вместо "истина" / "ложь"?
У меня есть проблема, и я надеюсь, что это только мой недостаток опыта в 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, тогда используйте логические значения, пока пользователь работает с формой. При отправке события вы можете установить для логических значений значение Да или Нет и отправить данные во внешнюю систему.