2009-05-04 5 views
0

내가 무엇을 같은 문자열을 변환 XQuery를 사용하는 "AAA = 1 & BBB = 2"XMLxquery로 즉석에서 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

fn : QName이 아닌 xs : 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,"=")} 
관련 문제