2010-11-06 5 views
1

J'utilise le fichier XML suivant (users_doc.xml)exception XQuery [XPTY0019]

<users> 
    <user trusted="false"> 
    <userid>[email protected]</userid> 
    <password>sony</password> 
    </user> 
    <user trusted="false"> 
    <userid>shivi</userid> 
    <password>shivi</password> 
    </user> 
    <user trusted="false"> 
    <userid>xyz</userid> 
    <password>xyz</password> 
    </user> 
</users> 

Je courais la XQuery suivante: (ici $ DOC_NAME = users_doc, $ userid = xyz)

declare variable $doc_name as xs:string external; 
declare variable $userid as xs:string external; 
let $users_doc := doc($doc_name)/users 

return delete node $users_doc/user/userid=$userid/.. 

Je suis en train de trouver un nœud donné <userid>xyz</userid> et si l'utilisateur existe, je voudrais supprimer son nœud parent

<user trusted="false"> 
    <userid>xyz</userid> 
    <password>xyz</password> 
    </user> 

Mais, lorsque j'exécute cette requête, j'obtiens l'exception suivante:

Exception in thread "main" java.io.IOException: Stopped at line 5, column 51: 
[XPTY0019] Context node required for ..; xs:string found. 

Comment résoudre ce problème?

Merci, Sony

Répondre

2

De http://www.w3.org/TR/xquery/#ERRXPTY0019

err: XPTY0019

Il est une erreur de type si le résultat d'une étape (autre que la dernière étape) dans un l'expression de chemin contient une valeur atomique.

Regardons votre expression:

$users_doc/user/userid=$userid/.. 

Le terme gauche de la dernière étape est une comparaison ensemble de nœuds:

$users_doc/user/userid=$userid 

Ainsi, il se traduira par vrai ou faux valeur booléenne (une valeur atomique). Bien sûr, vous ne pouvez pas sélectionner le parent::node() de vrai ou faux ...

Vous voulez cette expression:

$users_doc/user[userid=$userid]