1

我在使用 Orbeon XForms 过滤项目时遇到问题。情况是我有一个绑定到实例的复选框,该实例定义为:

<xf:instance id="Include-model">
    <data>
        <value type="xs:string">true</value>
    </data>
</xf:instance>

并且复选框被声明为:

<xf:select ref="instance('Include-model')/value" selection="closed" appearance="full" >
    <xf:item>
        <xf:label>Include all</xf:label>
        <xf:value>true</xf:value>
    </xf:item>
</xf:select>

因此,该复选框最初被选中。

现在我在另一个实例中有一个项目列表,定义为:

<xf:instance id="items-model">
    <Items>
        <Item>
           <value>1</value>
           <status>Show</status>    
        </Item>
        <Item>
           <value>2</value>
           <status>Show</status>    
        </Item>
        <Item>
           <value>3</value>
           <status>Hide</status>    
        </Item>
    </Items>
</xf:instance>

和关联的绑定:

<xforms:bind id="items-bind" nodeset="instance('items-model')Items/Item">

这些项目显示在中继器中

<xforms:repeat bind="items-bind" appearance="xxforms:internal">
    .....

我需要的是能够根据复选框的状态过滤项目。如果选中,则绑定应包括所有项目,如果未选中,则绑定应仅包含具有“显示”作为值的项目(如果它们的状态元素)。

请帮忙,把我剩下的头发留给我。

TIA

4

1 回答 1

3

首先,让我们摆脱几个问题:

<xforms:bind id="items-bind" nodeset="instance('items-model')Items/Item">

不是正确的 XPath 表达式。改用:

<xforms:bind id="items-bind" nodeset="instance('items-model')/Item">

这指向所有项目。那是因为instance('items-model')已经指向实例的根元素,所以instance('items-model')指向该Items元素。

第二件小事:你可能不想appearance="xxforms:internal"重复。这是一个扩展,用于告诉 XForms 引擎不要为给定的 XForms 控件生成 HTML 标记。它不受支持,xforms:repeat但最好还是用它来混淆代码。

第三件事,也是次要的:您可能不需要type="xs:string"注释,因为默认值被视为字符串。

最后,我不会使用以-modelfor 结尾的 id。我会-instance改用。另一件小事,但可能有点令人困惑。因此,我们将它们称为“主实例”和“项目实例”。

这就是说,关键是编写一个 XPath 表达式来过滤项目。现在的一个问题是您的绑定指向所有项目。所以如果你用bind属性引用你的绑定,它只是通过 id 引用绑定,你不能过滤。

一种解决方案是使用 Orbeon 扩展函数xxf:bind(),它允许您从 XPath 表达式中引用绑定:

xxf:bind('items-bind')[instance('main-instance')/value = 'true' or status = 'Show']

然后你的重复变成:

<xf:repeat ref="xxf:bind('items-bind')[instance('main-instance')/value = 'true' or status = 'Show']">

这是一个有效的完整示例:

<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"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xh:head>
        <xf:model>
            <xf:instance id="main-instance">
                <data>
                    <value>true</value>
                </data>
            </xf:instance>
            <xf:instance id="items-instance">
                <Items>
                    <Item>
                        <value>1</value>
                        <status>Show</status>
                    </Item>
                    <Item>
                        <value>2</value>
                        <status>Show</status>
                    </Item>
                    <Item>
                        <value>3</value>
                        <status>Hide</status>
                    </Item>
                </Items>
            </xf:instance>
            <xf:bind id="items-bind" nodeset="instance('items-instance')/Item"/>
        </xf:model>
    </xh:head>
    <xh:body>
        <xf:select ref="instance('main-instance')/value" appearance="full">
            <xf:item>
                <xf:label>Include all</xf:label>
                <xf:value>true</xf:value>
            </xf:item>
        </xf:select>
        <xf:repeat ref="xxf:bind('items-bind')[instance('main-instance')/value = 'true' or status = 'Show']">
            <xh:div>
                <xf:output value="concat('Value: ', value, ', status: ', status)"/>
            </xh:div>
        </xf:repeat>
    </xh:body>
</xh:html>
于 2012-09-30T00:19:10.420 回答