XForms - 对节点集的约束

时间:2013-01-18 15:36:30

标签: constraints bind xforms

我需要在使用XForms编辑XML文档时验证条件。

完整的示例网页包含在下面。

我想验证两件事

  1. 'v'元素内的值是整数
  2. v的每个值小于'max'元素内的值(因此示例文档不应通过验证,因为/ doc / values / rec [3]中的值为4,大于3 / doc / max 。
  3. 我不知道如何设置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>
    

1 个答案:

答案 0 :(得分:1)

xf:input控件与大多数XForms控件一样,执行spec调用的“单节点绑定”。如果它绑定到包含多个节点的节点集,则绑定到第一个节点。 (你已经注意到了这一点。)问题不在于绑定元素,尽管它很好,但在使用

<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(并更改tbody的处理,因为我正在使用的XForms处理器不支持xf:repeat-nodeset属性)时,表单看起来很明显意图:有三个值,一个输入小部件,当我点击其中一个值时,该值出现在输入区域。

请注意,您不必将输入窗口小部件绑定到bindv绑定,以使类型信息生效;在xf:bind元素中声明的属性适用于其节点集中的节点,当您将输入窗口小部件绑定到其中一个节点时,它就会知道这些属性。

如果您愿意,可以在xf:repeat上使用绑定上的ID。例如,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"
         />

请注意,用于评估constraint属性中XPath表达式的上下文节点是节点集的(或:当前)成员。

当我添加constraint属性时,当我使用XForms处理器加载文档时,会出现第三个值的错误信号。