Рекурсивная функция 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()", то эта простая ошибка была бы обнаружена гораздо быстрее, и мы бы сэкономили много времени.