MarkLogic查找包含给定xpath的空节点的所有doc uris

时间:2014-10-29 15:54:08

标签: marklogic

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相对应的文档

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未过滤搜索”的文档或坚持过滤(默认)搜索