从XSLT中删除多个值

时间:2015-08-08 22:26:59

标签: xml xslt

我试图修复此XML / XSLT代码的多值问题,但似乎无法弄清楚什么是错误的。对于某些员工(并非所有员工),他们在输出文件中的记录包含多个SSN值。这导致接收系统出现问题,因为它只期望一个值。任何帮助都会很棒;我很感激,因为我真的很困惑,需要在36小时内提交一份报告。非常感谢。 (附带xml文件代码和XSLT代码)

XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <pi:Payroll_Extract_Employees xmlns:pi="urn:com.workday/picof">
        <pi:PayGroup>
            <pi:Header>
                <pi:Version>18</pi:Version>
                <pi:Payroll_Company_ID>25G</pi:Payroll_Company_ID>
                <pi:Payroll_Company_Name>Acme.net</pi:Payroll_Company_Name>
                <pi:Pay_Group_ID>G85D6W87D</pi:Pay_Group_ID>
                <pi:Pay_Group_Name>G85D6W87D Semi-monthly</pi:Pay_Group_Name>
                <pi:Pay_Period_Start>2013-02-16-08:00</pi:Pay_Period_Start>
                <pi:Pay_Period_End>2013-02-28-08:00</pi:Pay_Period_End>
                <pi:Updated_From>2013-02-28T18:00:15.171-08:00</pi:Updated_From>
                <pi:Updated_To>2013-03-07T12:25:36.860-08:00</pi:Updated_To>
                <pi:All_Effective>false</pi:All_Effective>
            </pi:Header>
            <pi:Employee>
                <pi:Summary>
                    <pi:Employee_ID>1332</pi:Employee_ID>
                    <pi:Name>Robert Paulson</pi:Name>
                    <pi:Payroll_Company_ID>25G</pi:Payroll_Company_ID>
                    <pi:Payroll_Company_Name>Acme.net</pi:Payroll_Company_Name>
                    <pi:Pay_Group_ID>G85D6W87D</pi:Pay_Group_ID>
                    <pi:Pay_Group_Name>G85D6W87D Semi-monthly</pi:Pay_Group_Name>
                </pi:Summary>
                <pi:Personal>
                    <pi:First_Name>Robert</pi:First_Name>
                    <pi:Middle_Name>B</pi:Middle_Name>
                    <pi:Last_Name>Paulson</pi:Last_Name>
                    <pi:Gender>M</pi:Gender>
                    <pi:Birth_Date>1972-07-19</pi:Birth_Date>
                    <pi:Marital_Status>S</pi:Marital_Status>
                    <pi:First_Address_Line_Data pi:Label="Address Line 1" pi:Type="ADDRESS_LINE_1">5555
                        Marcos Street</pi:First_Address_Line_Data>
                    <pi:First_Municipality>San Diego</pi:First_Municipality>
                    <pi:First_Region>CA</pi:First_Region>
                    <pi:First_Postal_Code>92109</pi:First_Postal_Code>
                    <pi:Area_Code>619</pi:Area_Code>
                    <pi:Phone_Number>5559999</pi:Phone_Number>
                    <pi:First_Email_Address>bobby@acme.net</pi:First_Email_Address>
                </pi:Personal>
                <pi:Status>
                    <pi:Employee_Status>A</pi:Employee_Status>
                    <pi:Hire_Date>2011-02-28</pi:Hire_Date>
                    <pi:Original_Hire_Date>2011-02-28</pi:Original_Hire_Date>
                    <pi:Continuous_Service_Date>2011-02-28</pi:Continuous_Service_Date>
                    <pi:Seniority_Date>2011-02-28</pi:Seniority_Date>
                </pi:Status>
                <pi:Position>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Worker_Type>FTR</pi:Worker_Type>
                    <pi:Job_Exempt>1</pi:Job_Exempt>
                    <pi:Scheduled_Weekly_Hours>40</pi:Scheduled_Weekly_Hours>
                    <pi:Default_Weekly_Hours>40</pi:Default_Weekly_Hours>
                    <pi:Pay_Cycle_Hours>86.67</pi:Pay_Cycle_Hours>
                    <pi:Pay_Rate_Type>H</pi:Pay_Rate_Type>
                    <pi:Compensation_Effective_Date>2013-01-01</pi:Compensation_Effective_Date>
                    <pi:Total_Base_Pay>27.2645</pi:Total_Base_Pay>
                    <pi:Base_Pay_Currency>USD</pi:Base_Pay_Currency>
                    <pi:Base_Pay_Frequency>H</pi:Base_Pay_Frequency>
                    <pi:Organization_One>1500</pi:Organization_One>
                    <pi:Workers_Compensation_Code>8810</pi:Workers_Compensation_Code>
                    <pi:Business_Site>San Diego Office</pi:Business_Site>
                    <pi:Business_Site_Name>San Diego Office</pi:Business_Site_Name>
                    <pi:Business_Site_Region>CA</pi:Business_Site_Region>
                    <pi:Supervisor_Name>Jed Sanders (1402)</pi:Supervisor_Name>
                </pi:Position>
                <pi:Identifier>
                    <pi:Operation>REMOVE</pi:Operation>
                    <pi:Identifier_Type>SSN</pi:Identifier_Type>
                    <pi:Identifier_Value>123456788</pi:Identifier_Value>
                </pi:Identifier>
                <pi:Identifier>
                    <pi:Operation>ADD</pi:Operation>
                    <pi:Identifier_Type>SSN</pi:Identifier_Type>
                    <pi:Identifier_Value>111111111</pi:Identifier_Value>
                </pi:Identifier>
                <pi:Identifier>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Identifier_Type>ADP_No</pi:Identifier_Type>
                    <pi:Identifier_Value>541</pi:Identifier_Value>
                </pi:Identifier>
                <pi:Additional_Information>
                    <pi:PreferredFirstName>Bobby</pi:PreferredFirstName>
                </pi:Additional_Information>
            </pi:Employee>
            <pi:Employee>
                <pi:Summary>
                    <pi:Employee_ID>1842</pi:Employee_ID>
                    <pi:Name>James Johnson</pi:Name>
                     <pi:Payroll_Company_ID>25G</pi:Payroll_Company_ID>
                    <pi:Payroll_Company_Name>Acme.net</pi:Payroll_Company_Name>
                    <pi:Pay_Group_ID>G85D6W87D</pi:Pay_Group_ID>
                    <pi:Pay_Group_Name>G85D6W87D Semi-monthly</pi:Pay_Group_Name>
                </pi:Summary>
                <pi:Personal>
                    <pi:First_Name>James</pi:First_Name>
                    <pi:Middle_Name>B</pi:Middle_Name>
                    <pi:Last_Name>Johnson</pi:Last_Name>
                    <pi:Gender>M</pi:Gender>
                    <pi:Birth_Date>1982-09-17</pi:Birth_Date>
                    <pi:Marital_Status>S</pi:Marital_Status>
                    <pi:First_Address_Line_Data pi:Label="Address Line 1" pi:Type="ADDRESS_LINE_1">1111
                        Hampton Way</pi:First_Address_Line_Data>
                    <pi:First_Municipality>San Diego</pi:First_Municipality>
                    <pi:First_Region>CA</pi:First_Region>
                    <pi:First_Postal_Code>92109</pi:First_Postal_Code>
                    <pi:Area_Code>619</pi:Area_Code>
                    <pi:Phone_Number>5551234</pi:Phone_Number>
                    <pi:First_Email_Address>jjohnson@acme.net</pi:First_Email_Address>
                </pi:Personal>
                <pi:Status>
                    <pi:Employee_Status>A</pi:Employee_Status>
                    <pi:Hire_Date>2010-03-28</pi:Hire_Date>
                    <pi:Original_Hire_Date>2010-03-28</pi:Original_Hire_Date>
                    <pi:Continuous_Service_Date>2010-03-28</pi:Continuous_Service_Date>
                    <pi:Seniority_Date>2010-03-28</pi:Seniority_Date>
                </pi:Status>
                <pi:Position>
                    <pi:Operation>REMOVE</pi:Operation>
                    <pi:Worker_Type>FTR</pi:Worker_Type>
                    <pi:Job_Exempt>1</pi:Job_Exempt>
                    <pi:Scheduled_Weekly_Hours>40</pi:Scheduled_Weekly_Hours>
                    <pi:Default_Weekly_Hours>40</pi:Default_Weekly_Hours>
                    <pi:Pay_Cycle_Hours>86.67</pi:Pay_Cycle_Hours>
                    <pi:Pay_Rate_Type>H</pi:Pay_Rate_Type>
                    <pi:Compensation_Effective_Date>2010-03-28</pi:Compensation_Effective_Date>
                    <pi:Total_Base_Pay>27.2645</pi:Total_Base_Pay>
                    <pi:Base_Pay_Currency>USD</pi:Base_Pay_Currency>
                    <pi:Base_Pay_Frequency>H</pi:Base_Pay_Frequency>
                    <pi:Organization_One>1500</pi:Organization_One>
                    <pi:Workers_Compensation_Code>8810</pi:Workers_Compensation_Code>
                    <pi:Business_Site>San Diego Office</pi:Business_Site>
                    <pi:Business_Site_Name>San Diego Office</pi:Business_Site_Name>
                    <pi:Business_Site_Region>CA</pi:Business_Site_Region>
                    <pi:Supervisor_Name>Jed Sanders (1402)</pi:Supervisor_Name>
                </pi:Position>
                <pi:Position>
                    <pi:Operation>ADD</pi:Operation>
                    <pi:Worker_Type>FTR</pi:Worker_Type>
                    <pi:Job_Exempt>1</pi:Job_Exempt>
                    <pi:Scheduled_Weekly_Hours>40</pi:Scheduled_Weekly_Hours>
                    <pi:Default_Weekly_Hours>40</pi:Default_Weekly_Hours>
                    <pi:Pay_Cycle_Hours>86.67</pi:Pay_Cycle_Hours>
                    <pi:Pay_Rate_Type>S</pi:Pay_Rate_Type>
                    <pi:Compensation_Effective_Date>2013-01-01</pi:Compensation_Effective_Date>
                    <pi:Total_Base_Pay>95123</pi:Total_Base_Pay>
                    <pi:Base_Pay_Currency>USD</pi:Base_Pay_Currency>
                    <pi:Base_Pay_Frequency>S</pi:Base_Pay_Frequency>
                    <pi:Organization_One>1500</pi:Organization_One>
                    <pi:Workers_Compensation_Code>8810</pi:Workers_Compensation_Code>
                    <pi:Business_Site>San Diego Office</pi:Business_Site>
                    <pi:Business_Site_Name>San Diego Office</pi:Business_Site_Name>
                    <pi:Business_Site_Region>CA</pi:Business_Site_Region>
                    <pi:Supervisor_Name>Jed Sanders (1402)</pi:Supervisor_Name>
                </pi:Position>
                <pi:Identifier>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Identifier_Type>SSN</pi:Identifier_Type>
                    <pi:Identifier_Value>222222222</pi:Identifier_Value>
                </pi:Identifier>
                <pi:Identifier>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Identifier_Type>ADP_No</pi:Identifier_Type>
                    <pi:Identifier_Value>543</pi:Identifier_Value>
                </pi:Identifier>
                <pi:Additional_Information>
                    <pi:PreferredFirstName>Jimmy</pi:PreferredFirstName>
                </pi:Additional_Information>
            </pi:Employee>
        </pi:PayGroup>
        <pi:PayGroup>
            <pi:Header>
                <pi:Version>18</pi:Version>
                <pi:Payroll_Company_ID>NMA</pi:Payroll_Company_ID>
                <pi:Payroll_Company_Name>Acme.net</pi:Payroll_Company_Name>
                <pi:Pay_Group_ID>DS87D7RR9</pi:Pay_Group_ID>
                <pi:Pay_Group_Name>DS87D7RR9 Weekly</pi:Pay_Group_Name>
                <pi:Pay_Period_Start>2013-02-16-08:00</pi:Pay_Period_Start>
                <pi:Pay_Period_End>2013-02-28-08:00</pi:Pay_Period_End>
                <pi:Updated_From>2013-02-28T18:00:15.171-08:00</pi:Updated_From>
                <pi:Updated_To>2013-03-07T12:25:36.860-08:00</pi:Updated_To>
                <pi:All_Effective>false</pi:All_Effective>
            </pi:Header>
            <pi:Employee>
                <pi:Summary>
                    <pi:Employee_ID>1432</pi:Employee_ID>
                    <pi:Name>Steve Whatever</pi:Name>
                    <pi:Payroll_Company_ID>NMA</pi:Payroll_Company_ID>
                    <pi:Payroll_Company_Name>Acme.net</pi:Payroll_Company_Name>
                    <pi:Pay_Group_ID>DS87D7RR9</pi:Pay_Group_ID>
                    <pi:Pay_Group_Name>DS87D7RR9 Weekly</pi:Pay_Group_Name>
                </pi:Summary>
                <pi:Personal>
                    <pi:First_Name>Steve</pi:First_Name>
                    <pi:Middle_Name>B</pi:Middle_Name>
                    <pi:Last_Name>Whatever</pi:Last_Name>
                    <pi:Gender>M</pi:Gender>
                    <pi:Birth_Date>1985-07-19</pi:Birth_Date>
                    <pi:Marital_Status>S</pi:Marital_Status>
                    <pi:First_Address_Line_Data pi:Label="Address Line 1" pi:Type="ADDRESS_LINE_1">1234
                        Dreyfus Lane</pi:First_Address_Line_Data>
                    <pi:First_Municipality>San Diego</pi:First_Municipality>
                    <pi:First_Region>CA</pi:First_Region>
                    <pi:First_Postal_Code>92109</pi:First_Postal_Code>
                    <pi:Area_Code>619</pi:Area_Code>
                    <pi:Phone_Number>5558888</pi:Phone_Number>
                    <pi:First_Email_Address>steve@acme.net</pi:First_Email_Address>
                </pi:Personal>
                <pi:Status>
                    <pi:Employee_Status>A</pi:Employee_Status>
                    <pi:Hire_Date>2009-02-28</pi:Hire_Date>
                    <pi:Original_Hire_Date>2009-02-28</pi:Original_Hire_Date>
                    <pi:Continuous_Service_Date>2009-02-28</pi:Continuous_Service_Date>
                    <pi:Seniority_Date>2009-02-28</pi:Seniority_Date>
                </pi:Status>
                <pi:Position>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Worker_Type>FTR</pi:Worker_Type>
                    <pi:Job_Exempt>1</pi:Job_Exempt>
                    <pi:Scheduled_Weekly_Hours>40</pi:Scheduled_Weekly_Hours>
                    <pi:Default_Weekly_Hours>40</pi:Default_Weekly_Hours>
                    <pi:Pay_Cycle_Hours>86.67</pi:Pay_Cycle_Hours>
                    <pi:Pay_Rate_Type>H</pi:Pay_Rate_Type>
                    <pi:Compensation_Effective_Date>2013-01-01</pi:Compensation_Effective_Date>
                    <pi:Total_Base_Pay>27.2645</pi:Total_Base_Pay>
                    <pi:Base_Pay_Currency>USD</pi:Base_Pay_Currency>
                    <pi:Base_Pay_Frequency>H</pi:Base_Pay_Frequency>
                    <pi:Organization_One>1500</pi:Organization_One>
                    <pi:Workers_Compensation_Code>8810</pi:Workers_Compensation_Code>
                    <pi:Business_Site>San Diego Office</pi:Business_Site>
                    <pi:Business_Site_Name>San Diego Office</pi:Business_Site_Name>
                    <pi:Business_Site_Region>CA</pi:Business_Site_Region>
                    <pi:Supervisor_Name>Adam Sandler (5472)</pi:Supervisor_Name>
                </pi:Position>
                <pi:Identifier>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Identifier_Type>SSN</pi:Identifier_Type>
                    <pi:Identifier_Value>333333333</pi:Identifier_Value>
                </pi:Identifier>
                <pi:Identifier>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Identifier_Type>ADP_No</pi:Identifier_Type>
                    <pi:Identifier_Value>542</pi:Identifier_Value>
                </pi:Identifier>
            </pi:Employee>
            <pi:Employee>
                <pi:Summary>
                    <pi:Employee_ID>3333</pi:Employee_ID>
                    <pi:Name>James Anything</pi:Name>
                    <pi:Payroll_Company_ID>NMA</pi:Payroll_Company_ID>
                    <pi:Payroll_Company_Name>Acme.net</pi:Payroll_Company_Name>
                    <pi:Pay_Group_ID>DS87D7RR9</pi:Pay_Group_ID>
                    <pi:Pay_Group_Name>DS87D7RR9 Weekly</pi:Pay_Group_Name>
                </pi:Summary>
                <pi:Personal>
                    <pi:First_Name>James</pi:First_Name>
                    <pi:Middle_Name>B</pi:Middle_Name>
                    <pi:Last_Name>Anything</pi:Last_Name>
                    <pi:Gender>M</pi:Gender>
                    <pi:Birth_Date>1975-04-01</pi:Birth_Date>
                    <pi:Marital_Status>S</pi:Marital_Status>
                    <pi:First_Address_Line_Data pi:Label="Address Line 1" pi:Type="ADDRESS_LINE_1">9865
                        Wells Lane</pi:First_Address_Line_Data>
                    <pi:First_Municipality>San Diego</pi:First_Municipality>
                    <pi:First_Region>CA</pi:First_Region>
                    <pi:First_Postal_Code>92109</pi:First_Postal_Code>
                    <pi:Area_Code>619</pi:Area_Code>
                    <pi:Phone_Number>5557272</pi:Phone_Number>
                    <pi:First_Email_Address>jany@acme.net</pi:First_Email_Address>
                </pi:Personal>
                <pi:Status>
                    <pi:Employee_Status>A</pi:Employee_Status>
                    <pi:Hire_Date>2012-09-28</pi:Hire_Date>
                    <pi:Original_Hire_Date>2012-09-28</pi:Original_Hire_Date>
                    <pi:Continuous_Service_Date>2012-09-28</pi:Continuous_Service_Date>
                    <pi:Seniority_Date>2012-09-28</pi:Seniority_Date>
                </pi:Status>
                <pi:Position>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Worker_Type>FTR</pi:Worker_Type>
                    <pi:Job_Exempt>1</pi:Job_Exempt>
                    <pi:Scheduled_Weekly_Hours>40</pi:Scheduled_Weekly_Hours>
                    <pi:Default_Weekly_Hours>40</pi:Default_Weekly_Hours>
                    <pi:Pay_Cycle_Hours>86.67</pi:Pay_Cycle_Hours>
                    <pi:Pay_Rate_Type>H</pi:Pay_Rate_Type>
                    <pi:Compensation_Effective_Date>2013-01-01</pi:Compensation_Effective_Date>
                    <pi:Total_Base_Pay>27.2645</pi:Total_Base_Pay>
                    <pi:Base_Pay_Currency>USD</pi:Base_Pay_Currency>
                    <pi:Base_Pay_Frequency>H</pi:Base_Pay_Frequency>
                    <pi:Organization_One>1500</pi:Organization_One>
                    <pi:Workers_Compensation_Code>8810</pi:Workers_Compensation_Code>
                    <pi:Business_Site>San Diego Office</pi:Business_Site>
                    <pi:Business_Site_Name>San Diego Office</pi:Business_Site_Name>
                    <pi:Business_Site_Region>CA</pi:Business_Site_Region>
                    <pi:Supervisor_Name>Adam Sandler (5472)</pi:Supervisor_Name>
                </pi:Position>
                <pi:Identifier>
                    <pi:Operation>NONE</pi:Operation>
                    <pi:Identifier_Type>SSN</pi:Identifier_Type>
                    <pi:Identifier_Value>444444444</pi:Identifier_Value>
                </pi:Identifier>
                <pi:Identifier>
                    <pi:Operation>REMOVE</pi:Operation>
                    <pi:Identifier_Type>ADP_No</pi:Identifier_Type>
                    <pi:Identifier_Value>544</pi:Identifier_Value>
                </pi:Identifier>
                <pi:Identifier>
                    <pi:Operation>ADD</pi:Operation>
                    <pi:Identifier_Type>ADP_No</pi:Identifier_Type>
                    <pi:Identifier_Value>545</pi:Identifier_Value>
                </pi:Identifier>
            </pi:Employee>
        </pi:PayGroup>
    </pi:Payroll_Extract_Employees>

