You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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?>

代码说明

  1. 外层先循环G_1,确保每个员工的薪资单独立生成
  2. 行循环绑定G_2[TYPE='Earning'],每一行对应一条收入记录
  3. $current-group()变量会返回当前Earning循环的位置序号(第1行是1,第2行是2,以此类推)
  4. 通过../G_2[TYPE='Deduction'][position()=$current-group()]回到G_1节点下,匹配对应位置的扣除记录;当Earning数量多于Deduction时,后续扣除列自动留空,符合期望输出

内容的提问来源于stack exchange,提问作者daibatzu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:26:03