我需要在使用XForms编辑XML文档时验证条件。
完整的示例网页包含在下面。
我想验证两件事
我不知道如何设置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>
答案 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=". < ../../../max"
/>
请注意,用于评估constraint
属性中XPath表达式的上下文节点是节点集的(或:当前)成员。
当我添加constraint
属性时,当我使用XForms处理器加载文档时,会出现第三个值的错误信号。