Я хочу вернуть дубликат узла с тем же значением текста в одном файле XML - PullRequest
0 голосов
/ 31 мая 2018

Ниже моего xml:

Имя файла: ratio.xml

    <relations>
<relation>
<normativelyReferencedBy>00-3880945351</normativelyReferencedBy>
<normativelyReferencedBy>BS EN 12899-1:2007</normativelyReferencedBy>
</relation>
<relation>
<normativelyReferencedBy>00-3880945351</normativelyReferencedBy>
<normativelyReferencedBy>BS EN 12899-1:2007</normativelyReferencedBy>
</relation>
<relation>
<normativelyReferencedBy>01-1012946847</normativelyReferencedBy>
<normativelyReferencedBy>BS EN 13291-2:2003</normativelyReferencedBy>
</relation>
</relations>

В этом xml первые два узла одинаковы, а текст также одинаков, поэтому я хочувернуть это с их именем файла как: я хочу вернуться через xquery в marklogic server.

Result:
abc.xml
<relation>
<normativelyReferencedBy>00-3880945351</normativelyReferencedBy>
<normativelyReferencedBy>BS EN 12899-1:2007</normativelyReferencedBy>
</relation>

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Эрик отвечает хорошо.Однако это решение будет отлавливать случаи, когда повторяющиеся элементы не всегда предшествуют друг другу:

xquery version "1.0-ml";

let $data :=     
<relations>
<relation>
<normativelyReferencedBy>00-3880945351</normativelyReferencedBy>
<normativelyReferencedBy>BS EN 12899-1:2007</normativelyReferencedBy>
</relation>
<relation>
<normativelyReferencedBy>00-3880945351</normativelyReferencedBy>
<normativelyReferencedBy>BS EN 12899-1:2007</normativelyReferencedBy>
</relation>
<relation>
<normativelyReferencedBy>01-1012946847</normativelyReferencedBy>
<normativelyReferencedBy>BS EN 13291-2:2003</normativelyReferencedBy>
</relation>
</relations>

let $map := map:map()

let $uniqueList :=
for $each at $i in $data/relation
 for $every at $j in $data/relation
   where $i ne $j
     return 
       if(fn:deep-equal($each, $every)) then
         if(fn:exists(map:get($map, xs:string($j)))) then () else map:put($map, xs:string($i), xs:string($j)) 
       else ()

return
<relations>
{
for $each at $i in $data/relation
  return 
   if(fn:exists(map:get($map, xs:string($i)))) then $each else ()
}
</relations>
0 голосов
/ 05 июня 2018

Используя некоторый XSLT, вы можете сделать что-то вроде этого

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="//relation[preceding-sibling::relation
        [./normativelyReferencedBy/text() = current()/normativelyReferencedBy/text()]]
        ">
        <xsl:copy>
            <xsl:copy-of select="./*"></xsl:copy-of>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text()"></xsl:template>

</xsl:stylesheet>

Он предназначен только в качестве шаблона, но возвращает элементы, дублирующие перед ними дубликаты.Вам нужно будет добавить информацию, которую вы хотите сами.

...