Различия между функциями cts: Element-walk и type-switch

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

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

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


person Aswanikumar    schedule 19.10.2018    source источник


Ответы (2)


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

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

person mholstege    schedule 19.10.2018
comment
будет ли CTS:element-walk читать только один узел за раз или можно ли одновременно читать несколько узлов? @mholstege предположим, что у меня есть несколько дочерних узлов внутри родительского элемента, каждый раз, когда я нахожу все свои необязательные дочерние элементы, мне нужно создать один элемент, заменив все необязательные дочерние элементы и их данные в том же порядке. возможно ли это с cts: element-walk? - person Aswanikumar; 19.10.2018

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

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

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

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

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

Б) Если нет, то не надо.

person DALDEI    schedule 19.10.2018
comment
Спасибо за объяснение. Однако у меня есть некоторые преобразования, которые необходимо достичь. Если я найду совпадение для родительского элемента, мне придется объединить данные нескольких дочерних элементов вместе и объединить их как один элемент внутри родительского элемента. Поскольку CTS:element-walk работает линейно, может ли он одновременно принимать более одного узла? - person Aswanikumar; 19.10.2018