2016-07-08 2 views
0

여러 부모 노드가 포함 된 샘플 XML 메시지가 있습니다. 요구 사항은 두 부모 노드가 같고 자식 노드를 병합하는 것과 같습니다.XSLT 1.0 일치 및 병합

샘플 입력 메시지는 우리가 모든 행에 대해 temperatureCode의 가치, 모든 온도 값을 (있는 경우) CONCAT 할 필요가 중복 된 경우, 그 아이의 temperatureStats 내부의 열을 병합

<document> 
<party> 
    <gtin>1000909090</gtin> 
    <pos> 
     <attrGroupMany name="temperatureInformation"> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE1</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE2</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE3</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE4</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value>      
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE5</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE6</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE7</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE8</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
     </attrGroupMany> 
    </pos> 
</party> 
</document> 

입니다 부모의

예상되는 출력은 동일한 구조입니다. 두 번째 노드가 처음으로 병합 된 것을 볼 수 있습니다.

<document> 
<party> 
    <gtin>1000909090</gtin> 
    <pos> 
     <attrGroupMany name="temperatureInformation"> 
      <row> 
       <attr name="temperatureCode">STORAGE</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value> 
        <value qual="CC">20</value> 
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE1</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE2</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE3</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE4</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrQualMany name="temperature"> 
        <value qual="FAH">10</value>      
       </attrQualMany> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE5</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE6</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
      <row> 
       <attr name="temperatureCode">HANDLING</attr> 
       <attrGroupMany name="temperatureStats"> 
        <row> 
         <attr name="StatsCode">CODE7</attr> 
        </row> 
        <row> 
         <attr name="StatsCode">CODE8</attr> 
        </row> 
       </attrGroupMany> 
      </row> 
     </attrGroupMany> 
    </pos> 
</party> 
</document> 

모든 입력은 매우 유용합니다.

+0

이전 질문과 다른 그룹이 필요합니까? 일부 요소를 병합하고 Muenchian 그룹을 키로 사용하려면 'key ('key-name ', someKeyValueExpression)/attrGroupMany [@name ='temperatureStats ']/row'는 원하는 모든'row' 요소를 제공합니다 병합하십시오. 그룹으로 키를 사용하면 이전 질문에서 대답 한 것 같습니다. –

+0

옵션 노드 를 처리하는 방법과 전체 XML을 출력으로 인쇄하는 방법. 사용할 수있는 복사 명령이 있습니까? 샘플 XSLT를 제공하는 데 도움을 주면 훌륭합니다. – Victor

답변

1

난 당신이 이전 대답 https://stackoverflow.com/a/38240246/252228의 그룹에 대한 해결책을 찾은 것 같아, 당신은 다음 키 기능을 요구하는 그룹의 항목을 처리 할 수 ​​있습니다 : 그러나

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

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

</xsl:stylesheet> 

참고하는 문자열 값을 복용의 전체 접근 방식 요소가 여러 개인 요소가 부서지기 쉬운 경우 공백에 차이가 있으면 값이 다른 것으로 간주 될 수 있습니다.

+0

그 작업. 감사. 이 문제는 내가 해결하려고하는 더 큰 문제의 일부입니다. 이 샘플은 확실하게 도움이 될 것입니다. – Victor

+0

Martin. 다른 질문에 대한 도움이 필요합니다. 도와 주시겠습니까? 감사합니다 http://stackoverflow.com/questions/38993864/match-and-merge-in-xslt-with-optional-nodes – Victor