2017-03-28 4 views
0

Ein Mitarbeiter kann Manager, HR-Partner oder beides sein. Sie können Manager in einer beliebigen Anzahl von Kostenstellen sein. Sie können HR-Partner einer beliebigen Anzahl von Kostenstellen sein.XSLT Entfernen von Duplikaten aus der Gruppe

Wenn ich die Kombinationen, die ich brauche, aus jedem Datensatz heraushole, erhalte ich Duplikate. Mitarbeiter A und Mitarbeiter B melden sich an denselben Manager in derselben Kostenstelle und geben daher zwei Zeilen zurück. Eine für Mitarbeiter A und eine für Mitarbeiter B. Da ich ihre Mitarbeiter-IDs (nur Manager- und HR-Partner) nicht ziehen, erscheinen sie als doppelte Zeilen. Ich benutze derzeit '[not (. = Previous ::' ', um Duplikate zu eliminieren, überprüft jedoch die gesamte Datei und erlaubt nur einem Manager, zu einer Kostenstelle statt zu mehreren zu gehören. Wie kann ich die Prüfung NUR für die Gruppe durchführen (Kostenstelle)

Ich habe zwei zusammengesetzte Schlüssel (managerID, Kostenstellenidentifikation) und (hr Partner, Kostenstellenidentifikation) versucht, aber kämpfte damit bis es kam leider diesen Code über sie gespeichert chaotisch und nicht funktioniert ich Also, wenn das ist wirklich meine einzige Option, ich werde es neu zu schreiben und beheben von dort

XML-Input-Sample:...

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

gewünschte Ausgabe:

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 

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

Antwort

0

die Lösung weiter unten Versuchen:

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

ich es mit Online-XSLT Prüfer getestet, mit XML-Eingabe wie folgt:

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

Beachten Sie, dass die Sortierreihenfolge von der gewünschten Ausgabe abweicht, da die Sortierung angewendet wird.

+0

ja! Danke! – jlstunt

Verwandte Themen