2014-10-29 35 views
0

XQuery(MarkLogic)我无法获得包含null节点的给定xpath的所有doc uris,请让我知道是否有人可以提供关于如何执行它的一些想法。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 DOC = 2只

回答

4

如果一辆汽车,是存在总是有子元素,像这样:

/Person/Details/OtherInfo/Cars/Car[empty(*)] 
1

在XML(和ML)有没有'null'或'null node'这样的东西 这可能是迂腐的 - 或者它可能有问题取决于你认为'null'或'null节点'实际上是什么意思。

几个可能性
车元素不存在 车的元素存在,但 车的元素存在,没有文本内容节点,只有空白内容 汽车元素存在并具有限定它是简单的内容 架构,具有只有可忽略的空白内容 汽车零部件被架构定义为不允许子节点 汽车零部件明确注明了xsi:nil属性并且被架构验证 汽车零部件存在但有元素内容(或其他标记,如PI) 汽车零部件存在但仅具有属性内容 汽车元件存在但没有任何节点内容(完全为空)。

您的XML示例是错误的(),但我认为您的意思是这意味着 最后的含义是可能的。 (存在,但为空)

检查的东西不存在是不容易有效地完成, 其没有明确索引,而是含蓄地那里是没有比赛, 这可能是低效搜索,如果索引您数据库有许多文档并使用纯XPath。

用于表达的纯的XPath可能是 DOC()[/人/详情/活动促销/汽车/汽车[空(节点())]]/FN:(。)文件-URI

我建议使用CTS:查询,而不是 - 更容易被优化,例如, 假设汽车只能出现作为汽车的一个子

cts:element-value-query(
    xs:QName("Car"), 
    ""))/fn:document-uri(.) 

此查询,以与“文本值全车元素”,这是没有子节点的简单元素的文本值 。

取决于如果您有架构或不和你的食指和DB设置你可能 能够运行未经过滤的查询速度更快

cts:element-value-query(
    xs:QName("Car"), 
    ""),"unfiltered")/fn:document-uri(.) 

但你需要验证,如果你的配置和数据导致准确的未经过滤的查询。 您使用fn:count()和xdmp:estimate()检查样本数据集,看它们是否匹配,但这不能保证新添加的数据是准确的。 为了确保您需要研究关于“过滤vs未过滤搜索”的文档或坚持过滤(默认)搜索

相关问题