Удалить дублирующее значение с помощью XSLT - PullRequest
0 голосов
/ 20 февраля 2020

Я использую XSLT 2.0. Мой желаемый вывод должен иметь уникальные значения элемента ep c без дублирования. Мне нужно сравнить все дочерние элементы, как посмотреть, есть ли дубликаты

 <EPCISDocument xmlns:cbvmda="urn:epcglobal:cbv:mda"
               xmlns:ns5="urn:epcglobal:epcis:xsd:1" schemaVersion="1.2"
               creationDate="2020-02-21T19:14:36.974Z"
               xmlns="urn:epcglobal:epcis:xsd:1">
 <EPCISBody xmlns="">
  <EventList>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546566</epc>
     <epc>100002546567</epc>
    </epcList>
   </ObjectEvent>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546566</epc>
     <epc>100002546567</epc>
    </epcList>
   </ObjectEvent>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546568</epc>
     <epc>100002546569</epc>
    </epcList>
   </ObjectEvent>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546568</epc>
     <epc>100002546570</epc>
     <epc>100002546571</epc>
    </epcList>
   </ObjectEvent>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546571</epc>
     <epc>100002546572</epc>
    </epcList>
   </ObjectEvent>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546573</epc>
    </epcList>
   </ObjectEvent>
    <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546573</epc>
    </epcList>
   </ObjectEvent>
  </EventList>
 </EPCISBody>
</EPCISDocument>

Мой вывод (неверно)

    <?xml version = '1.0' encoding = 'UTF-8'?>
<ns6:EPCISDocument xmlns:ns6="urn:epcglobal:epcis:xsd:1">
   <EPCISBody>
      <EventList>
         <ObjectEvent>
            <epcList>
               <epc>100002546566</epc>
               <epc>100002546567</epc>
               <action/>
            </epcList>
         </ObjectEvent>
         <ObjectEvent>
            <epcList>
               <epc>100002546566</epc>
               <epc>100002546567</epc>
               <action/>
            </epcList>
         </ObjectEvent>
         <ObjectEvent>
            <epcList>
               <epc>100002546568</epc>
               <epc>100002546569</epc>
               <action/>
            </epcList>
         </ObjectEvent>
         <ObjectEvent>
            <epcList>
               <epc>100002546568</epc>
               <epc>100002546569</epc>
               <action/>
            </epcList>
         </ObjectEvent>
         <ObjectEvent>
            <epcList>
               <epc>100002546568</epc>
               <epc>100002546570</epc>
               <epc>100002546571</epc>
               <action/>
            </epcList>
         </ObjectEvent>
         <ObjectEvent>
            <epcList>
               <epc>100002546568</epc>
               <epc>100002546570</epc>
               <epc>100002546571</epc>
               <action/>
            </epcList>
         </ObjectEvent>
         <ObjectEvent>
            <epcList>
               <epc>100002546571</epc>
               <epc>100002546572</epc>
               <action/>
            </epcList>
         </ObjectEvent>
         <ObjectEvent>
            <epcList>
               <epc>100002546573</epc>
               <action/>
            </epcList>
         </ObjectEvent>
      </EventList>
   </EPCISBody>
</ns6:EPCISDocument>

**Desired Output:**

<EPCISDocument xmlns:cbvmda="urn:epcglobal:cbv:mda"
               xmlns:ns5="urn:epcglobal:epcis:xsd:1" schemaVersion="1.2"
               creationDate="2020-02-21T19:14:36.974Z"
               xmlns="urn:epcglobal:epcis:xsd:1">
 <EPCISBody xmlns="">
  <EventList>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546566</epc>
     <epc>100002546567</epc>
    </epcList>
   </ObjectEvent>   
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546568</epc>
     <epc>100002546569</epc>
    </epcList>
   </ObjectEvent>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>    
     <epc>100002546570</epc>
     <epc>100002546571</epc>
    </epcList>
   </ObjectEvent>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>    
     <epc>100002546572</epc>
    </epcList>
   </ObjectEvent>
   <ObjectEvent>
    <action>ADD</action>
    <epcList>
     <epc>100002546573</epc>
    </epcList>
   </ObjectEvent>   
  </EventList>
 </EPCISBody>
</EPCISDocument>

**My XSLT**

<xsl:template match="/">
    <ns6:EPCISDocument>
      <EPCISBody>
        <EventList>
          <xsl:for-each-group select="/ns6:EPCISDocument/EPCISBody/EventList/ObjectEvent/epcList"
                              composite='yes' group-by="epc">
            <ObjectEvent>
              <epcList>
                <xsl:for-each select="epc">
                  <epc>
                    <xsl:value-of select="."/>
                  </epc>
                </xsl:for-each>
                <action>
                  <xsl:value-of select="action"/>
                </action>
              </epcList>
            </ObjectEvent>
          </xsl:for-each-group>
        </EventList>
      </EPCISBody>
    </ns6:EPCISDocument>
  </xsl:template>

Я использую XSLT 2.0. Мой желаемый вывод должен иметь уникальные значения элемента ep c без дубликатов. Мне нужно сравнить все дочерние элементы, чтобы увидеть, являются ли они точными дубликатами

1 Ответ

0 голосов
/ 25 февраля 2020

Если я правильно понимаю, вы можете сделать это довольно легко с помощью ключа xsl: ( см. Здесь ) ...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="epc" match="epc" use="normalize-space()"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="
    ObjectEvent[not(epcList/epc[count(.|key('epc',normalize-space())[1])=1])]|
    epc[not(count(.|key('epc',normalize-space())[1])=1)]"/>

</xsl:stylesheet>

Однако я не уверен, что должно произойти, когда встречается action, отличный от «ADD». (Прямо сейчас action игнорируется.)

...