6
votes

Utilisation d'expressions XQuery Flwor pour trouver plusieurs restrictions "où"

J'essaie de trouver des employés qui travaillent sur des projets situés à Houston, mais le département Le projet est logé dans le Houston. J'essayais de modéliser l'expression après Cet exemple d'expressions de Flwor, mais la requête ne renvoie rien à et il devrait renvoyer des résultats.

Edit: Voici le Entrée . xxx


2 commentaires

Vous avez oublié de nous montrer le document XML.


Désolé j'ai ajouté le fichier d'entrée.


3 Réponses :


6
votes

Un pour code> est suffisant; Sinon, vous ira bien sur tous les employés à plusieurs reprises:

let   $doc := doc(...)
for   $e in $doc//employee
let   $p := $doc//project[@pnumber = $e/projects/worksOn/@pno]
where $p[plocation = 'Houston']
  and $doc//department[@dno = $p/@controllingDepartment]
                      [not(locations/location = 'Houston')]
return <e>{ $e/fname }{ $e/lname }{ $e/address }</e>


2 commentaires

Désolé j'ai ajouté le fichier d'entrée.


Légèrement édité; Cette version de la requête sera évaluée plus rapidement par certains processeurs XQuery (tels que basex).



1
votes

typo: et $ p / projet [pluctions = "houston"]

Vous avez eu une "s" "s": était compléments .


1 commentaires

Hmm, cela produit beaucoup de réplication. J'ai essayé des valeurs distinctes (requête ci-dessus) mais il est dit qu'il existe une erreur de syntaxe, mais il est recommandé de le faire de cette façon de Ce stackoverflow post .



2
votes

Une seule expression XPath 2.0 peut sélectionner tous les employés recherchés:

/*/employees
     /*[projects/*/@pno
       =
        /*/projects/*
               [plocation eq 'Houston'
              and
                boolean
                (for $dn in @controllingDepartment
                  return
                   /*/departments/*
                       [@dno eq $dn
                      and
                        not(locations/location
                          =
                           'Houston'
                           )
                       ]
                )
               ]/@pnumber
       ]


4 commentaires

Xpath est-il meilleur d'une manière ou d'une autre que d'utiliser XQuery?


En fait, le seul avantage utilisant Pure XPath est que vous pouvez également l'utiliser avec des processeurs qui ne supportent pas XQuery.


@ mnky9800n: @_christian Grün a répondu à votre question. Dans un sens, être capable d'exprimer quelque chose dans Pure XPath rend votre solution finalement plus portable. Par exemple, vous pouvez évaluer cette expression XPath non seulement avec votre processeur XQuery (XPath est un sous-ensemble de XQuery) mais également dans n'importe quel processeur XSLT 2.0 ou 3.0 XSLT ou dans tout moteur XPath 2,0 ou 3.0 autonome (hélas que je suis conscient que de psychipathe).


@ mnky9800n: Certaines personnes préfèrent également la syntaxe plus serrée de XPath sur la xquery "Verbose". XPath devient encore plus attrayante en 3.0 avec les fonctions supérieures d'ordre (HOF) et la possibilité de définir des éléments de fonction anonymes en ligne. Je suppose que pour 4.0, nous aurons sérieusement besoin d'une extension de fichier .xpath et d'une "clause d'importation" pour XPath. (: Espérons que cela arrive bientôt :)