我创建了一个带有重复的表单来显示数据列表。但并非所有行元素都来自同一个节点集! 该表是根据学生节点的数量创建的:
...
<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
答案 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()"/>