Orbeon Xforms:根据复选框过滤项目

时间:2012-09-28 09:34:41

标签: orbeon xforms

我在使用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">
    .....

我需要的是能够根据复选框的状态过滤项目。如果已经检查,则绑定应该包括所有项目,如果未选中,则绑定应仅包含“Show”作为其状态元素的值的项目。

请帮忙,救我一些我留下的小头发。

TIA

1 个答案:

答案 0 :(得分: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"注释,因为默认值被视为字符串。

最后,我不会将以-model结尾的id用于实例。我会改用-instance。另一个小问题,但它可能有点混乱。所以我们称之为'main-instance'和'items-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>