2009-05-04 6 views
0

ich, was XQuery verwenden Zeichenfolge wie "aaa = 1 & bbb = 2" inWie erstellt man ein XML-Dokument mit xquery?

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

xml zu konvertieren habe ich den folgenden Code versucht, aber gescheitert!

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

Die Fehlermeldung lautet:

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 

Ich habe keine Ahnung, warum "QName" ist eine "unbekannte Funktion" ?!

Antwort

0

Sie sollten den Konstruktor verwenden xs: QName, nicht Fn: QName.

Der Körper Ihres konstruierten Element sieht auch ein wenig verdächtig:

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

in der Tat ist ein Vergleich zwischen der Zeichenfolge "{fn: substring-after ($ c" und die Zeichenfolge ")}" so der Inhalt des Elements wäre nur der Text "falsch".

Sie Ähnlich $ myname Variable tatsächlich wird auf false gesetzt und wird so eine Typprüfung Fehler zur Laufzeit erhöhen.

Ihre Funktion sollte wohl sein, wie folgt:

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

Ein berechneter Elementkonstruktor kann auch nur einen String für den Namen akzeptieren, so dass Ihre Rückkehr Ausdruck vereinfacht werden könnte, um nur

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