我想排除一组节点中的某些节点。我使用XML中的Mondial数据库进行练习。例如,我想查找没有组织总部的国家。有关数据库的ER图。
这就是我如何找到一些组织总部所在的国家:
//organization/id(@headq)/id(@country)
当我从所有国家中减去某个组织有总部的国家时,我可以找到没有组织有总部所在的国家。
我想到了使用except
运算符。所以,这就是我尝试的:
java -cp saxon-he-10.1.jar net.sf.saxon.Query -qs:doc('mondial.xml')"//country except //organization/id(@headq)/id(@country)"
但我得到了这个错误:
XPDY0002轴步骤根/子体::组织的上下文项不存在。查询失败,出现动态错误:轴步骤根/子代的上下文项:组织缺少
我也尝试过这个:
java -cp saxon-he-10.1.jar net.sf.saxon.Query -qs:doc('mondial.xml')//country[not(//organization/id(@headq)/id(@country))]
但它只返回根元素:
<?xml version="1.0" encoding="UTF-8"?>
如何找到没有组织总部的国家?
您应该更换
doc('mondial.xml')//country except //organization/id(@headq)/id(@country)"
通过
doc('mondial.xml')/(.//country except .//organization/id(@headq)/id(@country))
我用以下查询替换了我的查询:
doc('mondial.xml')//country/name except doc('mondial.xml')//organization/id(@headq)/id(@country)/name
我将查询放在xq
文件中,并使用以下行执行它:
java -cp saxon-he-10.1.jar net.sf.saxon.Query query.xq
它确实奏效了。但我仍然不知道如何让它以纯命令行的方式工作,就像我的第一个原始查询一样。