Различия между функциями cts: обход элементов и переключение типов - PullRequest
0 голосов
/ 19 октября 2018

Может ли кто-нибудь дать лучшее объяснение между функциями cts:element-walk и typeswitch?

Я пытался следовать API разработчика.Однако я не очень доволен примерами для cts:element-walk.Буду очень признателен, если кто-нибудь поможет мне понять плюсы и минусы.

Какой из них эффективен для реализации рекурсивных вызовов и преобразований данных с каждым рекурсивным вызовом?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

cts:element-walk - это простое преобразование «сверху вниз» за один проход.Аналогично скажем java stream().map() Он может выполнять основной поиск / замену на основе имен и значений элементов.cts: xxx - это API-интерфейсы, специфичные для MarkLogic.

typeswitch встроен в язык XQuery и представляет собой выражение , которое оценивает один элемент (не обязательно узел илиelement) аналогичен выражению java 'switch'.

Вы используете их совсем по-другому, например, вам не нужно использовать рекурсивный алгоритм для базовых cts:element-walk s, с другой стороны, переключатель типа может различатьмежду не только именами элементов и элементов, но и типизированными значениями (не типами элементов), пользовательскими типами и типами схем.Но на самом деле он ничего не «делает», поэтому его необходимо использовать в более широком контексте (обычно это рекурсивная функция xquery).

В связи с этим количество предоставленного пользователем (и, следовательно, интерпретируемого) кода, необходимого для выполнения аналогичногодействия для переключения типов намного больше, поэтому, скорее всего, будут медленнее.Однако cts:element-walk может использоваться во многих случаях с переключателем типа:

A) Если вы можете легко сделать это с помощью cts:element-walk - сделайте это

B) Если нет, не делайте этого.

0 голосов
/ 19 октября 2018

Если все, что вам нужно сделать, это пройтись по дереву XML и сделать что-то для определенных элементов, cts:element-walk будет более эффективным, поскольку он оптимизирован на уровне C ++.

Если вы хотитевыполняя сложное преобразование, включающее множество различных элементов, выполняющих много разных вещей, вы все равно можете кодировать это в cts:element-walk, но вы, скорее всего, потеряете большую часть выигрыша в эффективности, и ваш код, вероятно, будет сложным для понимания.

...