2011-12-11 27 views
5

Estoy tratando de encontrar empleados que trabajen en proyectos ubicados en Houston, pero el departamento en el que se encuentra el proyecto no se encuentra en Houston. Estaba intentando modelar la expresión después del ejemplo this de expresiones FLWOR pero la consulta no devuelve nada y debería devolver resultados.Uso de las expresiones de xquery FLWOR para encontrar varias restricciones de "dónde"

editar: Aquí está el 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

Se le olvidó que nos muestre el documento XML. –

+0

Lo siento, agregué el archivo de entrada. – mnky9800n

Respuesta

6

Una for cláusula es suficiente; de lo contrario, se le iterar sobre todos los empleados varias veces:

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

Lo siento, agregué el archivo de entrada. – mnky9800n

+0

Ligeramente editado; esta versión de la consulta será evaluada más rápidamente por algunos procesadores XQuery (como BaseX). –

1

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

Usted tenía una "s" demasiado: era plocations.

+0

Hmm, esto produce mucha replicación. Intenté 'distinct-values ​​(query above)' pero dice que hay un error de sintaxis, pero se recomienda hacerlo de esa [publicación stackoverflow] (http://stackoverflow.com/questions/3702764/xquery-distinct -values-with-where-clause-problem). – mnky9800n

2

Una sola expresión XPath 2.0 puede seleccionar todos querían empleados:

/*/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 es mejor de alguna manera que usar XQuery? – mnky9800n

+0

En realidad, la única ventaja de usar XPath puro es que también puede usarlo con procesadores que no son compatibles con XQuery. –

+0

@ mnky9800n: @_Christian Grün respondió a tu pregunta. En cierto sentido, ser capaz de expresar algo en XPAth puro hace que su solución sea finalmente más portátil. Por ejemplo, puede evaluar esta expresión XPath no solo con su procesador XQuery (XPath es un subconjunto de XQuery) sino también en cualquier procesador XSLT 2.0 o 3.0 XSLT o en cualquier motor independiente XPath 2.0 o 3.0 (Alas, solo soy consciente de PsychiPath). –

Cuestiones relacionadas