複数の値を選択できる選択コントロールがあります。
そのコントロールで値を選択すると、同じノードに値がスペースで追加されます。
選択および選択解除するときに、新しい/既存のノードを作成/削除することは可能ですか?
XForms にはxforms:copy
要素があり、理論的にはアイテムセットで使用でき、うまくいったかもしれませんが、現時点で XForms 実装がこれをサポートしているかどうかはわかりません。Orbeon Forms はそうではありません。
フィルの答えは可能な方向です。別のオプションは、ノードを挿入/削除するために引き続き使用xforms:select/select1
し、イベントに反応することです。xforms-select/xforms-deselect
以下は Orbeon で機能します。
<xh:html xmlns:xh="http://www.w3.org/1999/xhtml"
xmlns:xf="http://www.w3.org/2002/xforms"
xmlns:xxf="http://orbeon.org/oxf/xml/xforms"
xmlns:ev="http://www.w3.org/2001/xml-events">
<xh:head>
<xf:model>
<xf:instance>
<items selection=""/>
</xf:instance>
</xf:model>
</xh:head>
<xh:body>
<xf:select1 ref="@selection">
<xf:item>
<xf:label>One</xf:label>
<xf:value>one</xf:value>
</xf:item>
<xf:item>
<xf:label>Two</xf:label>
<xf:value>two</xf:value>
</xf:item>
<xf:insert ev:event="xforms-select" context="instance()" ref="*" origin="xxf:element(event('xxf:item-value'))"/>
<xf:delete ev:event="xforms-deselect" context="instance()" ref="*[name() = event('xxf:item-value')]"/>
</xf:select1>
</xh:body>
</xh:html>
このselect
要素は、ノード バインディングが 1 つしかないため、要件に適合しません。そのようにコントロールのセマンティクスを覆そうとする代わりに、複数選択コントロールの外観を提供するような方法で CSS でスタイル設定されたrepeat
oftrigger
要素insert
とアクションを使用します。delete
あなたの質問はデータの形式については言及していませんが、次のようなインスタンスデータを想定しています:
<xf:instance id="options">
<options xmlns="">
<option selected="false">
<first />
</option>
<option selected="false">
<second />
</option>
<option selected="false">
<third />
</option>
<option selected="false">
<fourth />
</option>
<option selected="false">
<fifth />
</option>
</options>
</xf:instance>
<xf:instance id="results">
<results xmlns="" />
</xf:instance>
次に、次の行に沿って必要な動作を取得できるはずです(テストされていません):
<xf:repeat id="repeat" nodeset="instance('options')/option">
<xf:trigger appearance="minimal">
<xf:label>
<xf:output value="name(*)" />
</xf:label>
<xf:action ev:event="DOMActivate" if="@selected = 'false'">
<xf:setvalue ref="@selected" value="'true'" />
<xf:insert
origin="instance('options')/option[index('repeat')]/*"
context="instance('results')"
nodeset="*"
at="count(../*)"
position="after"
/>
</xf:action>
<xf:action ev:event="DOMActivate" if="@selected = 'true'">
<xf:setvalue ref="@selected" value="'false'" />
<xf:delete nodeset="instance('results')/*[name(.) = name(current()/*)]" />
</xf:action>
</xf:trigger>
</xf:repeat>