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">
    .....

Това, от което се нуждая, е да мога да филтрирам елементите въз основа на състоянието на квадратчето за отметка. Ако е отметнато, обвързването трябва да включва всички елементи, ако не е отметнато, обвързването трябва да съдържа само елементите, които имат „Показване“ като стойност, ако елементът им на състояние.

Моля, помогнете и ми спасете малкото останала коса.

TIA


person Faithypop    schedule 28.09.2012    source източник


Отговори (1)


Първо, нека се отървем от няколко проблема:

<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 двигателя да не генерира HTML маркиране за даден XForms контрол. Не се поддържа на xforms:repeat, но все пак е по-добре да претрупате кода с него.

Трето нещо, също незначително: вероятно нямате нужда от анотацията type="xs:string", тъй като по подразбиране стойностите се считат за низове.

И накрая, не бих използвал идентификатори, завършващи с -model за примери. Вместо това бих използвал -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>
person ebruchez    schedule 30.09.2012
comment
Работи като абсолютен чар! Благодарим ви за много подробната обратна връзка, оценявам много. - person Faithypop; 01.10.2012