2010-07-29 21 views
3

Si j'ajoute deux documents à une BaseX DB, disons normal.xml et normal2.xml, est-il un moyen de se référer à chacun individuellement?Se référer à un document spécifique dans un DB BaseX en utilisant XQuery

Je connais la fonction doc(), mais elle regarde le système de fichiers pour son emplacement, plutôt que dans la base de données elle-même. Par exemple, si je demande avec ceci: doc("normal.xml")/name, alors j'obtiendrai une erreur à propos de normal.xml n'étant pas trouvé. J'ai également essayé: basex:db("my-db-name")/doc("normal.xml")/name et a reçu la même erreur.

Des idées?

Répondre

7

J'ai fini par demander à la BaseX mailing list et la réponse reçue est la suivante:

for $doc in collection('test-db') 
    where matches(document-uri($doc), 'example.xml') 
return $doc 

J'ai aussi demandé pourquoi il n'y avait pas façon directe de référencer le document que l'on voudrait extraire des données à temps constant, et la réponse était:

Cela est dû au XQuery data model. XQuery n'a pas de notion formelle de fichiers dans une base de données/collection (Christian pourrait me corriger si je me trompe), alors la commande collection() retourne toute séquence de (document-) nœuds pour la base de données donnée. Il appartient à l'utilisateur de choisir les nœuds qu'il veut traiter.

Nous recherchons actuellement des idées pour naviguer dans les collections de manière plus intuitive; quelque chose de similaire à "collection ('db/path-to/document.xml')" qui devrait toujours être conforme à la recommandation actuelle du W3C. Comme le document-uri() suivant fonctionne généralement assez bien, ce n'est pas trop élevé sur notre liste de priorités.

Merci pour l'aide cependant.

4

La requête suivante pourrait vous aider:

for $doc in collection('your-db-name') 
let $path := base-uri($doc) 
where ends-with($path, 'normal.xml') 
return $doc/name 
3

La fonction doc() est tout ce dont vous avez besoin si vous le savez. En supposant que vous avez créé et ouvert une base de données nommée 'mydb, si vous ajoutez un document avec la commande suivante:

ADD TO your_name /some/path/on/filesystem.xml 

Vous pouvez toujours ouvrir le document suivant à l'aide:

XQUERY doc('mydb/your_name') 

AJOUTER À ignorera le nom du fichier que vous lui avez donné et utilisez le nom que vous avez spécifié dans l'URI. Soyez averti cependant: il n'y a aucune garantie d'unicité de 'votre_nom' lorsque vous exécutez cette commande. Et si ce n'est pas unique, la fonction (doc) lancera une erreur BaseX (ne faisant pas partie de la norme XQuery) indiquant qu'elle correspond à plusieurs documents.