как использовать если еще в назначении xquery - PullRequest
16 голосов
/ 10 сентября 2010

Я пытаюсь использовать условие if для присвоения значения переменной в 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] Incomplete 'if' error expression.Может ли кто-нибудь помочь мне исправить это?

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

Спасибо, Sony

1 Ответ

19 голосов
/ 10 сентября 2010

Это потому, что в спецификации условных выражений XQuery else-выражение всегда требуется:

[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. Учебник по XQuery W3CSchools является хорошей отправной точкой.

...