2010-09-10 19 views
12

Estoy tratando de usar una condición if para asignar un valor a una variable en una xquery. No estoy seguro de cómo hacer esto.cómo usar if else en la asignación xquery

Esto es lo que he intentado:

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

Este código produce un [XPST0003] incompleto 'si' error de expresión. Alguien me puede ayudar a arreglar esto?

Además, ¿alguien puede sugerir algunos buenos tutoriales para aprender xqueries.

Gracias, Sony

Respuesta

15

Eso es porque en conditional expression specificationotra cosa, la expresión de XQuery siempre es necesario:

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

Así que tienen que escribir segunda cláusula else (por ejemplo, puede devolver secuencia vacía):

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

Algunos errores obvios son al tan fijo:

  • no necesita {} alrededor del constructor del elemento calculado;
  • más probable es que quieren if($entry_type = ('package', 'libapp'))

En cuanto a tutoriales XQuery. El W3CSchools's XQuery Tutorial es un buen punto de partida.