2009-05-04 20 views
0

私は何のxmlxqueryを使ってXML文書を作成する方法は?

<request> 
    <aaa>1</aaa> 
    <bbb>2</bbb> 
</request> 

に "BBB = 2 = 1 & AAA" のような文字列を変換するために、XQueryを使用するために、私は、次のコードを試みたが、失敗しました!

xquery version "1.0" encoding "GBK"; 
(:: pragma type="xs:anyType" ::) 

declare namespace xf = "http://tempuri.org/BNetAP/Xquery/query2xml/"; 

declare function xf:query2xml($queryStr as xs:string) 
    as element(*) { 
    <query-params> 
    { 
     for $c in 
      fn:tokenize($queryStr, "&amp;") 
     let $myname as xs:string := "{fn:substring-before($c,"=")}" 
     return 
      element 
       {fn:QName("", $myname)} 
       {"{fn:substring-after($c,"=")}"} 
    } 
    </query-params> 
}; 

エラーメッセージは次のとおりです。

line 15, column 6: "{http://www.w3.org/2004/07/xpath-functions}QName": unknown function (or number of arguments (2) is wrong) BNetAP/Xquery query2xml.xq line 15 1241431186406 397 

私は "QNameは" "unknow機能" である理由はわかりません!

答えて

0

fn:QNameではなく、xs:QNameというコンストラクターを使用する必要があります。

あなたの構築要素の身体も少し不審になります

"{fn:substring-after($c,"=")}" 

は、実際には文字列「{:(文字列サブ-後の$ C、」)FN「}」との比較であります ですから、要素の内容は単にテキスト "false"になります。

同様に、$ myname変数は実際にはfalseに設定されているため、実行時に型チェックエラーが発生します。

次のようにあなたの機能は、おそらくする必要があります:あなたのリターン式がちょうど

return element {$myname} {fn:substring-after($c,"=")} 
に簡素化することができるよう

declare function xf:query2xml($queryStr as xs:string) 
    as element(*) { 
    <query-params> 
    { 
    for $c in fn:tokenize($queryStr, "&amp;") 
    let $myname := fn:substring-before($c,"=") 
    return 
     element 
     {xs:QName("", $myname)} 
     {fn:substring-after($c,"=")} 
    } 
    </query-params> 
}; 

、計算要素コンストラクタも、その名前のための単なる文字列を受け入れることができます

関連する問題