2017-01-30 3 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 и РФЛ действий и Reason РКИ должны оставаться.

Обратите внимание, что там может быть 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 Grouping (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> 
Смежные вопросы