2014-10-29 34 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未過濾搜索」的文檔或堅持過濾(默認)搜索

相關問題