XSLT代码:

<!-- <?xml version="1.0" encoding="UTF-8"?>   -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:pi="urn:com.workday/picof">

    <xsl:variable name="sep">,</xsl:variable>

    <xsl:template match="pi:Payroll_Extract_Employees">
        <xsl:text>&#xa;</xsl:text>
        <xsl:for-each select="pi:PayGroup">
            <xsl:text>Pay Group: </xsl:text>
            <xsl:value-of select="pi:Header/pi:Pay_Group_Name"/>
            <xsl:text>&#xa;</xsl:text>

            <xsl:text>EmployeeID,Last_Name,First_Name,SSN,Hire_Date&#xa;</xsl:text>
            <xsl:for-each select="pi:Employee">

                <xsl:value-of select="pi:Summary/pi:Employee_ID"/>
                <xsl:value-of select="$sep"/>

                <xsl:value-of select="pi:Personal/pi:Last_Name"/>
                <xsl:value-of select="$sep"/>

                <xsl:value-of select="pi:Personal/pi:First_Name"/>
                <xsl:value-of select="$sep"/>

                <xsl:value-of select="pi:Identifier[pi:Identifier_Type = 'SSN']/pi:Identifier_Value"/>
                <xsl:value-of select="$sep"/>

                <xsl:value-of select="pi:Status/pi:Hire_Date"/>

                <xsl:text>&#xa;</xsl:text>
            </xsl:for-each>  <!-- end employee loop -->

            <xsl:text>&#xa;</xsl:text>

        </xsl:for-each>  <!-- end paygroup loop -->

    </xsl:template> <!-- end of main template -->
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:1)

