Marklogic:使用XQuery删除重复项

时间:2017-03-16 06:14:16

标签: 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="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

2 个答案:

答案 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