2009-05-04 69 views
0

我用什麼XQuery來字符串轉換,如 「AAA = 1 & BBB = 2」 轉換成XML如何用xquery隨時創建xml文檔?

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

我曾嘗試下面的代碼,但失敗了!

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」 是 「不明功能」?

回答

0

您應該使用構造函數xs:QName,而不是fn:QName。

您構成元素的身體看起來也有點懷疑:

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

實際上是在字符串之間的比較「爲{fn:子-後($ C,」和字符串「)}」 所以元素的內容只是文本「false」。

同樣,你的$ myname變量實際上被設置爲false,所以會在運行時引發一個類型檢查錯誤。

你的函數大概應該是如下:

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> 
}; 

計算元素構造還可以接受只是一個字符串它的名字,所以你的回報表達可以簡化爲只

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