Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 使用xquery FLWOR表达式查找多个;其中;限制_Xml_Xpath_Xquery_Xpath 2.0_Flwor - Fatal编程技术网

Xml 使用xquery FLWOR表达式查找多个;其中;限制

Xml 使用xquery FLWOR表达式查找多个;其中;限制,xml,xpath,xquery,xpath-2.0,flwor,Xml,Xpath,Xquery,Xpath 2.0,Flwor,我正在努力寻找在休斯顿的项目上工作的员工,但是项目所在的部门不在休斯顿。我试图在FLWOR表达式的示例之后对表达式建模,但查询不返回任何内容,它应该返回结果 编辑:这是你的答案 xquery 让$doc:=doc(“~path/company.xml”) 对于$doc//employee中的$e, $doc//部门中的$d, $doc//项目中的$p 其中$d/位置[位置!=“休斯顿”] 和$p/项目[plocations=“Houston”] 返回{$e/fname}{$e/lname}{$e

我正在努力寻找在休斯顿的项目上工作的员工,但是项目所在的部门不在休斯顿。我试图在FLWOR表达式的示例之后对表达式建模,但查询不返回任何内容,它应该返回结果

编辑:这是你的答案

xquery
让$doc:=doc(“~path/company.xml”)
对于$doc//employee中的$e,
$doc//部门中的$d,
$doc//项目中的$p
其中$d/位置[位置!=“休斯顿”]
和$p/项目[plocations=“Houston”]
返回{$e/fname}{$e/lname}{$e/address}
/

一个
条款就足够了;否则,您将对所有员工进行多次迭代:

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>
let$doc:=doc(…)
对于$doc//employee中的$e
让$p:=$doc//project[@pnumber=$e/projects/worksOn/@pno]
其中$p[plocation='Houston']
和$doc//department[@dno=$p/@controllingDepartment]
[非(地点/地点=‘休斯顿’)]
返回{$e/fname}{$e/lname}{$e/address}

打字:
和$p/project[plocation=“Houston”]


您的“s”太多:was
plocations

单个XPath 2.0表达式可以选择所有需要的员工:

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

您忘记向我们显示XML文档。很抱歉,我添加了输入文件。很抱歉,我添加了输入文件。略微编辑;某些XQuery处理器(如BaseX)会更快地评估此版本的查询。嗯,这会产生大量复制。我尝试了
不同的值(上面的查询)
但它说有语法错误,但建议从中这样做。XPath在某些方面比使用XQuery好吗?实际上,使用纯XPath的唯一好处是,您也可以将其用于不支持XQuery的处理器。@mnky9800n:@_christiangrün回答了您的问题。从某种意义上说,能够用纯XPAth表达某些东西最终会使您的解决方案更具可移植性。例如,您不仅可以使用XQuery处理器(XPath是XQuery的子集)计算此XPath表达式,还可以在任何XSLT 2.0或3.0 XSLT处理器或任何独立的XPath 2.0或3.0引擎中计算(唉,我只知道PsychiPath)。@mnky9800n:还有一些人更喜欢XPath的语法,而不是“详细”XQuery。XPath在3.0中更具吸引力,它具有高阶函数(HOF)和定义内联匿名函数项的能力。我的猜测是,对于4.0,我们需要一个.xpath文件扩展名和一个xpath的“import子句”。(:希望这很快到来:)
/*/employees
     /*[projects/*/@pno
       =
        /*/projects/*
               [plocation eq 'Houston'
              and
                boolean
                (for $dn in @controllingDepartment
                  return
                   /*/departments/*
                       [@dno eq $dn
                      and
                        not(locations/location
                          =
                           'Houston'
                           )
                       ]
                )
               ]/@pnumber
       ]