Рекурсивная функция XQuery

Ранее я задавал подобный вопрос, но до сих пор не правильно обработал этот случай, во-первых, я говорю, что я новичок в этом языке XQuery, поэтому настроить рекурсивную стратегию для меня сейчас действительно сложно.

Пример кода XQuery для выполнения:

declare variable $stuff :=
  <doc>
  <embed-session>
    <session>
          <title>Fred Smith</title>
     <session>
     <title>Ahmet Özcan</title>
     <session>
     <title>Erman Bey</title>
     </session>
     </session>
    </session>
    </embed-session>
  </doc>;

declare function local:change($node as node()) as element()
{
  typeswitch($node)
  case element() return 
    element { fn:node-name($node) } {
      attribute title {data($node/title)},
      $node/session ! local:change(.)
    }
  default return $node
};

local:change($stuff/embed-session/session)

The output of the code : 

<session title="Fred Smith">
  <session title="Ahmet Özcan">
    <session title="Erman Bey"/>
  </session>
</session>

Кажется, что это соответствует моим ожиданиям, но если я добавлю еще один узел сеанса встраивания, например, в мою переменную stuff:

<embed-session>
<session>
<title>Ferhat Bey</title>
</session>
</embed-session>

моему параметру функции написано, что: [XPTY0004] Невозможно обработать последовательность item() как node(): (...,)

Ожидаемый вывод кода после добавления embed-сессии, упомянутой ниже:

<session title="Fred Smith">
  <session title="Ahmet Özcan">
    <session title="Erman Bey"/>
  </session>
</session>

<session title="Ferhat Bey"/>

Я знаю, что это последовательность, но почему я не могу назначить последовательность для узла в качестве параметра?

1 ответ

Всегда полезно объявлять ожидаемые типы аргументов вашей функции. Я думаю, вы ожидаете, что $ node будет узлом, но в своем вызове функции вы предоставляете последовательность узлов. Элемент (x) соответствует только одноэлементной последовательности, поэтому он не совпадает, когда вы предоставляете более одной. Если бы вы написали "$node as node()", то эта простая ошибка была бы обнаружена гораздо быстрее, и мы бы сэкономили много времени.

Другие вопросы по тегам