2017-05-17 3 views
1

これは、MarkLogic XQueryマネージャで関数を開発しようとする簡単な単純化です。私が書こうとしている関数は、入力としてヌルノードを受け取ることができなければなりません。私は()に "empty node"を意味するように渡そうとしていましたが、それはどんな種類のトレースもなくクラッシュするようです。Marklogicが空ノードをxquery関数に渡す

たとえば、示された簡単な例では、単純に数字「1」が返されると予想されますが、そうではありません。代わりに小さな空でないXML文書を渡すと、簡単な例が動作します。

私の推論で何が間違っていますか、空のノードを渡してください。

declare function local:x ($i as node()) as xs:string* 

{ let $x := "1" 

    return $x 
}; 

local:x (()); 

答えて

3

あなたの問題は、あなたの関数がempty-sequence()正確node()単一ではなくを期待していることである(このようなあなたの関数を呼び出すことで提供しているものである:local:x(())

空のシーケンスをすることはできませんノードにキャストします。あなたがゼロまたは1のノードを期待する機能を提供したい場合 あなたはこのようにそれを行うことができます。

一部の機能は、単一の値を受け入れる:

declare function local:x($i as node()?) as xs:string* { 
    let $x := "1" 
    return $x 
    (: 
    Also instead of doing the above you could also simply return the string directly by simply typing it out: 
    "1" 
    :) 
}; 

疑問符がここで重要ですまたは空のシーケンスを引数として取り、いくつかは単一の値または空のシーケンスを返すことがあります。これは、関数のシグネチャにパラメータまたは戻り値の型名の後に疑問符( "?")を付けて表示されます。これは、単一の値または空のシーケンスが表示される必要があることを示します。あなたはについて知っておく必要があり

W3Cからの引用)

一つは、空のシーケンスが例えば同じではないということです空のテキストノード!

let $emptySeq :=() (:This actually has no value at all:) 
let $emptyText := text {} (:This simply is an empty node, but it is still a node!:) 
return (fn:empty($emptySeq), fn:empty($emptyText)) 

これは、これは素晴らしい情報です(true, false)

+0

を返します。あなたにもう少し詳しい情報を与えるなら、おそらく私が必要とするヒントを正確に教えてください。 MarkLogicはXQuery関数への反復呼び出しを可能にしています。私がしようとしているのは、蓄積された情報を入れ子にされた呼び出しに渡す関数の引数を提供することです。だから、fopレベルのコールはx(何もないもの)で、ネストされたコールはx(何か、何か)でしょう。 – Latitude42

+0

関数のマッピングについて話していますか?とにかく、あなたがこの質問に合っていると思うのであれば、あなたの質問を編集してください。私は自分の答えに適応しようとします。それ以外の場合は、新しい質問を作成してください。 – Riiverside

+1

ありがとう!あなたは私の問題に私を導いてきました。関数のマッピングが意味するものはわかりませんでしたが、それは問題です。私はそれをオフにする方法を学んだとき、私はそうし、私の静かな失敗はあなたが私に最初に説明していたものである "無効な強制"に変更されました。 – Latitude42

関連する問題