在 BI Publisher 模板中动态更改 headers
Dynamically change headers in BI Publisher Template
我有一个由 BI Publisher 生成的 XML 数据集,其中包含两个组
输入XML:
<DS>
<G_1>
<TASK_NAME>IMPORTANT TASK</TASK_NAME>
<PROJECT_DESCRIPTION>ACTIVATION</PROJECT_DESCRIPTION>
<CS_SUM_TASK_COST>100.03</CS_SUM_TASK_COST>
<CS_SUM_TASK_FUNDING>2000</CS_SUM_TASK_FUNDING>
</G_1>
<G_1>
<TASK_NAME>IMPORTANT TASK</TASK_NAME>
<PROJECT_DESCRIPTION>DEACTIVATION</PROJECT_DESCRIPTION>
<CS_SUM_TASK_COST>50.00</CS_SUM_TASK_COST>
<CS_SUM_TASK_FUNDING>5000</CS_SUM_TASK_FUNDING>
</G_1>
.
.
<G_2>
<INVOICE_NUMBER>7000006861</INVOICE_NUMBER>
<INVOICE_DATE>2004-03-26T07:23:49.000-05:00</INVOICE_DATE>
<INV_AMOUNT>5.01</INV_AMOUNT>
</G_2>
<G_2>
<INVOICE_NUMBER>7000006862</INVOICE_NUMBER>
<INVOICE_DATE>2004-03-26T07:23:49.000-05:00</INVOICE_DATE>
<INV_AMOUNT>10.01</INV_AMOUNT>
</G_2>
.
.
</DS>
如何 select 为 INVOICE 节点设置不同的 header?
我在我的 RTF 文档中尝试了以下方法
<?choose:?>
<?when://G_2[contains(local-name(), 'INVOICE')]?>
HEADER 1
<?end when?>
<?otherwise?>
HEADER 2
<?end otherwise?>
<?end choose?>
<?body:begin?>
for each processing of G_1 nodes
<<I Want to start using the second header here>>
for each processing of G_2 nodes
<?body end?>
header 永远不会改变。
请帮助我。
要控制header,请使用@section 命令和一个全局变量。尝试这个。
将此代码放入 body。
<?for-each@section:G_1?>
<?xdoxslt:set_variable($_XDOCTX, 'HEADER', 'INVOICE')?>
<?end for-each?>
<?for-each@section:G_2?>
<?xdoxslt:set_variable($_XDOCTX, 'HEADER', 'OTHER')?>
<?end for-each?>
现在将其放入 header:<?xdoxslt:get_variable($_XDOCTX, 'HEADER')?>
BIP 首先用@section 拆分数据集,并为所有页面打印变量'HEADER',直到到达下一个拆分。
这种方法适用于提出的问题。
但我没有提到我需要在 header 中包含数据集中的值,而不仅仅是静态文本。使用 @section 可以防止这种情况,因为 for-each 之外的所有值都被重置,因此 header.
中的所有值都是空白的
我将此标记为已解决最初提出的问题。
我有一个由 BI Publisher 生成的 XML 数据集,其中包含两个组
输入XML:
<DS>
<G_1>
<TASK_NAME>IMPORTANT TASK</TASK_NAME>
<PROJECT_DESCRIPTION>ACTIVATION</PROJECT_DESCRIPTION>
<CS_SUM_TASK_COST>100.03</CS_SUM_TASK_COST>
<CS_SUM_TASK_FUNDING>2000</CS_SUM_TASK_FUNDING>
</G_1>
<G_1>
<TASK_NAME>IMPORTANT TASK</TASK_NAME>
<PROJECT_DESCRIPTION>DEACTIVATION</PROJECT_DESCRIPTION>
<CS_SUM_TASK_COST>50.00</CS_SUM_TASK_COST>
<CS_SUM_TASK_FUNDING>5000</CS_SUM_TASK_FUNDING>
</G_1>
.
.
<G_2>
<INVOICE_NUMBER>7000006861</INVOICE_NUMBER>
<INVOICE_DATE>2004-03-26T07:23:49.000-05:00</INVOICE_DATE>
<INV_AMOUNT>5.01</INV_AMOUNT>
</G_2>
<G_2>
<INVOICE_NUMBER>7000006862</INVOICE_NUMBER>
<INVOICE_DATE>2004-03-26T07:23:49.000-05:00</INVOICE_DATE>
<INV_AMOUNT>10.01</INV_AMOUNT>
</G_2>
.
.
</DS>
如何 select 为 INVOICE 节点设置不同的 header?
我在我的 RTF 文档中尝试了以下方法
<?choose:?>
<?when://G_2[contains(local-name(), 'INVOICE')]?>
HEADER 1
<?end when?>
<?otherwise?>
HEADER 2
<?end otherwise?>
<?end choose?>
<?body:begin?>
for each processing of G_1 nodes
<<I Want to start using the second header here>>
for each processing of G_2 nodes
<?body end?>
header 永远不会改变。
请帮助我。
要控制header,请使用@section 命令和一个全局变量。尝试这个。
将此代码放入 body。
<?for-each@section:G_1?>
<?xdoxslt:set_variable($_XDOCTX, 'HEADER', 'INVOICE')?>
<?end for-each?>
<?for-each@section:G_2?>
<?xdoxslt:set_variable($_XDOCTX, 'HEADER', 'OTHER')?>
<?end for-each?>
现在将其放入 header:<?xdoxslt:get_variable($_XDOCTX, 'HEADER')?>
BIP 首先用@section 拆分数据集,并为所有页面打印变量'HEADER',直到到达下一个拆分。
这种方法适用于提出的问题。
但我没有提到我需要在 header 中包含数据集中的值,而不仅仅是静态文本。使用 @section 可以防止这种情况,因为 for-each 之外的所有值都被重置,因此 header.
中的所有值都是空白的我将此标记为已解决最初提出的问题。