查找重复值,并使用xslt将它们替换为唯一值

时间:2018-10-08 18:41:44

标签: xml xslt

这是我的源xml:如何检查Element-4的重复值并替换重复值以使其唯一?

<Segment-PO> 
     <Element-3>IN</Element-3>
     <Element-4>1234</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00378</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>4321</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00378</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00666</Element-4> 
     <Element-5>BB</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>5678</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>8765</Element-4> 
     <Element-5>AA</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00666</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00666</Element-4> 
     <Element-5>BB</Element-5>          
</Segment-PO>

如何找到重复的值?在上面的xsl中,它将是00378和00666。 保留第一个值,然后将第二个值替换为唯一值,例如00378A,将第三个vlue替换为00378B,依此类推。 预期结果将是:

<Segment-PO> 
     <Element-3>IN</Element-3>
     <Element-4>1234</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00378</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>4321</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00378A</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00666</Element-4> 
     <Element-5>BB</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>5678</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>8765</Element-4> 
     <Element-5>AA</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00666A</Element-4> 
     <Element-5>ZZ</Element-5>          
</Segment-PO>
<Segment-PO> 
     <Element-3>IN</Element-3> 
     <Element-4>00666B</Element-4> 
     <Element-5>BB</Element-5>          
</Segment-PO>

1 个答案:

答案 0 :(得分:1)

一种方法(可能不是最有效的,但很容易)是对具有相同值的前面的元素进行计数。您可以使用xsl:number来设置字母格式。

示例...

XML输入(用doc包装以使其格式正确)

<doc>
    <Segment-PO> 
        <Element-3>IN</Element-3>
        <Element-4>1234</Element-4> 
        <Element-5>ZZ</Element-5>          
    </Segment-PO>
    <Segment-PO> 
        <Element-3>IN</Element-3> 
        <Element-4>00378</Element-4> 
        <Element-5>ZZ</Element-5>          
    </Segment-PO>
    <Segment-PO> 
        <Element-3>IN</Element-3> 
        <Element-4>4321</Element-4> 
        <Element-5>ZZ</Element-5>          
    </Segment-PO>
    <Segment-PO> 
        <Element-3>IN</Element-3> 
        <Element-4>00378</Element-4> 
        <Element-5>ZZ</Element-5>          
    </Segment-PO>
    <Segment-PO> 
        <Element-3>IN</Element-3> 
        <Element-4>00666</Element-4> 
        <Element-5>BB</Element-5>          
    </Segment-PO>
    <Segment-PO> 
        <Element-3>IN</Element-3> 
        <Element-4>5678</Element-4> 
        <Element-5>ZZ</Element-5>          
    </Segment-PO>
    <Segment-PO> 
        <Element-3>IN</Element-3> 
        <Element-4>8765</Element-4> 
        <Element-5>AA</Element-5>          
    </Segment-PO>
    <Segment-PO> 
        <Element-3>IN</Element-3> 
        <Element-4>00666</Element-4> 
        <Element-5>ZZ</Element-5>          
    </Segment-PO>
    <Segment-PO> 
        <Element-3>IN</Element-3> 
        <Element-4>00666</Element-4> 
        <Element-5>BB</Element-5>          
    </Segment-PO>
</doc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="Element-4">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
      <xsl:if test="preceding::Element-4[.=current()]">
        <xsl:number value="count(preceding::Element-4[.=current()])" format="A"/>
      </xsl:if>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

输出

<doc>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>1234</Element-4>
      <Element-5>ZZ</Element-5>
   </Segment-PO>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>00378</Element-4>
      <Element-5>ZZ</Element-5>
   </Segment-PO>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>4321</Element-4>
      <Element-5>ZZ</Element-5>
   </Segment-PO>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>00378A</Element-4>
      <Element-5>ZZ</Element-5>
   </Segment-PO>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>00666</Element-4>
      <Element-5>BB</Element-5>
   </Segment-PO>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>5678</Element-4>
      <Element-5>ZZ</Element-5>
   </Segment-PO>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>8765</Element-4>
      <Element-5>AA</Element-5>
   </Segment-PO>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>00666A</Element-4>
      <Element-5>ZZ</Element-5>
   </Segment-PO>
   <Segment-PO>
      <Element-3>IN</Element-3>
      <Element-4>00666B</Element-4>
      <Element-5>BB</Element-5>
   </Segment-PO>
</doc>

正在工作的小提琴:http://xsltfiddle.liberty-development.net/94hvTzU

相关问题