web-dev-qa-db-ja.com

xquery割り当てで他の場合の使用方法

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]不完全な「if」式エラーをスローします。誰かがこれを修正するのを手伝ってくれる?

また、誰かがxqueriesを学ぶためのいくつかの良いチュートリアルを提案できますか?.

ありがとう、ソニー

16
sony

これは、XQueryの 条件式の指定else-expressionが常に必要であるためです。

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

したがって、2番目の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チュートリアルについて。 W3CSchoolsのXQueryチュートリアル は、かなり良い出発点です。

19
Shcheklein