为什么在使用bind属性在重复中插入新行时,重复索引不会更新到orbeon xforms中新插入的行?

时间:2015-03-31 16:17:50

标签: orbeon xforms

我们的软件生成XForms。对于重复结构,它生成xf:repeat元素,其bind属性引用绑定模型以确定其重复集合。从xforms规范中我们知道重复索引应该总是更新到最后插入的行,但这不是发生的事情。使用ref或nodeset属性进行重复时,重复索引会按预期更新。

证明这一点的小例子:

<?xml version="1.0" encoding="UTF-8"?>
<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
	xmlns:ev="http://www.w3.org/2001/xml-events"
	xmlns:xf="http://www.w3.org/2002/xforms"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:fr="http://orbeon.org/oxf/xml/form-runner"
	xmlns:xxf="http://orbeon.org/oxf/xml/xforms"
	xmlns:idc="http://www.inventivedesigners.com/xbl"
	xmlns:exf="http://www.exforms.org/exf/1-0"
	xmlns:saxon="http://saxon.sf.net/">
<xhtml:head>
	<xhtml:meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<xhtml:title>Test</xhtml:title>

	<xf:model id="m-default">
		
		<xf:instance id="i-default">
			<data xmlns="">
				<repeat>
					<id>1</id>
				</repeat>
			</data>
		</xf:instance>

		<xf:instance id="i-counter">
			<form xmlns="">
				<counter>1</counter>
			</form>
		</xf:instance>

		<!-- bindings -->
		<xf:bind nodeset="repeat" id="repeat-bind" />

	</xf:model>

</xhtml:head>
<xhtml:body style="width: 80%; margin-left: auto; margin-right: auto;">
		
		<xhtml:table style="border: 1px solid black; margin-top: 50px;">
			<xhtml:tbody>
				<xf:repeat id="my_repeat" bind="repeat-bind">
					<xhtml:tr>
						<xhtml:td>
							<xf:output ref="id" />
						</xhtml:td>
					</xhtml:tr>
				</xf:repeat>
			</xhtml:tbody>
		</xhtml:table>
		
		<xf:trigger>
			<xf:label>Insert</xf:label>
			<xf:action ev:event="DOMActivate">
				<xf:setvalue value="number(.) + 1" ref="instance('i-counter')/counter"/>
				<xf:insert position="after" nodeset="repeat" at="index('my_repeat')"/>
				<xf:setvalue value="instance('i-counter')/counter" ref="repeat[last()]/id"/>
			</xf:action>
		</xf:trigger>
		
		<fr:xforms-inspector/>
</xhtml:body>
</xhtml:html>

如果按下按钮四次,当我们预期1,2,3,4时,您会看到订单是1,4,3,2。在重复上使用ref属性时,输出是预期的。

我用Orbeon 4.4和最新的4.8测试了这个,但行为是一样的。使用bind和ref之间区别的原因是什么?

1 个答案:

答案 0 :(得分:0)

我更新了github issue并解释了为什么会发生这种情况。

作为一种变通方法,您可以在将新节点插入数据后使用xf:setindex显式设置重复索引。