Генерация узла XSLT на основе уникального значения - PullRequest
0 голосов
/ 16 января 2020

Имеет следующий ввод

<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>1</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>2</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>1</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>2</type>
</item>

Теперь хотел бы иметь следующий вывод

<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>1</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>2</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a9</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>1</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <list>
        <name>b</name>
        <vaue>b5</vaue>
    </list>
    <list>
        <name>c</name>
        <vaue>c9</vaue>
    </list>
    <list>
        <name>d</name>
        <vaue>d66</vaue>
    </list>
    <type>2</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a1</vaue>
    </list>
    <type>3</type>
</item>
<item>
    <list>
        <name>a</name>
        <vaue>a9</vaue>
    </list>
    <type>3</type>
</item>

Для каждого элемента, имеющего тип 1, хотел бы создать новый элемент, если есть если список содержит имя, которое является "а". Однако хотелось бы избежать дубликатов. Достигнуть этого результата можно уже с помощью двухэтапного процесса ... сначала для создания элементов с дубликатами, а затем для сопоставления отдельных ключей для удаления дубликатов.

Есть ли способ, которым мы можем достичь этого за один шаг вместо создавать дубликаты, а затем фильтровать дубликаты

1 Ответ

1 голос
/ 16 января 2020

Это просто проблема группировки. Эта таблица стилей:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:key name="item-by-vaue" match="item[type=1]" use="list[name='a']/vaue"/>

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

  <xsl:template match="root">
      <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
      <xsl:for-each 
        select="item[type=1]
                    [count(.|key('item-by-vaue',list[name='a']/vaue)[1])=1]">
        <item>
          <xsl:apply-templates select="list[name='a']"/>
          <type>3</type>
        </item>
      </xsl:for-each>
      </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Используя ваш входной пример, он выводит:

<root>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <list>
         <name>b</name>
         <vaue>b5</vaue>
      </list>
      <list>
         <name>c</name>
         <vaue>c9</vaue>
      </list>
      <list>
         <name>d</name>
         <vaue>d66</vaue>
      </list>
      <type>1</type>
   </item>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <list>
         <name>b</name>
         <vaue>b5</vaue>
      </list>
      <list>
         <name>c</name>
         <vaue>c9</vaue>
      </list>
      <list>
         <name>d</name>
         <vaue>d66</vaue>
      </list>
      <type>2</type>
   </item>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <list>
         <name>b</name>
         <vaue>b5</vaue>
      </list>
      <list>
         <name>c</name>
         <vaue>c9</vaue>
      </list>
      <list>
         <name>d</name>
         <vaue>d66</vaue>
      </list>
      <type>1</type>
   </item>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <list>
         <name>b</name>
         <vaue>b5</vaue>
      </list>
      <list>
         <name>c</name>
         <vaue>c9</vaue>
      </list>
      <list>
         <name>d</name>
         <vaue>d66</vaue>
      </list>
      <type>2</type>
   </item>
   <item>
      <list>
         <name>a</name>
         <vaue>a1</vaue>
      </list>
      <type>3</type>
   </item>
</root>

Примечание: ваш входной образец не соответствует ожидаемому результату по правилам Вы заявили: нет элемента vaue со строковым значением 'a9'.

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