2011-12-11 21 views
5

io sto cercando di trovare dipendenti che lavorano su progetti trova a Houston, ma il reparto il progetto è ospitato in non si trova a Houston. Stavo cercando di modellare l'espressione dopo l'esempio this di espressioni FLWOR ma la query non restituisce nulla e dovrebbe restituire risultati.Utilizzando espressioni XQuery FLWOR per trovare più "dove" restrizioni

Edit: Ecco la input.

xquery 
let $doc := doc("~path/company.xml") 
for $e in $doc//employee, 
    $d in $doc//department, 
    $p in $doc//projects 
where $d/locations[location!="Houston"] 
and $p/project[plocations="Houston"] 
return <e>{$e/fname}{$e/lname}{$e/address}</e> 
/
+0

Hai dimenticato di mostrarci il documento XML. –

+0

Spiacente, ho aggiunto il file di input. – mnky9800n

risposta

6

Una clausola for è sufficiente; in caso contrario, si iterazioni su tutti i dipendenti più volte:

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> 
+0

Spiacente ho aggiunto il file di input. – mnky9800n

+0

Leggermente modificato; questa versione della query verrà valutata più velocemente da alcuni processori XQuery (come BaseX). –

1

Typo: and $p/project[plocation="Houston"]

Hai avuto una "s" troppo: era plocations.

+0

Hmm, questo produce molta replica. Ho provato 'valori distinti (query sopra)' ma dice che c'è un errore di sintassi, tuttavia si consiglia di farlo in questo modo da [questo post StackOverflow] (http://stackoverflow.com/questions/3702764/xquery-distinct -Valori-con-cui-clausola-problema). – mnky9800n

2

una singola espressione XPath 2.0 possono selezionare tutti i dipendenti volevano:

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

XPath è migliore in qualche modo rispetto all'utilizzo di XQuery? – mnky9800n

+0

In realtà, l'unico vantaggio dell'utilizzo di XPath puro è che è possibile utilizzarlo anche con processori che non supportano XQuery. –

+0

@ mnky9800n: @_Christian Grün ha risposto alla tua domanda. In un certo senso, essere in grado di esprimere qualcosa in XPAth pura rende la soluzione in definitiva più portabile. Ad esempio, è possibile valutare questa espressione XPath non solo con il processore XQuery (XPath è un sottoinsieme di XQuery) ma anche con qualsiasi processore XSLT 2.0 o 3.0 XSLT o con qualsiasi motore XPath 2.0 o 3.0 standalone (purtroppo sono a conoscenza solo di PsychiPath). –