2016-02-19 1 views
0

Я пытаюсь подсчитать появление структуры XML в BaseX.Понимание for-loop в XQuery для подсчета вхождения в BaseX

declare variable $a := 0; 
for $node in db:open("My_DB")/my/xml//path 
$a += 1 

return $a 

При запуске этого BaseX возвращает ошибку: Неполное выражение FLWOR: ожидается «возврат».

Я знаю, что я могу рассчитывать с этой простой функции:

count(db:open("My_DB")/my/xml//path) 

Но есть две причины ZHY я пытаюсь сделать это с цикл:

  1. Я рассказанной мой руководитель, что цикл цикла быстрее
  2. В будущем я могу выполнить больше операций за каждый удар (в цикле for)

Итак, вопрос: как я могу подсчитывать элементы в цикле for с помощью XQuery с помощью BaseX.

+0

Возможный дубликат [Обновление счетчика в XQuery] (http://stackoverflow.com/questions/10294677/updating-counter-in-xquery) –

+0

Любое утверждение о том, что «X быстрее Y» не основано (и предпочтительно сопровождаемый) измерениями конкретных запросов, выполняемых конкретными реализациями, вероятно, будет фольклором. Эта конкретная претензия скорее всего расскажет вам больше об источнике, чем о скорости операций в BaseX или любой другой реализации XQuery. –

ответ

1

Поскольку XQuery является функциональным языком, невозможно переназначить другие значения для функции. Тем не менее, вы можете использовать развороте влево для увеличения значения в цикле:

fold-left(db:open("My_DB")/my/xml//path, 0, function($result, $curr) { 
    $result + 1 
}) 

Время выполнения count() зависит от реализации XQuery. В BaseX count() обычно намного быстрее, чем цикл, поскольку во многих случаях он может быть ускорен поисками в статистике базы данных.