2 Stimmen

XQuery - Verwendung des berechneten Elementkonstruktors im Text

Wie mische ich in XQuery XML mit dem Computed-Element-Konstruktor, um den Tag eines Knotens aus einer Variablen zu setzen?

Ich habe es auf diese Weise versucht, aber kein Glück:

 if ($x eq "something") then

      {element {fn:string-join( ("if:GICS", $cp/@id), "" )} {""}}

Die erwartete Ausgabe ist:

3voto

Francis Avila Punkte 30484

Der Element-Name-Teil eines Elementkonstruktors benötigt einen xs:QName, um den Elementnamen zu erzeugen. Wenn ihm ein String übergeben wird, wandelt er ihn in einen QName um, als ob Sie `xs:QName('my-element-name')` aufgerufen hätten.

Daher müssen Sie alle Regeln befolgen, die Sie befolgen würden, als ob Sie einen expliziten xs:QName()-Konstruktor dort hätten. Das bedeutet, wenn Sie einen Namensraumprefix verwenden (zum Beispiel if:), muss es möglich sein, diesen Namensraum im statischen Kontext aufzulösen.

Das einfachste, was Sie tun können, ist einfach Ihren if:-Namensraum in Ihrem Prolog zu deklarieren (wie Sie vermutlich Ihren cp:-Namensraum deklariert haben):

declare namespace if = "http://example.org/if";
element {fn:concat('if:GICS','1234') } {}

(: produziert normalerweise  :)

Wenn Sie dies nicht tun möchten, können Sie einen QName explizit mit der fn:QName()-Funktion und dem vollen Namensraum für if: erstellen. (Hinweis: *fn:*QName ist anders als *xs:*QName!)

element {fn:QName('http://example.org/if', fn:concat('GICS', '1234'))} {}

(: produziert normalerweise  :)

Wenn Sie den verwendeten Präfix steuern möchten, können Sie 'if:' im zweiten Argument einschließen:

element {fn:QName('http://example.org/if', fn:concat('if:GICS','1234'))} {}

(: produziert  :)

Beachten Sie, dass genau welchen Präfix Sie in Ihrer XML-Ausgabe erhalten, je nach XQuery-Processor und der Struktur des XML, das Sie erstellen, variieren kann, aber Sie erhalten immer den entsprechenden XML-Infosatz.

0voto

BeniBela Punkte 15534

Sie können nicht direkt einen Namensraumpräfix in einem String haben. Sie müssen einen QName erstellen, der den Namensraum aus der Namensraum-URL enthält.

Verwenden Sie etwas wie

if ($x eq "something") then

    {element {fn:QName("if Namensraum-URL", fn:string-join( ("if:GICS", $cp/@id), "" ))} {""}}

Und Sie können genauso gut concat anstelle von string-join verwenden

if ($x eq "something") then

    {element {fn:QName("if Namensraum-URL", fn:concat( ("if:GICS", $cp/@id) ))} {""}}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X