Marklogic:使用XQuery删除重复项

Marklogic:使用XQuery删除重复项,xquery,marklogic,Xquery,Marklogic,我已经基于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="10070

我已经基于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>

假设要比较的所有元素都位于同一父元素中,您可以为每个tbl_Keysight_输入检查前面的任何同级元素是否相同,并且只返回前面的元素都不相等的tbl_Keysight_输入。因此,对于具有相同属性的每组元素,只取第一个元素,因为该元素之前没有重复项

虽然我没有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

比较和筛选的最简单方法是使用。由于您有一个XML文档目录,并且希望跨文档比较这些元素,因此可能需要使用临时XML结构

您可以选择所有tbl_Keysight_输入元素,将它们放入临时元素结构中,以便它们位于同一元素中。然后,选择并迭代每个tbl_Keysight元素,并在谓词中使用fn:deep equals以确保它们是唯一的

以下方法可以工作,但取决于目录中文档的数量以及它们包含的tbl_Keysight_输入元素的数量,这可能无法扩展

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

使用?@har07它只返回true和false语句,但我需要结果。您是否可以应用基于一个属性删除重复项时使用的相同策略?只是现在才使用deep equal来确定两个元素之间的相等性,而不是比较一个属性。。嗨@har07我已经添加了我的查询,如何检查基于Auto_Id和Product_No的重复项?我很好奇这其中的功能方面。这背后的用例是什么?输入来自哪里?请记住,拥有像上述输入这样的聚合文档,可以防止出现允许扩展到大量的解决方案。我通常会考虑单独存储项目,或者使用md5或sha哈希键来跟踪重复项。
for $x in <temp>{xdmp:directory("/documents/","1")/id/tbl_Keysight_Input}</temp>/*
where $x[not(preceding-sibling::*[fn:deep-equal(., $x)])]
return $x