我有一个pub数据库,我需要比较两个数字(纬度)和另外两个(经度),并返回位于这些坐标之间的每个pub名称。
我尝试了同时使用逻辑和算术运算符的where子句,并尝试了一个变量和两个变量。
所有酒吧的输出始终相同,无论坐标如何。
for $x in db:open("pub", "pub.xml")/serviceList/service
where $x/geoData/latitude='40.400000000000' and $x/geoData/latitude='40.410000000000'
return $x/basicData/name
这个想法是让数据库循环查找所有坐标在40.40至40.41(纬度)和-3.7 i -3.71(经度)之间的酒吧,并返回名称。
答案 0 :(得分:1)
您当前正在测试and
条件下的纬度值是否等于两个不同的字符串(除非存在多个纬度元素,否则它将永远不会匹配两个值,但是您没有显示示例XML)
您可能想将这些经度和纬度值比较为数字(从值中删除引号)
for $x in db:open("pub", "pub.xml")/serviceList/service
where (
$x/geoData/latitude >= 40.4 and $x/geoData/latitude <= 40.41
and
$x/geoData/longitude >= -3.7 and $x/geoData/latitude <= 3.7
)
return $x/basicData/name
答案 1 :(得分:1)
Mads Hansen的解决方案可以缩写为:
for $x in db:open("pub", "pub.xml")/serviceList/service
where (
$x/geoData/latitude[. ge 40.4 and . le 40.41]
and
$x/geoData/longitude[. ge -3.7 and . le 3.7]
)
return $x/basicData/name
甚至进一步
db:open("pub", "pub.xml")/serviceList/service
[geoData[latitude[. ge 40.4 and . le 40.41] and longitude[. ge -3.7 and . le 3.7]]
/basicData/name