在节点集转发器中使用XPath(XForms)

时间:2017-03-09 09:02:49

标签: html xml xpath xforms exist-db

我对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>

祝你好运, 菲利克斯

1 个答案:

答案 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>