1

XForms を使用して XML ドキュメントを編集するときに、条件を確認する必要があります。

完全なサンプル Web ページを以下に示します。

2つのことを確認したい

  1. 「v」要素内の値は整数です
  2. v の各値は 'max' 要素内の値よりも小さい (/doc/values/rec[3] 内の値は 4 で、/doc/max.

これを使用して xf:bind の属性を設定する方法がわかりません:

<xf:bind id="bindv" 
         nodeset="instance('i1')/values/rec/v" 
         type="integer" />

<xf:input bind="bindv">

xf:input は最初の 'v' のみを編集します。

<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:ev="http://www.w3.org/2001/xml-events" 
      xmlns:xf="http://www.w3.org/2002/xforms">
    <head>        
        <xf:model>
            <xf:instance xmlns="" id="i1">
                <doc>
                    <max>3</max>
                    <values>
                        <rec>
                            <v>1</v>
                        </rec>
                        <rec>
                            <v>2</v>
                        </rec>
                        <rec>
                            <v>4</v>
                        </rec>
                    </values>
                </doc>
            </xf:instance>          
        </xf:model>     
    </head>
    <body>
        <div>
            <table>
                <thead>
                   <th>Value</th>                                        
                </thead>    
                <tbody id="values-repeat" 
                    xf:repeat-nodeset="instance('i1')/values/rec">
                    <tr>
                       <td>
                           <xf:output ref="v" />
                       </td>                       
                    </tr>
                </tbody>                  
            </table>  

            <xf:group ref="instance('i1')/values/rec[index('values-repeat')]" 
               appearance="full">               
                <xf:input bind="bindv">
                   <xf:label>v:</xf:label>
               </xf:input>
            </xf:group>
        </div>
    </body>
</html>
4

1 に答える 1

1

このxf:inputコントロールは、ほとんどの XForms コントロールと同様に、仕様で「単一ノード バインディング」と呼ばれるものを実行します。複数のノードを含むノードセットにバインドされている場合は、最初のノードにバインドされます。(すでにお気づきでしょう。) 問題は bind 要素にあるのではなく、バインド要素に問題はありません。

<xf:input bind="bindv"/> 

あなたが意味するのは、おそらくもっと似たようなものです

<xf:group ref="instance('i1')/values/rec[index('values-repeat')]" 
          appearance="full">               
    <xf:input ref="v">
        <xf:label>v:</xf:label>
    </xf:input>
</xf:group>

上記のように を変更するgroupと (そして、使用している XForms プロセッサが xf:repeat-nodeset 属性をサポートしていないため、tbody の処理を​​変更すると)、フォームは明らかに意図したとおりに機能します: 3 つの値があり、 1 つの入力ウィジェットで、値の 1 つをクリックすると、その値が入力領域に表示されます。

タイプ情報を有効にするために、入力ウィジェットを bindv バインディングにバインドする必要はないことに注意してください。xf:bind 要素で宣言されたプロパティはノードセット内のノードに適用され、入力ウィジェットをそれらのノードの 1 つにバインドすると、それらのプロパティが認識されます。

バインディングの ID は、必要に応じて xf:repeat で使用できます。たとえば、tbody は次のように表現できます。

<tbody>
    <xf:repeat bind="bindv" id="values-repeat" >
        <tr>
            <td>
                <xf:output ref="." />
            </td>                       
        </tr>
    </xf:repeat>
</tbody>

値が の値より厳密に小さくなければならないという制約を追加するにはinstance('i1')/max、xf:bind で次のように指定します。

<xf:bind id="bindv" 
         nodeset="instance('i1')/values/rec/v" 
         type="integer"
         constraint=". &lt; ../../../max"
         />

属性内の XPath 式を評価するためのコンテキスト ノードはconstraint、ノードセットの (または現在の) メンバーであることに注意してください。

属性を追加するconstraintと、XForms プロセッサを使用してドキュメントをロードすると、3 番目の値に対してエラー シグナルが表示されます。

于 2013-01-19T00:59:10.000 に答える