marklogi c удалить дубликат узла / элемента - PullRequest
1 голос
/ 12 февраля 2020

У меня есть несколько тысяч документов, которые имеют повторяющиеся узлы элементов. Как я могу найти и удалить дубликаты title в моих XML файлах?

Я использую fn:distict-values() вызывает проблемы с производительностью.

например: 01. xml

<doc>
     <pdf>1</pdf>
     <title>Head First JavaScript</title>
     <title>Head First JavaScript</title>
</doc>

02. xml

<doc>
    <pdf>0</pdf>
    <title>Python: Programming Basics for Absolute Beginners </title>
    <title>Python: Programming Basics for Absolute Beginners </title>
</doc>

результат: 01. xml

<doc>
     <pdf>1</pdf>
     <title>Head First JavaScript</title>

</doc>

02. xml

<doc>
    <pdf>0</pdf>
    <title>Python: Programming Basics for Absolute Beginners </title>

</doc>

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Привет. Пожалуйста, проверьте прилагаемый код

    let $doc :=
<doc>
    <title>Head First JavaScript</title>
     <title>Head First JavaScript</title>
     <title>hellao</title>
     <title>hello</title>
     <title>hello</title>
     <title>Python: Programming Basics for Absolute Beginners </title>
     <title>ahello</title>
     <title>Python: Programming Basics for Absolute Beginners </title>
</doc>

for $data in $doc//title[not(. = preceding-sibling::node())]
return $data
0 голосов
/ 12 февраля 2020

Один из самых простых способов удалить дубликаты title элементов - преобразование XSLT.

xquery version "1.0-ml";
declare variable $XSLT :=
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <!-- This identity template copies all content by default -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <!--This template matches (and removes) the duplicate title elements 
        You could match more generically on any element * or add other match criteria
       -->
    <xsl:template match="title[text() = preceding-sibling::title[1]/text()]"/>

</xsl:stylesheet>;

xdmp:xslt-eval($XSLT, 
  <doc>
    <pdf>0</pdf>
    <title>Python: Programming Basics for Absolute Beginners </title>
    <title>Python: Programming Basics for Absolute Beginners </title>
  </doc>
)

Если это всего несколько тысяч документов, вы можете преобразовать и сохранить их все в выполнение одного модуля.

В противном случае применение преобразования в задании CoRB , как предлагает @hunterhacker, гарантирует, что вам не нужно беспокоиться о тайм-аутах, разделив работу на отдельные исполнения.

0 голосов
/ 12 февраля 2020

Я предлагаю вам выполнить задание CORB и каждый из них должен обработать c индивидуально. Тогда точный код, который вы запускаете для каждого документа, не будет иметь большого значения, пока он работает. Это то, что вы позволите запускать в одночасье, если у вас огромный массив данных.

...