2010-09-10 11 views
12

Próbuję użyć warunku if, aby przypisać wartość do zmiennej w xquery. Nie jestem pewien, jak to zrobić.jak używać, jeśli jeszcze w przydziału xquery

To co próbowałem:

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>' 

Ten kod wygeneruje [XPST0003] Niepełna 'if' błąd ekspresyjny. Czy ktoś może mi pomóc to naprawić?

Czy ktoś może zaproponować dobre samouczki do nauki xqueries.

Dzięki, Sony

Odpowiedz

15

to dlatego, że w XQuery za conditional expression specificationinnego wyrażenia jest zawsze wymagane:

[45] IfExpr ::= "if" "(" Expr ")" "then" ExprSingle "else" ExprSingle 

Więc trzeba napisać drugą else klauzuli (na przykład, może powrócić pusty sekwencję):

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) ... 

Niektóre oczywiste błędy to al więc naprawiono:

  • nie potrzebuję {} wokół konstruktora elementu obliczeniowego;
  • najprawdopodobniej chcesz if($entry_type = ('package', 'libapp'))

dotyczących tutoriale XQuery. The W3CSchools's XQuery Tutorial jest całkiem dobrym punktem wyjścia.