Удалите повторяющиеся узлы в разных родителях с одним и тем же дочерним значением на основе значения другого дочернего элемента - PullRequest
0 голосов
/ 09 июня 2018

Я изо всех сил пытаюсь сделать это с помощью XSLT:

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

Это мой ВХОД

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<Collection>
<AddedType>
<Type>
    <Name>BBBBBBB</Name>
    <Status>On</Status>
    <Version>2</Version>
    <Iteration>3</Iteration>
</Type>
<Type>
    <Name>AAAAAAA</Name>
    <Status>Off</Status>
    <Version>3</Version>
    <Iteration>0</Iteration>
</Type>
<Type>
    <Name>CCCCCCC</Name>
    <Status>On</Status>
    <Version>0</Version>
    <Iteration>1</Iteration>
</Type>
<Type>
    <Name>BBBBBBB</Name>
    <Status>Off</Status>
    <Version>4</Version>
    <Iteration>0</Iteration>
</Type>
</AddedType>
<ChangedType>
<Type>
    <Name>BBBBBBB</Name>
    <Status>On</Status>
    <Version>7</Version>
    <Iteration>2</Iteration>
</Type>
</ChangedType>
<UnchangedType>
<Type>
    <Name>AAAAAAA</Name>
    <Status>On</Status>
    <Version>2</Version>
    <Iteration>0</Iteration>
</Type>
</UnChangedType>
<DeletedType>
<Type>
    <Name>XXXXXX</Name>
    <Status>On</Status>
    <Version>5</Version>
    <Iteration>1</Iteration>
</Type>
</DeletedType>
</Collection>
</xml>

Желаемый ВЫХОД

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<Collection>
<AddedType>
<Type>
    <Name>CCCCCCC</Name>
    <Status>On</Status>
    <Version>0</Version>
    <Iteration>1</Iteration>
</Type>
</AddedType>
<ChangedType>
<Type>
    <Name>BBBBBBB</Name>
    <Status>On</Status>
    <Version>7</Version>
    <Iteration>2</Iteration>
</Type>
</ChangedType>
<UnchangedType>
<Type>
    <Name>AAAAAAA</Name>
    <Status>On</Status>
    <Version>2</Version>
    <Iteration>0</Iteration>
</Type>
</UnChangedType>
<DeletedType>
<Type>
    <Name>XXXXXX</Name>
    <Status>On</Status>
    <Version>5</Version>
    <Iteration>1</Iteration>
</Type>
</DeletedType>
</Collection>
</xml>

Тип узлы могут быть в AddedType ChangedType UnChangedType DeletedType

Статус может быть только Вкл. или Выкл. с Вкл. > Выкл.

Версия числовая, целое число

Итерация числовая, целое число

Как вы можетесм. в примере выше, мне нужно иметь в OUTPUT только 1 вхождение каждого типа узла с тем же значением Name , и это должен быть узел с более высоким приоритетом на основеСледующее правило:

Полный ключ для выбора того, что оставить, - (Статус). (Версия). (Итерация) example: Off.5.1

Любая помощь будет по достоинству оценена

1 Ответ

0 голосов
/ 09 июня 2018

Я думаю, что вы хотите сгруппировать все эти Type элементы по Name, а затем отсортировать каждую группу по вашим различным ключам / приоритетам сортировки, чтобы вывести первую в порядке убывания по убыванию, обернув его исходным родительским именем:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="Collection">
      <xsl:copy>
          <xsl:for-each-group select="*/Type" group-by="Name">
              <xsl:for-each select="current-group()">
                  <xsl:sort select="Status" order="descending"/>
                  <xsl:sort select="xs:integer(Version)" order="descending"/>
                  <xsl:sort select="xs:integer(Iteration)" order="descending"/>
                  <xsl:if test="position() = 1">
                      <xsl:element name="{name(..)}">
                        <xsl:copy-of select="."/>
                      </xsl:element>
                  </xsl:if>
              </xsl:for-each>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

При https://xsltfiddle.liberty -development.net / pPqsHTk Я получаю результат

<xml>
   <Collection>
      <ChangedType>
         <Type>
            <Name>BBBBBBB</Name>
            <Status>On</Status>
            <Version>7</Version>
            <Iteration>2</Iteration>
         </Type>
      </ChangedType>
      <UnchangedType>
         <Type>
            <Name>AAAAAAA</Name>
            <Status>On</Status>
            <Version>2</Version>
            <Iteration>0</Iteration>
         </Type>
      </UnchangedType>
      <AddedType>
         <Type>
            <Name>CCCCCCC</Name>
            <Status>On</Status>
            <Version>0</Version>
            <Iteration>1</Iteration>
         </Type>
      </AddedType>
      <DeletedType>
         <Type>
            <Name>XXXXXX</Name>
            <Status>On</Status>
            <Version>5</Version>
            <Iteration>1</Iteration>
         </Type>
      </DeletedType>
   </Collection>
</xml>

, который, кажется, содержит элементы, которые вы представляете в желаемом выводе, не имеяпорядок, который вы показали там.Я не уверен, что определяет этот порядок, поэтому вам нужно будет это объяснить, если код необходимо скорректировать, и вы не можете сделать это самостоятельно.

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