如何删除多个标签

时间:2015-03-16 05:48:35

标签: xml xslt xslt-1.0

我有一个xml,它可能产生也可能不产生多个系统号。如果系统号和外部ID相同,它应该只保留一个值。

输入:

<?xml version = '1.0' encoding = 'UTF-8'?>
<ns0:updatePersonCrossReference_Input xmlns:ns0="http://xmlns.oracle.com/apps/mdm/customer">
   <xsdLocal3:ListOfSwiPersonPublishIO xmlns:xsdLocal3="http://www.siebel.com/xml/SwiPersonPublishIO">
      <xsdLocal3:Contact>
         <xsdLocal3:IntegrationId>0100004568</xsdLocal3:IntegrationId>
         <xsdLocal3:ListOfCIFContactReference>
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>GCIS</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>GCIS</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>1016</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>GCIS</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>GCIS</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>1016</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>HOG</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>HOG</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>2002</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>HOG</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>HOG</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>2002</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>OCR</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>OCR</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>3003</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>OCR</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>OCR</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>3003</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>
         </xsdLocal3:ListOfCIFContactReference>
      </xsdLocal3:Contact>
   </xsdLocal3:ListOfSwiPersonPublishIO>
</ns0:updatePersonCrossReference_Input>
输出应该是:

<?xml version = '1.0' encoding = 'UTF-8'?>
<ns0:updatePersonCrossReference_Input xmlns:ns0="http://xmlns.oracle.com/apps/mdm/customer">
   <xsdLocal3:ListOfSwiPersonPublishIO xmlns:xsdLocal3="http://www.siebel.com/xml/SwiPersonPublishIO">
      <xsdLocal3:Contact>
         <xsdLocal3:IntegrationId>0100004568</xsdLocal3:IntegrationId>
         <xsdLocal3:ListOfCIFContactReference>
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>GCIS</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>GCIS</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>1016</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>            
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>HOG</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>HOG</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>2002</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>            
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>OCR</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>OCR</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>3003</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>            
         </xsdLocal3:ListOfCIFContactReference>
      </xsdLocal3:Contact>
   </xsdLocal3:ListOfSwiPersonPublishIO>
</ns0:updatePersonCrossReference_Input>

如果输入为:

<?xml version = '1.0' encoding = 'UTF-8'?>
<ns0:updatePersonCrossReference_Input xmlns:ns0="http://xmlns.oracle.com/apps/mdm/customer">
   <xsdLocal3:ListOfSwiPersonPublishIO xmlns:xsdLocal3="http://www.siebel.com/xml/SwiPersonPublishIO">
      <xsdLocal3:Contact>
         <xsdLocal3:IntegrationId>0100004568</xsdLocal3:IntegrationId>
         <xsdLocal3:ListOfCIFContactReference>
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>GCIS</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>GCIS</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>1016</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>            
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>HOG</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>HOG</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>2002</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>            
            <xsdLocal3:CIFContactReference>
               <xsdLocal3:SystemNumber>OCR</xsdLocal3:SystemNumber>
               <xsdLocal3:SystemName>OCR</xsdLocal3:SystemName>
               <xsdLocal3:ExternalId>3003</xsdLocal3:ExternalId>
            </xsdLocal3:CIFContactReference>            
         </xsdLocal3:ListOfCIFContactReference>
      </xsdLocal3:Contact>
   </xsdLocal3:ListOfSwiPersonPublishIO>
</ns0:updatePersonCrossReference_Input>

然后输出应显示相同的内容。

任何投入都表示赞赏。我正在使用XSL 1.0。

谢谢, M S

1 个答案:

答案 0 :(得分:0)

Muenchian分组,即

(只是在没有语法检查的情况下输入,但应该像这样。)

  1. 为CIFContactReference创建一个复合索引,某事。像
  2. (我曾经添加一个外来字符,比如说'_',用于分隔键,当没有。和id是可变长度时,合并可能会重复。)

    1. 然后在xsdLocal3中进行for-each清理:ListOfCIFContactReference,
    2. 检查具有相同密钥的第一个节点(即密钥('ref',$ keyValue)[1])是否具有与实际密钥相同的id(然后这是列表中的第一个)。

                

      在大多数情况下,这比后续兄弟:: xsdLocal3:CIFContactReference [...])检查要快得多;但是,如果您的列表仅由1-2个元素组成,则以下兄弟可能会更快一些。