我已根据xml中的一个属性删除了重复条目。 我的问题是需要删除重复项来比较多个属性列。
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 :(得分:1)
假设要比较的所有元素都位于同一个父元素中,您可以为每个tbl_Keysight_Input
检查是否有preceding-sibling
个元素是deep-equal,并且仅返回{{1其中没有前面的元素是深度相等的。因此,对于具有相同属性的每组元素,只会采用第一个元素,因为该元素没有先前的副本。
我没有用于测试这个的marklogic,但是下面应该在XQuery中说明这个想法:
tbl_Keysight_Input
答案 1 :(得分: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