Oracle BI Publisher行内相邻循环实现薪资单收支列分组问题求助
Oracle BI Publisher 薪资单表格循环问题解决方法
问题描述
基于给定XML数据源,需在Oracle BI Publisher中生成5列薪资单表格:
- 遍历
G_1员工记录 - 前3列展示
TYPE='Earning'的G_2记录 - 后2列展示
TYPE='Deduction'的G_2记录
尝试在行内嵌套两个for-each循环(for-each:G_2[TYPE='Earnings']、for-each:G_2[TYPE='Deductions'])后,仅收入列正常显示,扣除列空白;单独给单元格加循环也无效。
XML数据源示例
<LIST> <G_1> <EMPLOYEE_NUMBER>1</EMPLOYEE_NUMBER> <G_2> <ELEMENT>Basic</ELEMENT> <VALUE>10</VALUE> <GROSS>12</GROSS> <TYPE>Earning</TYPE> </G_2> <G_2> <ELEMENT>Transport</ELEMENT> <VALUE>11</VALUE> <TYPE>Earning</TYPE> <GROSS>15</GROSS> </G_2> <G_2> <ELEMENT>Food</ELEMENT> <VALUE>7</VALUE> <TYPE>Earning</TYPE> <GROSS>8</GROSS> </G_2> <G_2> <ELEMENT>Tax</ELEMENT> <VALUE>5</VALUE> <TYPE>Deduction</TYPE> </G_2> <G_2> <ELEMENT>Pension</ELEMENT> <VALUE>3</VALUE> <TYPE>Deduction</TYPE> </G_2> </G_1> </LIST>
期望输出格式
ELEMENT | VALUE | GROSS | ELEMENT | VALUE Basic 10 12 Tax 5 Transport 11 15 Pension 3 Food 7 8
问题原因
原写法中,在行内先执行G_2[TYPE='Earnings']循环后,当前上下文已切换到单个Earning类型的G_2节点,此时再执行G_2[TYPE='Deductions']循环,会在当前Earning节点下查找Deduction类型的子节点,而原XML中Deduction节点与Earning节点是同级的,因此找不到对应数据,导致扣除列空白。
解决方案
以Earning记录的循环作为行的基础,通过位置索引匹配对应位置的Deduction记录,具体实现如下:
完整BI Publisher代码
<?for-each:G_1?> <table border="1" cellpadding="4"> <thead> <tr> <th>ELEMENT</th> <th>VALUE</th> <th>GROSS</th> <th>ELEMENT</th> <th>VALUE</th> </tr> </thead> <tbody> <!-- 循环遍历所有Earning类型的G_2记录作为表格行 --> <?for-each:G_2[TYPE='Earning']?> <tr> <!-- 前3列直接取当前Earning节点的字段 --> <td><?ELEMENT?></td> <td><?VALUE?></td> <td><?GROSS?></td> <!-- 后2列通过位置索引匹配对应Deduction节点 --> <td> <?../G_2[TYPE='Deduction'][position()=$current-group()]?> <?ELEMENT?> <?end for-each?> </td> <td> <?../G_2[TYPE='Deduction'][position()=$current-group()]?> <?VALUE?> <?end for-each?> </td> </tr> <?end for-each?> </tbody> </table> <?end for-each?>
代码说明
- 外层先循环
G_1,确保每个员工的薪资单独立生成 - 行循环绑定
G_2[TYPE='Earning'],每一行对应一条收入记录 $current-group()变量会返回当前Earning循环的位置序号(第1行是1,第2行是2,以此类推)- 通过
../G_2[TYPE='Deduction'][position()=$current-group()]回到G_1节点下,匹配对应位置的扣除记录;当Earning数量多于Deduction时,后续扣除列自动留空,符合期望输出
内容的提问来源于stack exchange,提问作者daibatzu
相关产品推荐
相关产品推荐

