2017-01-30 155 views
0

我有这个XML,我需要检查整个XML文件并删除具有相同日期,操作和原因的任何Record_Number。删除XML中的元素

<Data> 
<Row> 
    <Record> 
     <Record_Row> 
      <Record_Number>111</Record_Number> 
      <Date>10242016</Date> 
      <Action>RFL</Action> 
      <Reason>RFL</Reason> 
     </Record_Row> 
    </Record> 
    <Record> 
     <Record_Row> 
      <Record_Number>111</Record_Number> 
      <Date>10242016</Date> 
      <Action>RFL</Action> 
      <Reason>RFL</Reason> 
     </Record_Row> 
    </Record> 
    <Record> 
     <Record_Row> 
      <Record_Number>111</Record_Number> 
      <Date>06302016</Date> 
      <Action>TER</Action> 
      <Reason>ATT</Reason> 
     </Record_Row> 
    </Record> 
    <Record> 
     <Record_Row> 
      <Record_Number>444</Record_Number> 
      <Date>04012016</Date> 
      <Action>HIR</Action> 
      <Reason>REH</Reason> 
     </Record_Row> 
    </Record> 
</Row> 
</Data> 

所以在上面的例子中,只有一个 Record_Number 111日期10242016 和行动重建家庭联系和原因RFL应该保持。

注意,有可能是3个以上的元素用相同的日期,操作与理性引用到一个Record_Number,但在我上面的例子我只用2

应该给我在这之后xml文件应用逻辑:

<Data> 
<Row> 
    <Record> 
     <Record_Row> 
      <Record_Number>111</Record_Number> 
      <Date>10242016</Date> 
      <Action>RFL</Action> 
      <Reason>RFL</Reason> 
     </Record_Row> 
    </Record> 
    <Record> 
     <Record_Row> 
      <Record_Number>111</Record_Number> 
      <Date>06302016</Date> 
      <Action>TER</Action> 
      <Reason>ATT</Reason> 
     </Record_Row> 
    </Record> 
    <Record> 
     <Record_Row> 
      <Record_Number>444</Record_Number> 
      <Date>04012016</Date> 
      <Action>HIR</Action> 
      <Reason>REH</Reason> 
     </Record_Row> 
    </Record> 
</Row> 
</Data> 
+1

这是一个经常被问到的问题。请查看其他答案。根据您使用的XSLT版本,您可能需要阅读Muenchian分组(XSLT1.0)或者(XSLT2.0)。 – Madeyedexter

+0

此外,请发布您至今已编写的XSLT代码。 – Madeyedexter

回答

0

使用Muenchian分组的在XSLT-1.0:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/> 
    <xsl:key name="record-row-key" match="Data/Row/Record/Record_Row" use="concat(Record_Number,Date,Action,Reason)"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="Data/Row/Record"> 
     <xsl:for-each select="Record_Row[generate-id()=generate-id(key('record-row-key',concat(Record_Number,Date,Action,Reason)[1]))]"> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

使用<for-each-group>XSLT的2.0:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output encoding="UTF-8" indent="yes" method="xml"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="/"> 
     <Data> 
      <Row> 
       <xsl:for-each-group select="Data/Row/Record" group-by="concat(Record_Row/Record_Number,Record_Row/Date,Record_Row/Action,Record_Row/Reason)"> 
        <xsl:copy-of select="."/> 
       </xsl:for-each-group> 
      </Row> 
     </Data> 
    </xsl:template> 
</xsl:stylesheet>