2017-03-28 19 views
0

従業員は、マネージャ、HRパートナ、またはその両方になることができます。彼らは、任意の数のコストセンターのマネージャーになることができます。それらは、任意の数のコストセンターのHRパートナーになることができます。XSLTグループからの重複の削除

私はすべてのレコードから必要な組み合わせを引き出すと、重複を受け取ります。従業員Aと従業員Bは、同じ原価センタの同じマネージャにレポートするので、2行を返します。従業員Aと従業員Bの従業員IDを取得しません(マネージャとHRパートナーのみ)。重複した行として表示されます。私は現在、重複を排除するために、[。= preceding :: 'を使用していますが、ファイル全体をチェックし、マネージャが倍数ではなく1つのコストセンターにしか属していないようにしています。

私は2つの複合キー(managerID、コストセンターID)と(時間パートナー、コストセンター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> 

を私は以下のように入力XMLで、オンラインXSLT検証を使用してそれをテスト

<?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

関連する問題