我试图修复此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>
</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>
</xsl:text>
<xsl:text>EmployeeID,Last_Name,First_Name,SSN,Hire_Date
</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>
</xsl:text>
</xsl:for-each> <!-- end employee loop -->
<xsl:text>
</xsl:text>
</xsl:for-each> <!-- end paygroup loop -->
</xsl:template> <!-- end of main template -->
</xsl:stylesheet>
答案 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"/>
其他任何事情(填空)