2017-03-16 94 views
1

我已經根據xml中的一個屬性刪除了重複項。 我的問題是需要刪除重複的比較多個屬性列。Marklogic:使用XQuery刪除重複項

Input 
    <Id> 
     <tbl_Keysight_Input Auto_Id="66365" Product_No="10070D" Product_Option="10070D"/> 
     <tbl_Keysight_Input Auto_Id="66365" Product_No="10070D" Product_Option="10070D"/> 
     <tbl_Keysight_Input Auto_Id="66365" Product_No="10070D1" Product_Option="10070D"/> 
     <tbl_Keysight_Input Auto_Id="66365" Product_No="10070D1" Product_Option="10070D"/> 
     <tbl_Keysight_Input Auto_Id="66365" Product_No="10070D" Product_Option="10070D"/> 
     </Id> 

Expected output: 

    <Id> 
    <tbl_Keysight_Input Auto_Id="66365" Product_No="10070D" Product_Option="10070D"/> 
    <tbl_Keysight_Input Auto_Id="66365" Product_No="10070D1" Product_Option="10070D"/> 
    </Id> 

請爲我的要求提供xquery。

以下查詢僅基於Auto_id。

for $d in distinct-values(xdmp:directory("/documents/","1")//Id/tbl_Keysight_Input/@Auto_Id) 
let $items := xdmp:directory("/documents/","1")/id/tbl_Keysight_Input[@Auto_Id = $d] 
order by $d 
return 

     for $i in $items [position() le 1] 
     return $i 
+0

使用[':fn:deep-equal()'](https://docs.marklogic.com/fn:deep-equal)? – har07

+0

@ har07它只返回true和false語句,但我需要結果 – Antony

+0

不能應用與*基於一個屬性*刪除重複條目時使用的相同策略嗎?只有現在使用'deep-equal()'來確定2個元素之間的相等(而不是比較一個屬性).. – har07

回答

1

假設要被比較的所有元素駐留在相同的父元素中,可以檢查,針對每個tbl_Keysight_Input,如果任何preceding-sibling元件是deep-equal,並且僅返回tbl_Keysight_Input其中沒有前述元件是深等於。因此,對於每個具有相同屬性的元素組,只有第一個元素將被採用,因爲該元素沒有前面的副本。

我沒有marklogic因爲雖然測試此,但以下要說明的XQuery的想法:

for $x in xdmp:directory("/documents/","1")/id/tbl_Keysight_Input 
where count($x/preceding-sibling::tbl_Keysight_Input[fn:deep-equal(.,$x)]) = 0 
return $x 
1

最簡單的方法來比較和篩選是使用fn:deep-equal()。由於您有一個XML文檔的目錄,並且想要跨文檔比較這些元素,因此您可能需要使用臨時的XML結構。

您可以選擇所有tbl_Keysight_Input元素,將它們放入臨時元素結構中,以使它們位於同一元素中。然後,選擇並遍歷每個tbl_Keysight元素並在謂詞中使用fn:deep-equals()以確保它們是唯一的。

以下內容將有效,但取決於目錄中文檔的數量以及它們包含的tbl_Keysight_Input元素的數量,這可能無法擴展。

for $x in <temp>{xdmp:directory("/documents/","1")/id/tbl_Keysight_Input}</temp>/* 
where $x[not(preceding-sibling::*[fn:deep-equal(., $x)])] 
return $x