2014-12-05 4 views
0

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

Состояние 1: В каждом узле политики в рамках policyKey узла я должен проверить policyNbr и PolicyFormCode/код и policyEffectiveDt и policyID одинаковы во всех узлах политики, если они такие же, у меня есть сохранить только узел политики, которая имеет sourceSystemCd/code = 'SCBP'.

Условие 2: Если в вышеуказанном условии policyNbr и PolicyFormCode/code и policyEffectiveDt и policyID у любого из них есть значения differnt, мне нужно отобразить весь политический узел.

Конфликт 3: В политике 1 и политике 2 политикиNbr и policyFormCd должны быть одинаковыми, тогда мы должны отключить политику с помощью policyId в ней. Если не равны, то отобразите оба. Это возможно ? Все условия должны работать в одном xsl.

Условие 1: Входной XML:

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

Ожидаемый результат для conndition 3:

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

Условие 1 и Условие 2 работает нормально для belwo XSLT. необходимо включить условие 3 в одно и то же xsl.

+0

В вашем примере выше, вторая и политики имеют разные значения «policyEffectiveDt». Это верно? Благодаря! –

+0

Привет, Тим, я исправил его. сейчас такая же политикаEffectiveDate. –

+0

Привет, Тим, спасибо большое. Его работа прекрасна, но у меня есть еще одно условие, чтобы быть удовлетворенным. Можете ли вы помочь мне в этом. Условие 3 –

ответ

0

Вы можете использовать ключ для группировки дубликатов. Это будет сцепленный ключ, чтобы включить все поля

<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']" /> 

Тест 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: ключ для условия 3 его работы.

Смежные вопросы