web-dev-qa-db-fra.com

comment utiliser if else dans l'affectation xquery

J'essaie d'utiliser une condition if pour attribuer une valeur à une variable dans une xquery. Je ne sais pas comment procéder.

Voici ce que j'ai essayé:

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

Ce code renvoie une erreur d'expression "X" incomplète [XPST0003]. Quelqu'un peut-il m'aider à résoudre ce problème?

Aussi, quelqu'un peut-il suggérer de bons tutoriels pour apprendre les xqueries.

Merci, Sony

16
sony

C'est parce que dans XQuery spécification d'expression conditionnelle else-expression est toujours requis:

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

Vous devez donc écrire la deuxième clause else (par exemple, elle peut retourner une séquence vide):

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

Quelques bugs évidents sont également corrigés:

  • pas besoin de {} autour du constructeur d'élément calculé;
  • très probablement, vous voulez if($entry_type = ('package', 'libapp'))

Concernant les tutoriels XQuery. Le Tutoriel XQuery de W3CSchools est un très bon point de départ.

19
Shcheklein