我知道如何使用XQuery将"aaa=1&bbb=2“之类的字符串转换为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, "&")
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“是一个”未知函数“?!
发布于 2009-05-06 09:06:46
您应该使用构造函数xs:QName,而不是fn:QName。
您构造的元素的主体看起来也有点可疑:
"{fn:substring-after($c,"=")}"
实际上是字符串"{fn:substring-after($c,“和字符串")}”之间的比较,因此元素的内容就是文本"false“。
类似地,您的$myname变量实际上被设置为false,因此将在运行时引发类型检查错误。
您的函数可能如下所示:
declare function xf:query2xml($queryStr as xs:string)
as element(*) {
<query-params>
{
for $c in fn:tokenize($queryStr, "&")
let $myname := fn:substring-before($c,"=")
return
element
{xs:QName("", $myname)}
{fn:substring-after($c,"=")}
}
</query-params>
};
计算元素构造函数也可以只接受字符串作为其名称,因此您的返回表达式可以简化为
return element {$myname} {fn:substring-after($c,"=")}
https://stackoverflow.com/questions/819545
复制