Это потому, что в спецификации условных выражений XQuery else-выражение всегда требуется:
[45] IfExpr ::= "if" "(" Expr ")" "then" ExprSingle "else" ExprSingle
Итак, вам нужно написать второе предложение else
(например, оно может возвращать пустую последовательность):
declare namespace libx='http://libx.org/xml/libx2';
declare namespace atom='http://www.w3.org/2005/Atom';
declare variable $entry_type as xs:string external;
let $libx_node :=
if ($entry_type = ('package','libapp')) then
element {fn:concat("libx:", $entry_type)} {()}
else if ($entry_type = 'module') then
<libx:module>
<libx:body>{$module_body}</libx:body>
</libx:module>
else ()
... (your code here) ...
Также исправлены некоторые очевидные ошибки:
- не нужно {} вокруг конструктора вычисляемых элементов;
- Скорее всего, вы хотите
if($entry_type = ('package', 'libapp'))
Относительно учебников по XQuery. Учебник по XQuery W3CSchools является хорошей отправной точкой.