2010-05-18 31 views
1

J'utilise Apache Tomcat de Exist DB comme une base de données XML et essaie de construire une séquence en passant le XPath suivant, défini dans son FLWOR « let » clause:Comment passer un XPath dans une déclaration de fonction XQuery

$xpath := $root/second/third 

dans une déclaration de fonction définie localement, comme ceci:

declare function local:someFunction($uuid as xs:string?, $xpath as xs:anyAtomicType?) 
{ 
    let $varOne := $xpath/fourth[@uuid = $uuid]/fifthRight 
    let $varTwo := $xpath/fourth[@uuid = $uuid]/fifthLeft 
    let $combined := ($varOne,$varTwo) 
    return $combined 
}; 

Bien sûr, en entrant dans ce bac à sable dans le XQuery exist, je reçois type: xs: anyAtomicType n'est pas défini. Que devrais-je utiliser à la place ou devrais-je le faire différemment?

Merci d'avance pour toute suggestion.

Répondre

1

Je n'ai pas pu reproduire l'erreur (xs: anyAtomicType non défini). Cependant, peut-être que ce qui suit peut aider? Si $ xpath (initialement un noeud) est passé comme un paramètre de type atomique (donc atomisé), il lancera certainement une erreur de type XPTY0019 lorsque vous tenterez de naviguer dans votre fonction ($xpath/fourth). Est-ce que le code suivant fonctionne de votre côté (passé comme node()* à la place)?

declare function local:someFunction($uuid as xs:string?, $xpath as node()*) 
{ 
    let $varOne := $xpath/fourth[@uuid = $uuid]/fifthRight 
    let $varTwo := $xpath/fourth[@uuid = $uuid]/fifthLeft 
    let $combined := ($varOne,$varTwo) 
    return $combined 
}; 

let $root := 
    <first> 
    <second> 
     <third> 
     <fourth uuid="1"> 
      <fifthLeft>foo</fifthLeft> 
      <fifthRight>bar</fifthRight> 
     </fourth> 
     </third> 
    </second> 
    </first> 
let $xpath :=$root/second/third 
return 
local:someFunction("1", $xpath) 

(Edit: oublié l'étoile pour permettre un certain nombre de noeuds)

+0

Merci xqib équipe! en utilisant: $ xpath comme noeud() * résolu mon problème. Je regardais une hiérarchie de types atomiques que xQuery a intégré, mais bien sûr, puisque je passe un nœud, il n'est pas catégorisé comme tel. Je ne comprends vraiment pas très bien les définitions de type de données dans xQuery, et je n'ai pas trouvé un bon ensemble de tutoriels qui illustrent comment jouer avec chacun d'eux. Merci encore. – topmulch

0

Une expression comme racine $/deuxième/troisième des rendements général une série d'articles il est donc pas utile de penser comme chemin. En utilisant le type xs: anyAtomicType? va contraindre les éléments à un atome.

Vous pouvez simplifier la fonction de

declare function local:y($uuid as xs:string?, $xpath as item()*) 
{ 
    $xpath/fourth[@uuid = $uuid]/(fifthRight,fifthLeft) 
}; 

BTW eXist db est un projet open source indépendante non connecté à Apache ou Tomcat bien qu'il utilise des composants Apache comme Xalan et Lucene

+0

Bonjour Chris, j'ai utilisé item() * et cela a fonctionné aussi. Bien que, j'avais besoin de la fonction pour retourner une séquence. Je m'excuse d'avoir déclaré que DB Exist fait partie du projet Apache Tomcat - je le savais aussi. En fait, sur une autre machine, j'utilise Jetty comme serveur web et non Apache. Nous vous remercions de votre réponse. – topmulch