繁体   English   中英

Marklogic:使用XQuery删除重复项

[英]Marklogic : Removing duplicates using XQuery

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

假设所有要比较的元素都位于同一父元素内,则可以针对每个tbl_Keysight_Input检查是否有任何preceding-sibling元素是deep-equal ,并且仅返回tbl_Keysight_Input ,其中前面的元素都不是Deep-equal。 因此,对于具有相同属性的每组元素,将仅采用第一个元素,因为该元素没有先前的重复项。

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

比较和过滤的最简单方法是使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM