Найдите повторяющиеся значения и замените их уникальными значениями, используя xslt - PullRequest
0 голосов
/ 08 октября 2018

Это мой исходный XML: Как я могу проверить Элемент-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, третье значение - 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 голосов
/ 08 октября 2018

Один из способов (возможно, не самый эффективный, но простой) - подсчитать предыдущие элементы с одинаковым значением.Вы можете использовать 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 -развитие.net / 94hvTzU

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...