我对XPath和节点集转发器(XForms)有疑问。
正如您在下面的代码片段中所看到的,我想要更改列表的特定条目的属性,并在节点集中的以下条目中使用触发器更改属性。
第一个<xf:action>
工作正常,但第二个没有。我想要的是保留processinstance的当前节点集,转到下面的节点集并在此处更改属性状态。我如何通过XPath实现这一点?
<div>
<xf:model>
<xf:instance xmlns="" id="template">
<project id="">
<name/>
...
<processinstance>
<name>
<state>
</processinstance>
</project>
</xf:instance>
</xf:model>
....
<!-- Process repeat table -->
<div>
<table class="table table-hover">
<thead>
<th width="50%">Processname</th>
<th width="50%">State</th>
<th width="50%">Action</th>
</thead>
<tbody id="process-repeat" xf:repeat-nodeset="//project[index('project-repeat')]/processinstance">
<tr>
<td>
<xf:output ref="name"/>
</td>
<td>
<xf:output ref="state"/>
</td>
<td>
<xf:group ref=".[state eq 'in processing']">
<xf:trigger appearance="minimal">
<xf:label>finish process</xf:label>
<xf:action>
<xf:setvalue ref="state">finished</xf:setvalue>
</xf:action>
<!-- THE FOLLOWING DOES NOT WORK AS I WANT! -->
<xf:action>
<xf:setvalue ref="//project[index('project-repeat')]/processinstance[index(process-repeat)+1]">in process</xf:setvalue>
</xf:action>
</xf:trigger>
</xf:group>
</td>
</tr>
</tbody>
</table>
</div>
</div>
祝你好运, 菲利克斯
答案 0 :(得分:0)
有一点是你有一个拼写错误:
index(process-repeat)
VS
index('process-repeat')
此外,index()
函数代表当前选中的,在UI中重复迭代。它不代表在XPath中计算的当前迭代。
最重要的是,您不能使用index('process-repeat')
来识别当前的重复迭代。这是index()
函数的常见误解。
某些实现具有识别当前重复迭代的功能。我假设你正在使用BetterFORM,我不知道它是否具有这样的功能。使用Orbeon Forms,您可以写:
//project[index('project-repeat')]/processinstance[xxf:repeat-position()]
或者更好的是,如果betterFORM支持变量,您可以使用它来避免重复自己:
<tbody id="process-repeat" xf:repeat-nodeset="//project[index('project-repeat')]/processinstance">
<xf:var name="current-process" value="."/>
<tr>
<td>
<xf:output ref="name"/>
</td>
<td>
<xf:output ref="state"/>
</td>
<td>
<xf:group ref=".[state eq 'in processing']">
<xf:trigger appearance="minimal">
<xf:label>finish process</xf:label>
<xf:action>
<xf:setvalue ref="state">finished</xf:setvalue>
</xf:action>
<xf:action>
<xf:setvalue ref="$current-process">in process</xf:setvalue>
</xf:action>
</xf:trigger>
</xf:group>
</td>
</tr>
</tbody>