1

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

完整的示例网页如下所示。

我想验证两件事

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

1 回答 1

1

与大多数 XForms 控件一样,该xf:input控件执行规范所称的“单节点绑定”。如果它绑定到包含多个节点的节点集,它会绑定到第一个。(您已经注意到这一点。)问题不在于绑定元素,就目前而言这很好,而在于使用

<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 处理器加载文档时,会针对第三个值出现错误信号。

于 2013-01-19T00:59:10.000 回答