如何根据Orbeon中另一个重复的节点位置参考相关的重复节点位置?

时间:2015-03-26 16:41:20

标签: xpath repeater orbeon xforms xpath-2.0

我创建了一个带有重复的表单来显示数据列表。但并非所有行元素都来自同一个节点集! 该表是根据学生节点的数量创建的:

...
<Student>
<Firstname>Kostas</Firstname>
<Lastname>Oikonomopoulos</Lastname>
</Student>
<Student>
<Firstname>Teo</Firstname>
<Lastname>Kartsonas</Lastname>
</Student>
...
<Math>
<Name>Mathematics</Name>
<Grade>Class A</Class>
</Math>
<Math>
<Name>Physics</Name>
<Class>Class B</Class>
</Math>
...

所以我想创建一个这样的重复网格:

Headers -Lastname-          -Firstname-  -Lesson-         -Class-
1# ---- Oikonomopoulos ---- Kostas  ---- Mathematics ---- Class A
2# ---- Kartsonas      ---- Teo     ---- Physics     ---- Class B

数据列表由每个学生的每一行组成,每个学生根据学生的相对位置为本课程提供课程和课程!

所以我想要在每一行:

//(Student)[i]/Firstname, //(Student)[i]/Lastname, //(Math)[i]/Name, //(Math)[i]/Class

其中i是每个学生节点迭代的位置。

我使用 xf:repeat 创建数据表:

...
<xf:repeat ref="instance('fr-form-instance')//Student">
...
...
<xh:td>
<xf:output ref="Firstname"/>
</xh:td>
<xh:td>
<xf:output ref="Lastname"/>
</xh:td>
...
<xh:td>
<xf:output ref="(//Math)[position()]/Name"/>
</xh:td>
<xh:td>
<xf:output ref="(//Math)[position()]/Class"/>
</xh:td>
...

学生按预期显示,但课程和课程对所有迭代都有相同的值!喜欢:

Headers -Lastname-          -Firstname-  -Lesson-                      -Class-
1# ---- Oikonomopoulos ---- Kostas  ---- Mathematics ------------------ Class A
2# ---- Kartsonas      ---- Teo     ---- Mathematics (wrongValue!) ---- Class A (wrongValue!)

奇怪的是,如果将position()单独作为列中的输出,则正确显示1,2,......!?! 我使用的是Orbeon 4.5

1 个答案:

答案 0 :(得分:2)

在我们想要引用的节点集在重复节点集之外的情况下, position()函数在计算中不起作用,正如我预期的那样。 相反,解决方案是使用 xxf:repeat-position() 函数!

所以代替,  <xf:output ref="(//Math)[position()]/Name"/>

,正确的方法是: <xf:output ref="(//Math)[xxf:repeat-position()]/Name"/>

xxf:repeat-position() function works in the UI

<xf:output value="xxf:repeat-position()"/>