2009-05-04 67 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,"=")}