XQuery量词表达式匹配序列:Mondial XML数据库内陆省份查询
解决Mondial数据库中查找内陆省份的XQuery问题
我太懂你这种被XQuery里的字符串匹配坑到的感觉了!你原来的思路没问题——找所有不临海的省份,但问题出在$sea/located/@province是空格分隔的多个省份ID字符串,不是单个值,直接用!=根本没法正确判断当前省份是否在临海列表里。
给你两个靠谱的解决方案:
方法1:用tokenize()拆分字符串(推荐)
把空格分隔的ID字符串拆成单个ID的序列,再判断当前省份ID是否不在任何一个临海序列里:
let $inland := //province/@id where every $sea in //sea satisfies not($inland = tokenize($sea/located/@province, '\s+')) return $inland
tokenize($sea/located/@province, '\s+'):用正则表达式\s+(匹配任意数量的空格)把长字符串拆成独立的省份ID序列not($inland = ...):检查当前省份ID不在这个临海省份序列里,所有海域都满足这个条件的话,就是内陆省份
方法2:用contains()加边界避免部分匹配
如果你的环境对tokenize()支持有限,可以用这种方法,通过给字符串前后加空格来避免部分ID匹配(比如把"123"误判为包含在"1234"里):
let $inland := //province/@id where every $sea in //sea satisfies not(contains(concat(' ', $sea/located/@province, ' '), concat(' ', $inland, ' '))) return $inland
concat(' ', ..., ' '):给原始ID字符串和当前省份ID前后都加空格,确保匹配的是完整的IDcontains(...):判断带空格的ID是否存在于带空格的临海列表中,前面加not()就表示不存在
两种方法都能解决你的问题,优先选第一种,代码更清晰易读!
内容的提问来源于stack exchange,提问作者TheForgot3n1
相关产品推荐
相关产品推荐

