2017-05-01 7 views
0

Ich habe eine XML-Datei, die Knoten mit doppelten employeeNumbers enthält. Ich brauche nur die erste Platte. Wie entferne ich den zweiten Datensatz mit der gleichen Mitarbeiternummer? Jede Hilfe wird sehr geschätzt.xslt 2.0 Entfernen von Duplikaten

Beispiel XML-Datei

<?xml version='1.0' encoding='UTF-8'?> 
<cd:Report_Data xmlns:cd="urn:com.comday.report/INT007BOutbound"> 
    <cd:Report_Entry> 
     <cd:displayName>Sarah Smith</cd:displayName> 
     <cd:employeeNumber>97061</cd:employeeNumber> 
     <cd:employeeType>CL</cd:employeeType> 
     <cd:CF_-_Current_employeeType>CL</cd:CF_-_Current_employeeType> 
     <cd:ont-startdate>20131018</cd:ont-startdate> 
     <cd:ont-enddate>20160301</cd:ont-enddate> 
    </cd:Report_Entry> 
    <cd:Report_Entry> 
     <cd:displayName>Danny Jones</cd:displayName> 
     <cd:employeeNumber>97062</cd:employeeNumber> 
     <cd:employeeType>EMP</cd:employeeType> 
     <cd:CF_-_Current_employeeType>EMP</cd:CF_-_Current_employeeType> 
     <cd:ont-startdate>20170501</cd:ont-startdate> 
     <cd:ont-enddate>20670501</cd:ont-enddate> 
    </cd:Report_Entry> 
    <cd:Report_Entry> 
     <cd:displayName>Danny Jones</cd:displayName> 
     <cd:employeeNumber>97062</cd:employeeNumber> 
     <cd:employeeType>CL</cd:employeeType> 
     <cd:CF_-_Current_employeeType>CL</cd:CF_-_Current_employeeType> 
     <cd:ont-startdate>20131112</cd:ont-startdate> 
     <cd:ont-enddate>20140620</cd:ont-enddate> 
    </cd:Report_Entry> 
    <cd:Report_Entry> 
     <cd:displayName>David Jenkins</cd:displayName> 
     <cd:employeeNumber>97063</cd:employeeNumber> 
     <cd:employeeType>EMP</cd:employeeType> 
     <cd:CF_-_Current_employeeType>EMP</cd:CF_-_Current_employeeType> 
     <cd:ont-startdate>20131118</cd:ont-startdate> 
     <cd:ont-enddate>20631118</cd:ont-enddate> 
    </cd:Report_Entry> 
</cd:Report_Data> 

Beispiel XSL-Datei

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output indent="no" method="text"/> 
    <xsl:template match="cd:Report_Data" xmlns:cd="urn:com.comday.report/INT007BOutbound"> 
     <!--These are just text column headers for output--> 
     <xsl:text>displayName,employeeNumber,employeeType</xsl:text> 
<xsl:call-template name="insertNewLine"/> 
     <xsl:for-each select="cd:Report_Entry"> 
      <xsl:variable name="date"> 
       <xsl:value-of select="format-date(current-date(),'[Y0001][M01][D01]')"/>  
      </xsl:variable> 
      <xsl:choose> 
       <xsl:when test="$date &lt; cd:ont-startdate or cd:ont-enddate &lt; $date"> 
        <xsl:value-of select="replace(cd:displayName,',',' ')"/> 
        <xsl:call-template name="insertDelimiter"/> 
        <xsl:value-of select="cd:employeeNumber"/> 
        <xsl:call-template name="insertDelimiter"/> 
        <xsl:value-of select="cd:employeeType"/> 
       </xsl:when> 
      </xsl:choose> 
      <xsl:choose> 
       <xsl:when test="cd:ont-startdate &lt;= $date and $date &lt;= cd:ont-enddate"> 
        <xsl:value-of select="replace(cd:displayName,',',' ')"/> 
        <xsl:call-template name="insertDelimiter"/> 
        <xsl:value-of select="cd:employeeNumber"/> 
        <xsl:call-template name="insertDelimiter"/> 
        <xsl:value-of select="cd:CF_-_Current_employeeType"/> 
       </xsl:when> 
      </xsl:choose> 
      <xsl:call-template name="insertNewLine"/> 
     </xsl:for-each> 
    </xsl:template> 
<!--****************************************--> 
<!-- Starting function library section here --> 
    <xsl:template name="insertDelimiter"> 
     <xsl:text>,</xsl:text> 
    </xsl:template> 
<!--****************************************--> 
    <xsl:template name="insertNewLine"> 
<!-- Used to insert a new line into the XML output --> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Brauchen Sie die 'xsl: when' Logik oder ist das ein Teil Ihres Versuchs, sich zu entdupsen? Ist das auch eine Transformation zu CSV? – Parfait

Antwort

1

ändern <xsl:for-each select="cd:Report_Entry">-<xsl:for-each-group select="cd:Report_Entry" group-by="cd:employeeNumber"> (und natürlich auch den End-Tag </xsl:for-each> dann <xsl:for-each-group>).

+0

Das hat mich genau wie nötig repariert. Danke für die Antwort. So einfach und ich suchte nach etwas Komplexem! – blulew

+1

@blulew - Bitte beachten Sie [diese Antwort akzeptieren] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Weitere Informationen finden Sie unter http://stackoverflow.com/help/someone-answers. –