员工可以是经理、人力资源合作伙伴或两者兼而有之。他们可以是任意数量成本中心的经理。他们可以是任意数量的成本中心的人力资源合作伙伴。
如果我从每条记录中提取我需要的组合,我会收到重复的。员工 A 和员工 B 向同一成本中心的同一经理报告,因此返回两行。一个给员工 A,一个给员工 B。因为我没有提取他们的员工 ID(只有经理和 hr 合作伙伴的),所以它们显示为重复的行。我目前正在使用 '[not(.=preceding::' 来消除重复项,但会检查整个文件,并且只允许经理属于一个成本中心而不是多个成本中心。如何仅对组执行检查(成本中心)而不是整个文件(所有成本中心)?
我尝试了两个复合键(managerID,成本中心 ID)和(hr 合作伙伴,成本中心 ID),但一直在努力解决它,直到它变得混乱并且无法正常工作。不幸的是,我将这段代码保存在上面。因此,如果这真的是我唯一的选择,我将不得不重写它并从那里进行故障排除。
输入 XML 样本:
<wd:Report_Data>
<wd:Report_Entry>
<wd:Sub_Employee_ID>123345678</wd:Sub_Employee_ID>
<wd:Cost_Center_ID>20000003</wd:Cost_Center_ID>
<wd:HR_Partner>
<wd:ID wd:type="Employee_ID">81025060</wd:ID>
</wd:HR_Partner>
<wd:HR_Partner>
<wd:ID wd:type="Employee_ID">81452340</wd:ID>
</wd:HR_Partner>
<wd:Manager>
<wd:Employee_ID>81055097</wd:Employee_ID>
</wd:Manager>
<wd:Role_ID>2005</wd:Role_ID>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Sub_Employee_ID>22345123</wd:Sub_Employee_ID>
<wd:Cost_Center_ID>20000003</wd:Cost_Center_ID>
<wd:HR_Partner>
<wd:ID wd:type="Employee_ID">81025060</wd:ID>
</wd:HR_Partner>
<wd:Manager>
<wd:Employee_ID>81055097</wd:Employee_ID>
</wd:Manager>
<wd:Role_ID>2005</wd:Role_ID>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Sub_Employee_ID>33424567</wd:Sub_Employee_ID>
<wd:Cost_Center_ID>20000003</wd:Cost_Center_ID>
<wd:HR_Partner>
<wd:ID wd:type="Employee_ID">81022549</wd:ID>
</wd:HR_Partner>
<wd:Manager>
<wd:Employee_ID>12312312</wd:Employee_ID>
</wd:Manager>
<wd:Role_ID>2005</wd:Role_ID>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Sub_Employee_ID>72390123</wd:Sub_Employee_ID>
<wd:Cost_Center_ID>40000006</wd:Cost_Center_ID>
<wd:HR_Partner>
<wd:ID wd:type="Employee_ID">81025060</wd:ID>
</wd:HR_Partner>
<wd:Manager>
<wd:Employee_ID>81055097</wd:Employee_ID>
</wd:Manager>
<wd:Role_ID>2005</wd:Role_ID>
</wd:Report_Entry>
</wd:Report_Data>
期望的输出:
81055097;
20000003;
2005;
Manager
81025060;
20000003;
2005;
HR Partner
81452340
20000003;
2005;
HR Partner
12312312
20000003;
2005;
Manager
81022549;
20000003;
2005;
HR Partner
81055097;
40000006;
2005;
Manager
81025060;
40000006;
2005;
HR_Partner
当前xslt:
<xsl:template match="wd:Report_Data/wd:Report_Entry">
<xsl:for-each-group select="." group-by="wd:Cost_Center_ID">
<!-- Manager Line -->
<!-- Filter Duplicates -->
<xsl:sort select="wd:Manager/wd:Employee_ID"/>
<xsl:if test="wd:Manager/wd:Employee_ID[not(.=preceding::wd:Manager/wd:Employee_ID)]">
<xsl:value-of select="wd:Manager/wd:Employee_ID"/>;
<xsl:value-of select="wd:Cost_Center_ID"/>;
<xsl:value-of select="wd:Role_ID"/>;
<xsl:value-of>Manager</xsl:value-of>
<xsl:value-of select="$linefeed"/>
</xsl:if>
<!-- HR Partner Line -->
<!-- Filter Duplicates -->
<xsl:for-each select="../wd:HR_Partner/wd:ID[@wd:type='Employee_ID']">
<xsl:if test=".[not(.=preceding::wd:HR_Partner/wd:ID[@wd:type='Employee_ID'])]">
<xsl:value-of select="wd:ID[@wd:type='Employee_ID']"/>;
<xsl:value-of select="../wd:Cost_Center_ID"/>;
<xsl:value-of select="../wd:Role_ID"/>;
<xsl:value-of>HR Partner</xsl:value-of>
<xsl:value-of select="$linefeed"/>
</xsl:if>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>