Orbeon/XForms: 根据其他输入控件更改下拉值

Orbeon/XForms: Change dropdown values based on other input control

我有一个文本控件 my-text 和一个下拉菜单 my-dropdown。根据 my-text 的内容,my-dropdown 的项目集应该改变。不幸的是,单个下拉项没有visibility 属性,所以我想到了一个不同的解决方案。在我的 Orbeon 表单的 <resource xml:lang="en"> 标签中,我定义了几个项目集:

<first-itemset>
    <item>
        <label>AAA</label>
        <value>a</value>
    </item>
    <item>
        <label>BBB</label>
        <value>b</value>
    </item>
</first-itemset>


<second-itemset>
    <item>
        <label>XXX</label>
        <value>x</value>
    </item>
    <item>
        <label>YYY</label>
        <value>y</value>
    </item>
</second-itemset>

现在如果 my-text 的内容等于 "first-itemset" 那么应该使用第一个项目集,否则使用第二个。我怎样才能做到这一点? 在 <fr:dropdown-select1 ...> 里面我需要类似

的东西
<xf:itemset ref="$form-resources/CONTENT_OF_MY-TEXT_HERE/item">
    <xf:label ref="label"/>
    <xf:value ref="value"/>
</xf:itemset>

我需要写什么而不是 CONTENT_OF_MY-TEXT_HERE 来获取实际内容,以便 orbeon 使用正确的项目集?

您问题的直接答案是:*[local-name() = xxf:value('choice-control')]。所以你会:

<xf:itemset 
    ref="
        $form-resources/
        *[local-name() = xxf:value('choice-control')]/
        item
    ">

这样,根据在 choice 控件中键入的值,您将获得不同的项目集:

但是,请记住,如果您在 Form Builder 中执行此操作,则您对源代码所做的更改很容易丢失。例如,下次您更改控件名称时,该 ref 表达式将被重置。因此,最好找到另一种方法来实现这一目标。例如,您可以有 2 个下拉菜单,其中只有一个在任何时间点可见,具体取决于另一个字段中的值输入器。