Необходимо удалить дубликаты элементов на основе 2 условий из XML-вывода с использованием XSLT 1.0 - PullRequest
0 голосов
/ 29 октября 2018

Здесь я рассмотрел несколько ответов и не могу обернуть голову вокруг клавиш и удаления дублирующих элементов. В моем случае использования у меня есть список вложений в случайном порядке. Для вывода мне нужно вывести вложение, только если оно уникально как по имени файла, так и по размеру файла

Вот мой вклад:

 <Attachments NR="1">
    <objID>351890194</objID>
    <ID>351890194</ID>    
    <ShortName />
    <Name />
    <SeqNr>1</SeqNr>
    <AttachmentType />
    <bpo_objid>351802594</bpo_objid>
    <cal_id>351890107</cal_id> 
    <cal_objid>351890196</cal_objid>
    <Description />
    <edi_objid>351803168</edi_objid>
    <EditTimeUTC>2018-10-11 12:32:01.0</EditTimeUTC>
    <ema_objid>351890195</ema_objid>
    <FileName>autoframeworkIncident.txt</FileName>
    <FilePath>/mnt/nfs/attachmentstore/2018/10/11/351890194/</FilePath>
    <FileSizeKB>200</FileSizeKB>
    <IsPartOfDashboard>N</IsPartOfDashboard>
    <rgr_objid />
    <sol_objid />
</Attachments>
<Attachments NR="2">
    <objID>351890176</objID>
    <ID>351890176</ID>
    <ShortName />
    <Name />
    <SeqNr>1</SeqNr>
    <AttachmentType />
    <bpo_objid>351802594</bpo_objid>
    <cal_id>351890107</cal_id>
    <cal_objid>351890178</cal_objid>
    <Description />
    <edi_objid>351803168</edi_objid>
    <EditTimeUTC>2018-10-11 12:30:17.0</EditTimeUTC>
    <ema_objid>351890177</ema_objid>
    <FileName>autoframeworkIncident.txt</FileName>
    <FilePath>/mnt/nfs/attachmentstore/2018/10/11/351890176/</FilePath>
    <FileSizeKB>0</FileSizeKB>
    <IsPartOfDashboard>N</IsPartOfDashboard>
    <rgr_objid />
    <sol_objid />
</Attachments>
<Attachments NR="3">
    <objID>351891151</objID>
    <ID>351891151</ID>
    <ShortName />
    <Name />
    <SeqNr>10</SeqNr>
    <AttachmentType />
    <bpo_objid>351781152</bpo_objid>
    <cal_id>351890107</cal_id>
    <cal_objid>351891153</cal_objid>
    <Description />
    <edi_objid>1000005000</edi_objid>
    <EditTimeUTC>2018-10-11 20:28:20.0</EditTimeUTC> 
    <ema_objid>351891152</ema_objid> 
    <FileName>Test Attachment 1.txt</FileName>
    <FilePath>/mnt/nfs/attachmentstore/2018/10/11/351891151/</FilePath>
    <FileSizeKB>0</FileSizeKB>
    <IsPartOfDashboard>N</IsPartOfDashboard>
    <rgr_objid />
    <sol_objid />
</Attachments>
<Attachments NR="4">
    <objID>351890230</objID>
    <ID>351890230</ID>
    <ShortName />
    <Name /> 
    <SeqNr>10</SeqNr> 
    <AttachmentType /> 
    <bpo_objid>351781152</bpo_objid>
    <cal_id>351890107</cal_id>   
    <cal_objid>351890232</cal_objid>
    <Description />   
    <edi_objid>1000005000</edi_objid>
    <EditTimeUTC>2018-10-11 12:35:20.0</EditTimeUTC> 
    <ema_objid>351890231</ema_objid>
    <FileName>autoframeworkIncident.txt</FileName>
    <FilePath>/mnt/nfs/attachmentstore/2018/10/11/351890230/</FilePath>  
    <FileSizeKB>0</FileSizeKB> 
    <IsPartOfDashboard>N</IsPartOfDashboard>   
    <rgr_objid /> 
    <sol_objid />
</Attachments>
<Attachments NR="5">
    <objID>351890199</objID>
    <ID>351890199</ID>
    <ShortName /> 
    <Name />  
    <SeqNr>10</SeqNr> 
    <AttachmentType />  
    <bpo_objid>351781152</bpo_objid> 
    <cal_id>351890107</cal_id>  
    <cal_objid>351890201</cal_objid>    
    <Description /> 
    <edi_objid>1000005000</edi_objid>
    <EditTimeUTC>2018-10-11 12:33:20.0</EditTimeUTC> 
    <ema_objid>351890200</ema_objid>
    <FileName>autoframeworkIncident.txt</FileName>
    <FilePath>/mnt/nfs/attachmentstore/2018/10/11/351890199/</FilePath>
    <FileSizeKB>0</FileSizeKB>
    <IsPartOfDashboard>N</IsPartOfDashboard>
    <rgr_objid />
    <sol_objid />
</Attachments>

В моем выводе мне нужно удалить элементы с одинаковыми FileName AND FileSizeKB. Я понимаю, что использование ключей и группировка, вероятно, способ сделать это, но мне пока не повезло.

Вот что у меня есть в моем шаблоне XSLT:

<xsl:key name="kAttachmentByFileName" match="//Attachments" use="FileName"/>

 <xsl:for-each select="//Attachments">
    <xsl:copy-of select="//Attachments[generate-id()=generate-id(key('kAttachmentByFileName', .)[1])]"/>
   <vbo:Attachments>
       <vbo:Attachment>
          <cmn:Name xmlns:cmn="xxxxxx">
              <xsl:value-of select="FileName" />
          </cmn:Name>
          <cmn:BinaryObject xmlns:cmn="xxxx">
              <xsl:value-of select="DataBase64" />
          </cmn:BinaryObject>
       </vbo:Attachment>
    </vbo:Attachments>
</xsl:for-each>
...