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

私が必要とするのは、チェックボックスの状態に基づいてアイテムをフィルタリングできるようにすることです。チェックされている場合、バインドにはすべてのアイテムが含まれる必要があります。チェックされていない場合、ステータス要素の値として「表示」を持つアイテムのみがバインドに含まれる必要があります。

助けて、私が残したわずかな髪を救ってください。

ティア

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"2 番目の小さなこと: おそらく繰り返しはしたくないでしょう。これは、特定の XForms コントロールの HTML マークアップを生成しないように XForms エンジンに指示するために使用される拡張機能です。ではサポートされていませんxforms:repeatが、とにかくコードを乱雑にすることをお勧めします。

type="xs:string"3 つ目もマイナーな点ですが、デフォルト値は文字列と見なされるため、おそらくアノテーションは必要ありません。

-model最後に、 for インスタンスで終わる ID は使用しません。代わりに使用-instanceします。もう 1 つ些細なことですが、少し混乱する可能性があります。そのため、代わりに「メイン インスタンス」と「アイテム インスタンス」と呼びましょう。

とはいえ、重要なのはアイテムをフィルタリングする XPath 式を記述することです。1 つの問題は、バインドがすべてのアイテムを指していることです。そのため、id によるバインドを参照するだけの属性を使用してバインドを参照すると、bindフィルタリングできません。

xxf:bind()1 つの解決策は、XPath 式からバインドを参照できるOrbeon 拡張関数を使用することです。

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 に答える