如何从另一个 XML 行获取相关数据?

How do I get related data from another XML row?

我正在尝试创建 Oracle BI Publisher 报告(使用 Microsoft Word 插件)。该报告是根据从 PeopleSoft 创建的 XML 文件创建的。 XML 文件包含许多行(我包含了一些示例数据)。一行包含雇员数据,下一行包含受益人数据。在 XML 文件中,似乎每个奇数行都是员工数据,每个偶数行都是受益人数据。在构建报告时,我需要做的是显示 Beneficiary 行中的所有必要数据,并且仅显示 employee 行中的 Amount (A. CALCULATED_BASE)。这应该显示为一个输出块,而不是两个。

我可以让我的报告显示员工行或受益人行或两行的数据,但我不知道如何显示受益人数据中的所有必要数据以及员工数据中的金额.

我不确定这是否是解决此问题的最佳方法,但我一直在尝试弄清楚如何使用 "preceding-sibling" 从员工行中获取 A.CALCULATED_BASE。这就是我的想法:我将读取受益人数据,然后查看其他行并计算 A.PLAN_TYPE。如果受益人行的 A.PLAN_TYPE 等于雇员行的 A.PLAN_TYPE,则得到 A.CALCULATED_BASE。判断某行是员工还是受益人的方法是查看A.RELATIONSHIP。 A.RELATIONSHIP 对于员工始终为空,但包含受益人的数据。

样本XML数据:

<?xml version='1.0'?>
<query numrows="10" queryname="query_name" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="">
<row rownumber="1"> <!-- Employee -->
    <A.PLAN_TYPE><![CDATA[10]]></A.PLAN_TYPE>
    <A.NAME><![CDATA[Firstname Lastname]]></A.NAME>
    <A.RELATIONSHIP><![CDATA[]]></A.RELATIONSHIP>
    <A.CALCULATED_BASE>10000</A.CALCULATED_BASE>
    <A.CONTINGENT><![CDATA[N]]></A.CONTINGENT>
</row>
<row rownumber="2"> <!-- Beneficiary -->
    <A.PLAN_TYPE><![CDATA[10]]></A.PLAN_TYPE>
    <A.NAME><![CDATA[Firstname Lastname]]></A.NAME>
    <A.RELATIONSHIP><![CDATA[Spouse]]></A.RELATIONSHIP>
    <A.CALCULATED_BASE>0</A.CALCULATED_BASE>
    <A.CONTINGENT><![CDATA[N]]></A.CONTINGENT>
</row>
</query>

在下面的例子中:

  1. 金额来自A.CALCULATED_BASE员工行,其余数据来自受益人行。
  2. PLAN_TYPE10显示为"Life Insurance"。
  3. 主要受益人身份来自A.CONTINGENT。
  4. A.RELATIONSHIP 用于确定数据是针对雇员还是受益人。

输出示例:

Employee's Name and other information goes here.

Life Insurance                                  Amount: 000.00
Beneficiary             Beneficiary Status          
Beneficiary Name        Primary

感谢您的帮助。

every odd numbered row is employee data and every even number row is beneficiary data. In building the report, what I need to do is display all necessary data from the Beneficiary row and only the Amount (A. CALCULATED_BASE) from the employee row.

这是一个简单的示例,显示了您需要采用的基本方法:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/query">
    <root>
        <!-- for every even row -->
        <xsl:for-each select="row[position() mod 2 = 0]">
            <record>
                <!-- get beneficiary data -->
                <name>
                    <xsl:value-of select="A.NAME" />
                </name>
                <relationship>
                    <xsl:value-of select="A.RELATIONSHIP" />
                </relationship>
                <!-- get employee data -->
                <base>
                    <xsl:value-of select="preceding-sibling::row/A.CALCULATED_BASE" />
                </base>
            </record>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <record>
      <name>Firstname Lastname</name>
      <relationship>Spouse</relationship>
      <base>10000</base>
   </record>
</root>

抱歉这么久才回复您。我离开了一段时间。 无论如何,我们使用 table 向导和一堆条件区域使此报告正常工作。我不确定这是否是最好的方法(我对此真的很陌生)但它确实可以正常工作。我们会做更多的测试来验证。使用这种方法还考虑到了多个受益人。

再次感谢您的反馈。