如何使用选定的xforms值执行某些操作:每次更改时选择?

时间:2011-09-26 19:51:37

标签: orbeon xforms

我在使用Orbeon Forms运行的XForms时遇到此问题。我正在使用fr:box-select控件,如下所示:

<fr:box-select bind="box-select-bind" id="box-select-control">
        <xforms:action ev:event="xforms-value-changed">
         <xxforms:variable name="selected-value" select="."/>
         <xforms:message level="modal">Hello:<xforms:output select="$selected-value" />
         </xforms:message>

        </xforms:action>

        <xforms:itemset nodeset="instance('codes')/box-select/item">
                                    <xforms:label ref="label"/>
                                    <xforms:value ref="value"/>
         </xforms:itemset>
   </fr:box-select>

绑定是一个简单的XML文件:

<box-results></box-results>

代码XML看起来像:

<box-select>
    <item>
        <label>Cat</label>
        <value>cat</value>
    </item>
    <item>
        <label>Dog</label>
        <value>dog</value>
    </item>
    <item>
        <label>Bird</label>
        <value>bird</value>
    </item>
    <item>
        <label>Fish</label>
        <value>fish</value>
    </item>
</box-select>

当我检查框中的条目时,我的节点<box-results>会更新所选的值,用空格分隔,这似乎是预期的。但是,我似乎无法找到有关如何处理所选值的任何文档。我希望能够访问刚刚选择的值,取消选择并在xpath中使用此项的值。所以,如果选择了一个值,那么我会这样做:

<setvalue
 ref="somexpath[id=$selected-value]/display
 value="'true'"/>

如果取消选择某个值,我会这样做:

<setvalue
 ref="somexpath[id=$selected-value]/display
 value="'false'"/>

基本上,我只想知道要使用的事件,以及如何在触发时访问该值。然后我想在xpath中使用这个值。我将使用它来隐藏/显示表单的一部分。使用xforms-value-changed事件Xpath“。”不会像“select1”控件那样返回我期望的内容。

我可以遍历所有选择的值,如下所示:

<xforms:action ev:event="xforms-select" xxforms:iterate="for $s in tokenize(instance('data-inst')/box-results,'\s')return xxforms:element('text',$s)">
    <xforms:message level="modal">Hello selected:<xforms:output select="$s" />
</xforms:action>

然而,这并不是我所需要的。我可能能够完成这项工作,但这需要更多的工作,因为我需要知道取消选择哪些更改用户的显示。

2 个答案:

答案 0 :(得分:3)

因为在您的情况下,您不需要具体知道哪个值发生了变化,您可以根据需要重置值{}重置somexpath[id=$selected-value]中的所有值。您可以使用以下代码执行此操作,该代码仅<xforms:setvalue>使用xxforms:iterate

<xforms:action ev:event="xforms-value-changed">
    <xxforms:variable name="selected-values" select="tokenize(., '\s+')"/>
    <xforms:setvalue xxforms:iterate="instance('codes')/item" 
                     ref="@selected">false</xforms:setvalue>
    <xforms:setvalue xxforms:iterate="$selected-values"
                     ref="for $v in . return instance('codes')/item
                     [value = $v]/@selected">true</xforms:setvalue>
</xforms:action>

另请参阅使用上述代码段的示例的the full source

答案 1 :(得分:0)

你可以使用ev:event =“xforms-select”和ev:event =“xforms-deselect”events。

也可以使用事件('xxforms:item-value')

捕获所选值

以下是如果有人想知道如何使用它:

<xforms:action ev:event="xforms-select">
<xxforms:variable name="selected" select="event('xxforms:item-value')" />
<xforms:message level="modal">Select:<xforms:output value="$selected" /></xforms:message>
</xforms:action>

<xforms:action ev:event="xforms-deselect">
<xxforms:variable name="deselected" select="event('xxforms:item-value')" />
<xforms:message level="modal">deSelect:<xforms:output value="$deselected" />
</xforms:message>
</xforms:action>