2009-05-04 3 views
0

я что использовать XQuery для преобразования строки, как «ааа = 1 & ГЭБ = 2» в XMLКак создать XML-документ на лету с помощью xquery?

<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» и строка «)}» , поэтому содержание элемента будет просто «ложным».

Аналогично, переменная $ 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,"=")} 
Смежные вопросы