XQuery(MarkLogic)我很难获得包含空节点的给定xpath的所有doc uris,如果有人能提供一些关于如何操作的想法,请告诉我。
<Person id="1">
<Details>
<Contact>
<Name>Bob</Name>
<City>Oakland</City>
</Contact>
<OtherInfo>
<Cars>
<Car>
<Brand>Honda<Brand>
<Model>Accord</Model>
<Brand/>
</Car>
</Cars>
</OtherInfo>
</Details>
</Person>
<Person id="2">
<Details>
<Contact>
<Name>Chris</Name>
<City>Buffalo</City>
</Contact>
<OtherInfo>
<Cars>
<Car/>
</Cars>
</OtherInfo>
</Details>
</Person>
我希望找到所有对汽车没有任何元素价值的文档;汽车是空节点的那些。
XPath = /Person/Details/OtherInfo/Cars/Car
,它将返回与id = 2相对应的文档
答案 0 :(得分:3)
如果存在的汽车总是有子元素,可以这样:
/Person/Details/OtherInfo/Cars/Car[empty(*)]
答案 1 :(得分:1)
在XML(和ML)中没有'null'或'null node'这样的东西 这可能是迂腐的 - 或者它可能会有问题,这取决于你所假设的'null'或'null node'实际上意味着什么。
一些可能性 汽车元素不存在 Car元素存在但没有文本内容节点 Car元素存在且只有空格内容 Car元素存在并且具有将其定义为Simple Content的模式 并且只有可忽略的空白内容 Car元素是模式定义的,不允许子节点 Car元素使用xsi:nil属性进行显式注释,并进行模式验证 Car元素存在,但有元素内容(或其他标记,如PI) Car元素存在但只有属性内容 Car元素存在,但没有任何节点内容(完全为空)。
您的XML示例格式错误()但我认为您的意思是暗示的 可能的最后一个意思。 (存在但是空的)
检查某些东西是否存在并不容易有效, 它没有明确索引,而是由没有匹配隐式索引, 如果您的数据库包含许多文档并使用纯XPath,那么搜索效率可能会很低。
表达式的纯XPath可能是 doc()[/ Person / Details / OtherInfo / Cars / Car [empty(node())]] / fn:document-uri(。)
我建议使用cts:query - 更有可能进行优化,例如 假设汽车只能作为汽车的孩子出现
cts:element-value-query(
xs:QName("Car"),
"") )/fn:document-uri(.)
查询文本值为“”的所有Car元素,即文本值 一个没有子节点的简单元素。
具体取决于您是否具有架构以及索引和数据库设置 能够运行更快的未过滤查询
cts:element-value-query(
xs:QName("Car"),
""),"unfiltered" )/fn:document-uri(.)
但您需要验证配置和数据是否会导致准确的未过滤查询。 您使用fn:count()和xdmp:estimate()检查一组样本数据,看看它们是否匹配, 但这并不能保证新增数据的准确性。 确保您需要学习“过滤vs未过滤搜索”的文档或坚持过滤(默认)搜索