XSLT根据元素值删除重复的节点

时间:2014-11-06 20:46:30

标签: xslt

我是XSLT的新手。你帮我xslt实现以下输出。在我的输入xml有重复的节点,我必须删除基于元素(CustAccId)值不应重新泥炭。

Inputxml:

        <Main>
 <Request>
    <TypeInd>I</TypeInd> 
    <CustAcctID>505665599</CustAcctID> 
     <ServiceOrderID>1452653</ServiceOrderID> 
  </Request>
  <Request>
  <TypeInd>O</TypeInd> 
  <CustAcctID>2011395</CustAcctID> 
   <ServiceOrderID>1452652</ServiceOrderID> 
       </Request>
     <Request>
    <TypeInd>I</TypeInd> 
   <CustAcctID>505665599</CustAcctID> 
    <ServiceOrderID>1452653</ServiceOrderID> 
       </Request>
       </Main> 

输出XML:

 <Main>
      <Request>
         <TypeInd>I</TypeInd> 
         <CustAcctID>505665599</CustAcctID> 
        <ServiceOrderID>1452653</ServiceOrderID> 
   </Request>
 <Request>
       <TypeInd>O</TypeInd> 
       <CustAcctID>2011395</CustAcctID> 
         <ServiceOrderID>1452652</ServiceOrderID> 
  </Request>

Here is XSLt i tried but didn't work like it retrun duplicate request node

   <?xml version="1.0" encoding="UTF-8"?>
       <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <xsl:template match="@*|node()">
     <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
     </xsl:template>
     <xsl:template match="/">
     <xsl:if test="not(following::Request[CustAcctID=current()])">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
    </xsl:if>
 </xsl:template>
 </xsl:stylesheet>

1 个答案:

答案 0 :(得分:4)

您可以使用以下XSLT删除副本:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
     <xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="Request[CustAcctID = following::Request/CustAcctID]"/>  
</xsl:stylesheet>

输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<Main>
  <Request>
    <TypeInd>O</TypeInd> 
    <CustAcctID>2011395</CustAcctID> 
    <ServiceOrderID>1452652</ServiceOrderID> 
  </Request>
  <Request>
    <TypeInd>I</TypeInd> 
    <CustAcctID>505665599</CustAcctID> 
    <ServiceOrderID>1452653</ServiceOrderID> 
  </Request>
</Main>

匹配Request匹配以下CustAcctID的{​​{1}}的所有CustAcctID个节点的模板不会为匹配的Request生成任何输出,因此副本不会被写入。

更新以获取michael.hor257k评论中的建议:另一种方法是使用Muenchian分组:

Request

生成相同的输出XML,但效率更高,正如您在Jeni Tennison http://www.jenitennison.com/xslt/grouping/muenchian.xml的文章中详细描述的那样,michael.hor257k已经建议。

作为XSLT分组的附加参考,您可以查看http://www.dpawson.co.uk/xsl/sect2/N4486.html