2010-11-22 2 views
0

J'ai le problème suivant avec ma fonction locale.XQuery: problème d'espace de noms dans les fonctions locales

La fonction suivante:

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

génère ce xml:

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

Ce qui a vraiment besoin est:

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

Comment puis-je achive cela?

  1. Comment puis-je résoudre le problème?
  2. Comment puis-je ajouter "rdf" comme NS pour l'attribut de ressource.

Merci d'avance.

Répondre

1

Vous pouvez attribuer le préfixe à la QName comme si:

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

Probablement la meilleure façon de résoudre ce problème est de déclarer ces espaces de noms dans votre requête et simplement les consulter par préfixe:

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

Notez que vous pouvez simplifier votre fonction à l'aide des constructeurs directs:

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

Merci pour la réponse. Votre solution ne fonctionne que partiellement. Cependant, le résultat devient: . Alors, comment puis-je supprimer cela? J'ai déclaré différentes variantes d'espaces de noms de copie et cela n'aide pas. – user3111525

+0

Ok. Il devait s'agir d'oXygen qui mettait en cache mes requêtes. Après avoir modifié la structure du résultat, il prend maintenant en compte la déclaration copy-namespace et la déclaration NS est supprimée des résultats. Merci encore. – user3111525

+1

@ user322034: Il ne devrait pas être possible d'utiliser un préfixe d'espace de noms sans avoir l'espace de nom dans le document. Le mieux que vous pouvez faire est de vous assurer que l'élément de premier niveau du document a ces préfixes (ce qu'il fera s'il est créé dans le même module que les déclarations d'espace de noms déclarées), puis ils apparaîtront en haut du document plutôt que sur tous les mynes: élément réel. –

Questions connexes