Xml 使用xquery FLWOR表达式查找多个;其中;限制
我正在努力寻找在休斯顿的项目上工作的员工,但是项目所在的部门不在休斯顿。我试图在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
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”太多:wasplocations
单个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
]