首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xslt查找重复值并将其替换为唯一值

使用xslt查找重复值并将其替换为唯一值
EN

Stack Overflow用户
提问于 2018-10-09 02:41:44
回答 1查看 368关注 0票数 1

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

代码语言:javascript
复制
<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,依此类推。预期的结果将是:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2018-10-09 02:54:24

一种方法(可能不是最有效的,但很简单)是计算前面具有相同值的元素。您可以使用xsl:number将格式设置为字母。

例如。

XML Input (包装在doc中以使格式正确)

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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>

输出

代码语言:javascript
复制
<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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52708305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档