2014-12-05 2 views
0

중복 노드를 제거하려면 xml에서 중복 노드를 제거하는 데 도움을주십시오. 중복 노드를 제거하는 것은 상당히 복잡합니다.조건에 따라 중복 노드를 제거하는 방법

조건 1 : policyKey 노드 아래의 각 정책 노드에서 정책 노드와 PolicyFormCode/code 및 policyEffectiveDt를 확인해야하고 policyID 이 동일한 경우 모든 정책 노드에서 동일합니다. sourceSystemCd/code = 'SCBP'가 있습니다.

조건 2 : 위의 조건 인 경우 policyNbr 및 PolicyFormCode/code 및 policyEffectiveDt 및 policyID에 모두 differnt 값이 있으면 모든 정책 노드를 표시해야합니다.

조건 1 : 정책 1과 정책 2에서 policyNbr과 policyFormCd가 같아야합니다. 그러면 policyId가있는 정책을 disaply해야합니다. 같지 않으면 둘 다 표시하십시오. 이것이 가능한가 ? 모든 조건은 단일 xsl에서 작동해야합니다.

조건 1 : 입력 XML : conndition 3

<policies> 
    <!-- policy 1--> 
    <policy> 
     <policyKey> 
      <policyNbr>4567</policyNbr> 
      <policyEffectiveDt>2014-11-14</policyEffectiveDt> 
      <policyFormCd> 
       <code>669</code> 
      </policyFormCd> 
     </policyKey> 
     <transactionSplitTrans> 
      <sourceSystemCd> 
       <code>ARA</code> 
      </sourceSystemCd> 
     </transactionSplitTrans> 
    </policy> 
    <!-- policy 2--> 
     <policy> 
     <policyKey> 
      <policyNbr>4567</policyNbr> 
      <policyEffectiveDt>2014-11-14</policyEffectiveDt> 
      <policyID>54545</policyID> 
      <policyFormCd> 
       <code>669</code> 
      </policyFormCd> 
     </policyKey> 
     <transactionSplitTrans> 
      <sourceSystemCd> 
       <code>SCBP</code> 
      </sourceSystemCd> 
     </transactionSplitTrans> 
    </policy> 
    <!-- third --> 
    <policy> 
     <policyKey> 
      <policyNbr>1234</policyNbr> 
      <policyID>115774001</policyID> 
      <policyEffectiveDt>2014-11-14</policyEffectiveDt> 
      <policyFormCd> 
       <code>660</code> 
      </policyFormCd> 
     </policyKey> 
     <transactionSplitTrans> 
      <sourceSystemCd> 
       <code>ARAR</code> 
      </sourceSystemCd> 
     </transactionSplitTrans> 
    </policy> 
    <!-- fourth --> 
    <policy> 
     <policyKey> 
      <policyEffectiveDt>2014-11-14</policyEffectiveDt> 
      <policyFormCd> 
       <code>660</code> 
      </policyFormCd> 
      <policyID>115774001</policyID> 
      <policyNbr>1234</policyNbr> 
     </policyKey> 
     <transactionSplitTrans> 
      <sourceSystemCd> 
       <code>SCBP</code> 
      </sourceSystemCd> 
     </transactionSplitTrans> 
    </policy> 
</policies> 

예상 출력 :

<policies> 
<!-- policy 2--> 
    <policy> 
    <policyKey> 
     <policyNbr>4567</policyNbr> 
     <policyEffectiveDt>2014-11-14</policyEffectiveDt> 
     <policyID>54545</policyID> 
     <policyFormCd> 
      <code>669</code> 
     </policyFormCd> 
    </policyKey> 
    <transactionSplitTrans> 
     <sourceSystemCd> 
      <code>SCBP</code> 
     </sourceSystemCd> 
    </transactionSplitTrans> 
</policy> 
</policies> 

조건 belwo XSLT에 대한 제대로 작동 1과 조건 2. 동일한 xsl에 조건 3을 포함해야합니다.

+0

을보십시오 : 그것은 연결된 키를

<xsl:key name="policy" match="policy" use="concat(policyKey/policyNbr, '|', policyKey/policyEffectiveDt, '|', policyKey/policyFormCd/code, '|', policyKey/policyID)" /> 

그런 다음 모든 필드를 포함하는 것입니다, 당신과 같이 템플릿을 무시하는 템플릿을 가질 수 두 번째 및 정책은 서로 다른 "policyEffectiveDt"값을 갖습니다. 이 올바른지? 감사! –

+0

안녕하세요, Tim, 문제를 해결했습니다. 이제는 동일한 policyEffectiveDate입니다. –

+0

안녕하세요, Tim, 고맙습니다. 잘 작동하지만, 만족할만한 조건이 하나 더 있습니다. 제발 저를 도울 수 있어요. 조건 3 –

답변

0

키를 사용하여 복제본을 "그룹화"할 수 있습니다.

<xsl:template match="policy[count(
     key('policy', concat(policyKey/policyNbr, '|', 
          policyKey/policyEffectiveDt, '|', 
          policyKey/policyFormCd/code, '|', 
          policyKey/policyID))) > 1 
     and transactionSplitTrans/sourceSystemCd/code != 'SCBP']" /> 

당신의 예에서이 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key 
     name="policy" 
     match="policy" 
     use="concat(policyKey/policyNbr, '|', 
        policyKey/policyEffectiveDt, '|', 
        policyKey/policyFormCd/code, '|', 
        policyKey/policyID)" /> 

    <xsl:template match="policy[count(key('policy', concat(policyKey/policyNbr, '|', policyKey/policyEffectiveDt, '|', policyKey/policyFormCd/code, '|', policyKey/policyID))) > 1 and transactionSplitTrans/sourceSystemCd/code != 'SCBP']" /> 

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

안녕하세요, xsl : key를 조건 3에 추가했습니다.

관련 문제