2014-12-03 150 views
0

嗨,要刪除XML重複的節點如何使用XSLT 1.0

請幫我從xml.Condition移除重複的節點,除去重複的節點是相當複雜的。

條件1:在根據policyKey節點的每個政策節點i必須檢查policyNbr和PolicyFormCode /代碼和policyEffectiveDt和策略ID 是在所有的策略節點相同的,如果它們是相同的,我有隻保留具有sourceSystemCd策略節點/代碼='SCBP'出現在它中。

條件2:如果在上述條件policyNbr和PolicyFormCode/code和policyEffectiveDt和policyID中有任何不同的值,我需要顯示所有的策略節點。

輸入XML: 條件1:

<?xml version="1.0" encoding="utf-8"?> 
<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> 
    <!-- second --> 
    <policy> 
     <policyKey> 
      <policyNbr>1234</policyNbr> 
      <policyID>115774001</policyID> 
      <policyEffectiveDt>2014-11-11</policyEffectiveDt> 
      <policyFormCd> 
       <code>660</code> 
      </policyFormCd> 
     </policyKey> 
     <transactionSplitTrans> 
      <sourceSystemCd> 
       <code>ARAR</code> 
      </sourceSystemCd> 
     </transactionSplitTrans> 
    </policy> 
    <!-- third --> 
    <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> 

Expexted輸出:

<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> 
<!-- third --> 
<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> 

條件2:顯示所有三個policyNodes

+0

所以,如果有沒有重複,你要保持一個沒有政策ID? – Mike 2014-12-03 05:43:13

+0

您是否熟悉[Muenchian分組](http://www.jenitennison.com/xslt/grouping/muenchian.html)? – 2014-12-03 06:52:55

回答

1
<xsl:template match="/policies/policy"> 
<xsl:choose> 
    <xsl:when test="./policyKey/policyID"> 
     <xsl:copy-of select='.'/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:variable name='currNumber' select="number(policyKey/policyNbr)"/> 
     <xsl:variable name="currCode" select="policyKey/policyFormCd/code"/> 
     <xsl:if test="count(../policy/policyKey[number(policyNbr)=$currNumber and policyFormCd/code=$currCode and policyID]) = 0"> 
      <xsl:copy-of select='.'/> 
     </xsl:if> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:template> 

這應該工作。如果政策有一個ID,然後複製它。如果沒有,並且沒有與ID相匹配的一個,那麼也複製它。 (可能會更短,但這應該足夠清楚)。測試。

+0

添加了對策略代碼的檢查。數字與數字(policyNbr)進行比較以處理不同的格式。 – Mike 2014-12-03 07:56:47

+0

更改示例以包含代碼檢查。 – Mike 2014-12-03 08:02:28

+0

上面的代碼中我們有「number(something)」的地方,替換爲:「substring(concat('0000000000000000',something),string-length(something)+1,16)」。這使用前導零填充到16個字節,然後取最右邊的16個字符。 如果某些十六進制值是大寫和小寫(例如7E707和7e707),則必須將其包含在transform()語句中。 Yuck,但這是你的XSL。 – Mike 2014-12-03 10:25:22

0

請替換上面的XSLT以下部分,並嘗試...

<xsl:variable name='currNumber' select="translate(policyKey/policyNbr,'0*','')"/> 


<xsl:if test="count(../policy/policyKey[translate(policyNbr,'0*','')=$currNumber and policyFormCd/code=$currCode and policyID]) = 0"> 
+0

xslt沒有正則表達式,所以你不能指定* leading *零。上面的翻譯將用零值替換全零。 – Mike 2014-12-04 07:20:01