我在使用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
答案 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>