2016-07-11 3 views
0

파티 블록 내에서 중복을 제거해야하는 샘플 메시지가 있습니다. 당신이 temperatureCode 저장 및 보관 1과 중복 제거 볼 수 있듯이노드 내에서 중복을 제거하고 XSLT에서 전체 XML 구조 복사

샘플 메시지가

<document> 
<body> 
    <party> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909090</gtin> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 

       </row> 
      </attrGroupMany> 
     </pos> 
    </party>  
    <party> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909091</gtin> 
        <attr name="temperatureCode">STORAGE1</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">STORAGE1</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
       </row> 
      </attrGroupMany> 
     </pos> 

    </party> 
</body> 
</document> 

예상 출력은

<document> 
<body> 
    <party> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909090</gtin> 
        <attr name="temperatureCode">STORAGE</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr>       
       </row> 
      </attrGroupMany> 
     </pos> 
    </party>  
    <party> 
     <pos> 
      <attrGroupMany name="temperatureInformation"> 
       <row> 
        <gtin>1000909091</gtin> 
        <attr name="temperatureCode">STORAGE1</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value> 
         <value qual="CC">20</value> 
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
        <attrQualMany name="temperature"> 
         <value qual="FAH">10</value>      
        </attrQualMany> 
       </row> 
       <row> 
        <attr name="temperatureCode">HANDLING</attr> 
       </row> 
      </attrGroupMany> 
     </pos> 

    </party> 
</body> 
</document> 

입니다.

아래의 XSLT를 사용하고 있습니다. 그것은 파티의 첫 번째 노드에서만 중복을 제거하지만 두 번째 노드는 완전히 처리하지 않습니다. 내가 사용 XSLT는

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

<xsl:output indent="yes"/> 

<xsl:template match="/document/body"> 
    <xsl:element name="body"> 

     <xsl:for-each select="party"> 
      <xsl:element name="party"> 

       <xsl:for-each select="pos"> 

        <xsl:element name="pos"> 

         <xsl:if test="attrGroupMany[@name = 'temperatureInformation']"> 
          <xsl:apply-templates select="attrGroupMany[@name = 'temperatureInformation']/row[generate-id() = generate-id(key('group', concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])))]"/> 
         </xsl:if> 
        </xsl:element> 

       </xsl:for-each> 

      </xsl:element> 

     </xsl:for-each> 
    </xsl:element> 
</xsl:template> 

<xsl:key name="group" match="attrGroupMany[@name = 'temperatureInformation']/row" 
    use="concat(attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/> 



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




</xsl:stylesheet> 

내가 코드를 적응 XSLT

+0

XSLT 1.0 또는 2.0 중 하나를 선택하십시오 - 둘 다 선택하십시오. –

답변

1

에 잘못된려고하고 위치를 원하는 것 같다 당신이 https://stackoverflow.com/a/38265314/252228

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

    <xsl:key name="group" match="party/pos/attrGroupMany[@name = 'temperatureInformation']/row" 
     use="concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature'])"/> 

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

    <xsl:template match="attrGroupMany[@name = 'temperatureInformation']"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:apply-templates select="row[generate-id() = generate-id(key('group', concat(generate-id(ancestor::pos), '|', attr[@name = 'temperatureCode'], '|', attrQualMany[@name = 'temperature']))[1])]"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

을 시도 할 수 있습니다에서 알려 주시기 바랍니다 있습니다 위의 스타일 시트가 pos 안에있는 attr[@name = 'temperatureCode']attrQualMany[@name = 'temperature']을 기반으로 첫 번째로 식별 된 "복제본"을 단순히 복사한다는 점에 유의하여 "중복"을 확인할 때 <gtin>1000909090</gtin>을 무시하십시오. 추가 하위 요소 또는 추가 하위 요소가있는 row이 추가로 있으면 결과에 복사되지 않습니다.

+0

대단한 !!! 그것은 효과가 있었다. – Victor