2010-09-10 2 views
12

Я пытаюсь использовать условие if, чтобы назначить значение переменной в xquery. Я не знаю, как это сделать.как использовать if else в присваивании xquery

Это то, что я пробовал:

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' or 'libapp') then 
     {element {fn:concat("libx:", $entry_type)} {()} } 
    else if ($entry_type = 'module') then 
     '<libx:module> 
     <libx:body>{$module_body}</libx:body> 
     </libx:module>' 

Этот код выдает [XPST0003] Неполные 'если' ошибка выражения. Может ли кто-нибудь помочь мне исправить это?

Кроме того, может кто-то предложить хорошие учебные пособия для изучения xqueries.

Спасибо, Sony

ответ

15

Это потому, что в conditional expression specificationеще экспрессии XQuery в всегда требуется:

[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 учебников. W3CSchools's XQuery Tutorial - неплохая отправная точка.

Смежные вопросы