2010-11-22 10 views
0

Ich habe das folgende Problem mit meiner lokalen Funktion.XQuery: Namespace-Problem in lokalen Funktionen

Die folgende Funktion:

declare function local:exp($w as node()) as element()* { 
for $e in ($w/e) 
let $exp:= QName ("myns", "real") 
return 
    element {$exp}{ 
    attribute resource {$e/@lang} 
    } 
}; 

generiert diese xml:

<real xmlns="myns" resource="eng"/> 

Was wirklich gebraucht wird:

<myns:real rdf:resource="lang"/> 

Wie kann ich das achive?

  1. Wie kann ich das Problem angehen?
  2. Wie kann ich "rdf" als NS für Ressourcenattribut hinzufügen.

Vielen Dank im Voraus.

Antwort

1

Sie können das Präfix der QName zuweisen so:

let $exp:= QName ("urn:my-namespace", "myns:real") 

wahrscheinlich der beste Weg, dies zu lösen, ist diese Namensräume in Ihrer Abfrage zu erklären und nur um sie durch Präfix verweisen:

declare namespace rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
declare namespace myns="urn:my-namespace"; 

declare function local:exp($w as node()) as element()* { 
for $e in $w/e 
return 
    element myns:real { 
    attribute rdf:resource {$e/@lang} 
    } 
}; 

Beachten Sie, dass Ihre Funktion mithilfe direkter Konstrukteurs vereinfachen kann:

declare function local:exp($w as node()) as element()* { 
for $e in $w/e 
return <myns:real rdf:resource="{$e/@lang}" /> 
}; 
+0

Danke für die Antwort. Ihre Lösung funktioniert teilweise. Das Ergebnis wird jedoch wie folgt aussehen: . Also, wie kann ich das entfernen? Ich habe verschiedene Varianten von Copy-Namespaces deklariert und das hilft nicht. – user3111525

+0

Ok. Es muss oXygen sein, das meine Abfragen zwischenspeichert. Nachdem die Struktur des Ergebnisses geändert wurde, wird nun die Copy-Namespace-Deklaration berücksichtigt und die NS-Deklaration wird aus den Ergebnissen entfernt. Danke noch einmal. – user3111525

+1

@ user322034: Es sollte nicht möglich sein, ein Namespace-Präfix zu verwenden, ohne den Namespace im Dokument zu haben. Das Beste, was Sie tun können, ist sicherzustellen, dass das Top-Level-Element im Dokument diese Präfixe hat (was es tun wird, wenn es im selben Modul wie die Deklarations-Namespace-Deklarationen erstellt wird) und dann am Anfang des Dokuments erscheinen anstatt auf jedem myns: real element. –