2016-07-06 6 views
1

Я хочу написать XSLT, в котором я могу удалить дубликат узла при переводе. В приведенном ниже сообщении, поскольку температурный код тот же для 1 и 3 узла, он для меня дублируется.Удалить дубликат узла в XSLT

Образец входного сообщения, которые я использую

<document> 
    <party> 
     <gtin>1000909090</gtin> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <attr name="temperatureCode">STORADE</attr> 
        <attrQual name="maximumTemperature" qual="FAH">80</attrQual> 
        <attrQual name="minimumTemperature" qual="ABC">10</attrQual> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQual name="maximumTemperature" qual="XYZ">20</attrQual> 
        <attrQual name="minimumTemperature" qual="PQR">30</attrQual> 
       </row> 
       <row> 
        <attr name="temperatureCode">STORADE</attr> 
        <attrQual name="maximumTemperature" qual="FAH">80</attrQual> 
        <attrQual name="minimumTemperature" qual="ABC">10</attrQual> 
       </row> 
      </attrGroupMany> 
     </pos> 
    </party> 
    </document> 

Я использую Ниже XSLT для преобразования сообщения образца

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="yes"/> 


    <xsl:template match="document"> 
     <CatalogItem> 
      <RelationshipData> 
       <Relationship> 
        <RelationType>temperatureInformation_details</RelationType> 
        <RelatedItems>  
         <xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row">       
          <RelatedItem> 
           <xsl:attribute name="referenceKey"> 
            <xsl:value-of select="concat('temperatureInformation_details','-',attr[@name='temperatureCode'],'-',attrQual/@name,'-',attrQual/@qual,'-',attrQual )"/> 
           </xsl:attribute> 
          </RelatedItem> 
         </xsl:for-each> 

        </RelatedItems> 
       </Relationship> 
      </RelationshipData> 
     </CatalogItem> 

    </xsl:template> 

    </xsl:stylesheet> 

Но выходной ток является неправильным, то дублированное значение STORADE

<?xml version="1.0" encoding="UTF-8"?> 
    <CatalogItem> 
    <RelationshipData> 
     <Relationship> 
     <RelationType>temperatureInformation_details</RelationType> 
     <RelatedItems> 
      <RelatedItem referenceKey="temperatureInformation_details-STORADE-maximumTemperature-FAH-80" /> 
      <RelatedItem referenceKey="temperatureInformation_details-HANDLING-maximumTemperature-XYZ-20" /> 
      <RelatedItem referenceKey="temperatureInformation_details-STORADE-maximumTemperature-FAH-80" /> 
     </RelatedItems> 
</Relationship> 
    </RelationshipData> 
    </CatalogItem> 

Правильный выход должен быть таким, как указано ниже, при котором повторяющаяся температура удаляемый код удаляется.

 <?xml version="1.0" encoding="UTF-8"?> 
    <CatalogItem> 
    <RelationshipData> 
     <Relationship> 
     <RelationType>temperatureInformation_details</RelationType> 
     <RelatedItems> 
      <RelatedItem referenceKey="temperatureInformation_details-STORADE-maximumTemperature-FAH-80" /> 
      <RelatedItem referenceKey="temperatureInformation_details-HANDLING-maximumTemperature-XYZ-20" /> 

     </RelatedItems> 
     </Relationship> 
    </RelationshipData> 
    </CatalogItem> 

Все входы будут очень полезны

+0

Начните здесь: http://www.jenitennison.com/xslt/grouping/muenchian.html Затем найдите некоторые из многочисленных примеров группировки Muenchian здесь на SO. –

ответ

1

Использование Muenchian группировки для выявления дубликатов, ключ может быть

<xsl:key name="group" match="row" use="concat(attr[@name = 'temperatureCode'], '-', attrQual[@qual = 'FAH'])"/> 

затем изменить

    <xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row">       

в

    <xsl:for-each select="party/pos/attrGroupMany[@name ='temperatureInformation']/row[generate-id() = generate-id(key('group', concat(attr[@name = 'temperatureCode'], '-', attrQual[@qual = 'FAH']))[1])]">