Vraag hoe te gebruiken als anders in xquery toewijzing


Ik probeer een if-voorwaarde te gebruiken om een ​​waarde toe te wijzen aan een variabele in een xquery. Ik weet niet zeker hoe ik dit moet doen.

Dit is wat ik heb geprobeerd:

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

Deze code genereert een [XPST0003] onvolledige 'if'-uitdrukkingsfout. Kan iemand me helpen dit op te lossen?

Ook kan iemand goede tutorials voorstellen om xqueries te leren.

Bedankt, Sony


12
2017-09-10 18:21


oorsprong


antwoorden:


Dat komt omdat in XQuery's specificatie voor conditionele expressie  anders-expressie is altijd vereist:

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

Dus je moet de tweede schrijven else clausule (het kan bijvoorbeeld een lege reeks retourneren):

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

Enkele voor de hand liggende fouten zijn ook opgelost:

  • niet nodig {} rond de berekende element-constructor;
  • hoogstwaarschijnlijk, wil je if($entry_type = ('package', 'libapp'))

Over XQuery-zelfstudies. De W3CSchools XQuery-zelfstudie is een redelijk goed startpunt.


16
2017-09-10 18:44