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

时间:2017-03-01 17:43:36

标签: xml xslt xpath xquery bi-publisher

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

我可以让我的报告显示来自员工行或受益人行或两行的数据,但我无法弄清楚如何向受益人显示所有必要的数据'数据,只有员工数据中的金额。

我不确定这是否是解决此问题的最佳方式,但我一直试图弄清楚如何使用"前兄弟"从员工行获取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_TYPE 10显示为&#34;人寿保险&#34;。
  3. 受益人身份主要来自A.CONTINGENT。
  4. A.RELATIONSHIP用于确定数据是针对员工还是受益人。
  5. 输出示例:

    Employee's Name and other information goes here.
    
    Life Insurance                                  Amount: $10000.00
    Beneficiary             Beneficiary Status          
    Beneficiary Name        Primary
    

    感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

  

每个奇数行都是员工数据,每个偶数行都是   受益人数据。在构建报告时,我需要做的是显示   受益人行中的所有必要数据和仅金额(A。   来自员工行的CALCULATED_BASE。

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

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>

答案 1 :(得分:0)

很抱歉花了这么长时间才回复你。我已经离开了一会儿。 无论如何,我们使用表向导和一堆条件区域来使用此报告。我不确定这是否是最好的方法(我对此非常陌生),但它看起来确实正常工作。我们会进行更多测试以验证。使用这种方法还考虑了多个受益者。

再次感谢您的反馈。