Разница XML с использованием xquery в marklogic

Я ищу аналогичный алгоритм различия XML в Xquery, который похож на то, что делает xdiff.jar в Java. При передаче 2 XML-документов, которые следуют одной и той же схеме, я ожидаю, что Xquery укажет, какие узлы/элементы были добавлены, а какие узлы/элементы удалены или изменены. Любые изменения в последовательности следует игнорировать. Я бы сказал, что это скорее логическая разница, которую я ожидаю между двумя XML-документами.

Например. Предположим, что XML A является начальной версией XML, а XML B является обновленной версией XML A, я должен быть в состоянии подготовить отчет, в котором я должен быть в состоянии узнать, каковы все новые теги XML, которые были добавлены , какие теги XML были изменены и какие теги XML были удалены.


person Venkat    schedule 05.02.2014    source источник
comment
Пожалуйста, укажите с примерами, какие изменения следует ожидать. Новые элементы? Изменения в названиях элементов? Текстовые узлы? Атрибут (значения)? Комментарии, инструкции по обработке?   -  person Jens Erat    schedule 05.02.2014
comment
Я согласен с Йенсом. Если вы не знакомы с xdiff.jar (также не можете найти его в Интернете), пример того, что возвращает xdiff, может помочь.   -  person grtjn    schedule 05.02.2014
comment
PS: если вам действительно нравится xdiff.jar, вы можете создать службу HTTP на Java, которая раскрывает функциональность xdiff, и вызывать ее с помощью xdmp:http-get или xdmp:http-post. Вы также можете посмотреть MLJAM (developer.marklogic.com/code/mljam), который предоставляет приятная обертка для доступа к Java-коду от MarkLogic.   -  person grtjn    schedule 05.02.2014


Ответы (1)


Для этого конкретного варианта использования вы можете попробовать подход, использующий xdmp:path плюс традиционный LCS diff. Код xdmp:path создаст последовательность уникальных путей, и их сравнение покажет вам, какие пути являются новыми, а какие удалены.

Вот как вы можете сгенерировать входные данные для LCS diff: это возвращает упорядоченную последовательность каждого уникального непозиционного XPath в $input.

for $path in distinct-values(
  for $p in xdmp:path($input/descendant-or-self::*)
  return replace($p, '\[\d+\]', ''))
order by $path
return $path

Сравнение двух из этих последовательностей должно показать вам, какие пути изменились.

Реализация LCS diff в XQuery сложна, потому что обычная реализация LCS использует двумерные массивы, а в XQuery их нет. Вы можете использовать один json:array для имитации двухмерного. См. http://en.wikipedia.org/wiki/Diff и http://en.wikipedia.org/wiki/Longest_common_subsequence_problem, чтобы узнать больше об алгоритме.

person mblakele    schedule 05.02.2014