Как обнаружить дубликаты подузлов с несколькими узлами с помощью XQuery - PullRequest
0 голосов
/ 09 ноября 2018

Как найти дубликаты подузлов с помощью XQuery и / или XPath, моя структура XML выглядит следующим образом:

<register>
  <operator referenceid="1">
    <operationpart>
      <type>Category_code</type>
      <name>101010</name>
    </operationpart>
    <operationpart>
      <type>Category_text</type>
          <name>Accounting</name>
    </operationpart>
    <operationpart>
      <type>Big_code</type>
      <name>1</name>
    </operationpart>
  </operator>
  <operator referenceid="2">
    <operationpart>
      <type>Category_code</type>
      <name>202020</name>
    </operationpart>
    <operationpart>
      <type>Category_text</type>
      <name>Development</name>
    </operationpart>
    <operationpart>
      <type>Big_code</type>
      <name>2</name>
    </operationpart>
  </operator>
  <operator referenceid="3">
    <operationpart>
      <type>Category_code</type>
      <name>101010</name>
    </operationpart>
    <operationpart>
      <type>Category_text</type>
      <name>Accounting</name>
    </operationpart>
    <operationpart>
      <type>Big_code</type>
      <name>1</name>
    </operationpart>
  </operator>
  <operator referenceid="4">
    <operationpart>
      <type>Category_code</type>
      <name>101010</name>
    </operationpart>
    <operationpart>
      <type>Category_text</type>
      <name>Accounting</name>
    </operationpart>
  </operator>
  <operator referenceid="5">
    <operationpart>
      <type>Category_code</type>
      <name>101010</name>
    </operationpart>
    <operationpart>
      <type>Category_text</type>
      <name>Accounting</name>
    </operationpart>
  </operator>
</register>

Два результата должны быть перечислены в результате как дубликаты, то есть 4 и 5, а также 1и 3.

XQuery / Xpath также должен игнорировать атрибут referenceid, который всегда должен быть уникальным в XML-списке.

1 Ответ

0 голосов
/ 09 ноября 2018

Вроде сложно поместить это в список;как насчет отображения дублирующих узлов:

/register/*
   [normalize-space(.) = preceding-sibling::*/normalize-space(.)
  and
    not(normalize-space(.) = following-sibling::*/normalize-space(.))
   ]

Demo , который возвращает узел с referenceid 3 и 5.

или наоборот, чтобы вернуть 1 и4:

/register/*
   [normalize-space(.) = following-sibling::*/normalize-space(.)
  and
    not(normalize-space(.) = preceding-sibling::*/normalize-space(.))
   ]

При необходимости вы можете объединить оба с оператором |.
Это ваше дело.Очевидно, этот случай может быть дополнительно упрощен.

...