2017-03-28 11 views
0

직원은 관리자, HR 파트너 또는 둘 모두가 될 수 있습니다. 이들은 여러 비용 센터의 관리자가 될 수 있습니다. 모든 비용 센터의 HR 파트너가 될 수 있습니다.XSLT 그룹에서 중복 제거

모든 레코드에서 필요한 조합을 가져 오면 복제본이 수신됩니다. 직원 A와 직원 B는 동일한 코스트 센터의 동일한 관리자에게보고하므로 두 줄을 반환합니다. 직원 A와 직원 B에 대한 직원 ID (관리자 및 hr 파트너의 직원 ID 만)를 가져 오지 않으므로 중복 된 줄로 표시됩니다. 나는 현재 중복을 제거하기 위해 선행 (: = 선행 :: ')을 사용하고 있지만 전체 파일을 검사하고 관리자는 여러 비용 센터가 아닌 한 비용 센터에만 속할 수 있습니다. 그룹의 검사 만 수행하려면 어떻게해야합니까? (전체 비용 센터) 대신

두 개의 복합 키 (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> 

답변

0

이 솔루션은 다음과 같다보십시오 :

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:wd="http://dummy.com" 
    xpath-default-namespace="http://dummy.com" 
    exclude-result-prefixes="#all"> 
    <xsl:output method="text" encoding="UTF-8" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="Partners" match="//HR_Partner" 
    use="concat(../Cost_Center_ID, '/', ID)"/> 
    <xsl:key name="Managers" match="//Manager" 
    use="concat(../Cost_Center_ID, '/', Employee_ID)"/> 
    <xsl:variable name="lf" select="'&#xA;'"/> 

    <xsl:template match="Report_Data"> 
    <xsl:for-each-group select="Report_Entry" group-by="Cost_Center_ID"> 
     <xsl:for-each select="current-group()"> 
     <xsl:sort select="Manager/Employee_ID"/> 
     <xsl:for-each select="Manager"> 
      <xsl:variable name="kk" select="concat(../Cost_Center_ID, '/', Employee_ID)"/> 
      <xsl:if test="generate-id()=generate-id(key('Managers', $kk)[1])"> 
      <xsl:value-of select="Employee_ID"/> 
      <xsl:text>; </xsl:text> 
      <xsl:value-of select="../Cost_Center_ID"/> 
      <xsl:text>; </xsl:text> 
      <xsl:value-of select="../Role_ID"/> 
      <xsl:text>; Manager;</xsl:text> 
      <xsl:value-of select="$lf"/> 
      </xsl:if> 
     </xsl:for-each> 
     <xsl:for-each select="HR_Partner"> 
      <xsl:variable name="kk" select="concat(../Cost_Center_ID, '/', ID)"/> 
      <xsl:if test="generate-id()=generate-id(key('Partners', $kk)[1])"> 
      <xsl:value-of select="ID"/> 
      <xsl:text>; </xsl:text> 
      <xsl:value-of select="../Cost_Center_ID"/> 
      <xsl:text>; </xsl:text> 
      <xsl:value-of select="../Role_ID"/> 
      <xsl:text>; HR Partner;</xsl:text> 
      <xsl:value-of select="$lf"/> 
      </xsl:if> 
     </xsl:for-each> 
     </xsl:for-each> 
    </xsl:for-each-group> 
    </xsl:template> 
</xsl:transform> 

내가 그것을 온라인 XSLT 검증을 사용하여 테스트, 아래와 같이 입력 XML로 :

<?xml version="1.0" encoding="UTF-8"?> 
<wd:main xmlns:wd="http://dummy.com"> 
    <wd:Report_Data> 
    <!-- Here your Report_Entry records --> 
    </wd:Report_Data> 
</wd:main> 

정렬 순서는 정렬이 적용되어 원하는 출력과 다를 수 있습니다.

+0

예! 고맙습니다! – jlstunt