你没有提供关于选择哪个SSN号码的任何指导,并且只有一个例子,我在这里猜测。尝试更换:

<xsl:value-of select="pi:Identifier[pi:Identifier_Type = 'SSN']/pi:Identifier_Value"/>

使用:

<xsl:value-of select="pi:Identifier[pi:Identifier_Type = 'SSN' and not(pi:Operation='REMOVE')]/pi:Identifier_Value"/>

这是基于这样的假设:每当SSN被移除时,将会有另一个(并且只有一个)ADDed - 并且这是你想要在输出中拥有的那个。当然,为了验证这种假设,您必须查阅源XML架构。

答案 1 :(得分:0)

  

如果有多个值

,它必须是最新的SSN

我同意以前的评论和答案,这是一个有点粗略的要求。在消息来源中没有任何暗示“最近”的东西。有几种可能的结论,您必须检查具有输入XML规范的任何人:

  • 最近也是最后一次,使用:

    <xsl:value-of select="pi:Identifier[pi:Identifier_Type = 'SSN']
        [last()]/pi:Identifier_Value"/>
    
  • 最新的始终是第一个,使用:

    <xsl:value-of select="pi:Identifier[pi:Identifier_Type = 'SSN']
        [1]/pi:Identifier_Value"/>
    
  • 最新的是最后一个,但可能有一定的“操作”(如迈克尔所建议):

    <xsl:value-of select="pi:Identifier[pi:Identifier_Type = 'SSN' 
        and not(pi:Operation='REMOVE')][last()]/pi:Identifier_Value"/>
    
  • 其他任何事情(填空)