使用xslt删除选择性重复项

时间:2018-01-12 01:45:13

标签: xml xslt muenchian-grouping

我需要从xml文件中删除重复项,我想保留比早期记录更晚的记录。我输出的xslt是先前的记录。我想要后一个。你能帮我吗?

<FileRead xmlns="http://TargetNamespace.com/EmpDetails">
   <EmployeeInformation>
      <Empl_ID>63496</Empl_ID>
      <First_Name>ALEXIS</First_Name>
      <Last_Name>TORRES</Last_Name>
      <Record_Updated_Date>7/19/2017</Record_Updated_Date>
   </EmployeeInformation>
   <EmployeeInformation>
      <Empl_ID>63497</Empl_ID>
      <First_Name>JOHN</First_Name>
      <Last_Name>DOE</Last_Name>
      <Record_Updated_Date>8/19/2017</Record_Updated_Date>
   </EmployeeInformation>
   <EmployeeInformation>
      <Empl_ID>63496</Empl_ID>
      <First_Name>ALEXIS</First_Name>
      <Last_Name>TORRES</Last_Name>
      <Record_Updated_Date>8/19/2017</Record_Updated_Date>
   </EmployeeInformation>
   <EmployeeInformation>
      <Empl_ID>63498</Empl_ID>
      <First_Name>BILL</First_Name>
      <Last_Name>SMITH</Last_Name>
      <Record_Updated_Date>7/19/2017</Record_Updated_Date>
   </EmployeeInformation>   
</FileRead>

我的XSLT

<xsl:stylesheet version="1.0" xmlns:ns0="http://TargetNamespace.com/EmpDetails" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="employees" match="ns0:EmployeeInformation" use="ns0:Empl_ID"/>
  <xsl:template match="/*">
    <ns0:FileRead>
      <xsl:copy-of select="*[generate-id() = generate-id(key('employees', ns0:Empl_ID)[1])]"/>
    </ns0:FileRead>
  </xsl:template>
</xsl:stylesheet>

预期输出

<FileRead xmlns="http://TargetNamespace.com/EmpDetails">
   <EmployeeInformation>
      <Empl_ID>63497</Empl_ID>
      <First_Name>JOHN</First_Name>
      <Last_Name>DOE</Last_Name>
      <Record_Updated_Date>8/19/2017</Record_Updated_Date>
   </EmployeeInformation>
   <EmployeeInformation>
      <Empl_ID>63496</Empl_ID>
      <First_Name>ALEXIS</First_Name>
      <Last_Name>TORRES</Last_Name>
      <Record_Updated_Date>8/19/2017</Record_Updated_Date>
   </EmployeeInformation>
   <EmployeeInformation>
      <Empl_ID>63498</Empl_ID>
      <First_Name>BILL</First_Name>
      <Last_Name>SMITH</Last_Name>
      <Record_Updated_Date>7/19/2017</Record_Updated_Date>
   </EmployeeInformation>   
</FileRead>

1 个答案:

答案 0 :(得分:1)

您有两个错误:

  1. 您的EmployeeInformation元素在XML(http://TargetNamespace.com/EmpDetails)和XSLT(http://TargetNamespace.com/GetFileDetails)中具有不同的命名空间。
  2. 使用相同的一个
  3. 要获得最后一场比赛,只需使用[last()]代替[1]
  4. 将这两个建议合并到您的XSLT中:

    <xsl:stylesheet version="1.0" 
      xmlns:ns0="http://TargetNamespace.com/EmpDetails" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:key name="employees" match="ns0:EmployeeInformation" use="ns0:Empl_ID"/>
    
      <xsl:template match="/*">
        <ns0:FileRead>
          <xsl:copy-of select="*[generate-id() = generate-id(key('employees', ns0:Empl_ID)[last()])]"/>
        </ns0:FileRead>
      </xsl:template>
    
    </xsl:stylesheet>
    

    输出符合要求。