Как вставить построенные узлы XML в XQuery? - PullRequest
0 голосов
/ 19 сентября 2018

Я хочу вставить узел, используя приведенный ниже код, но если я перезапущу код, я не хочу, чтобы мой узел повторялся дважды -

let $doc := fn:doc("abc.xml")

(: abc.xml looks like--

<root>
  <value1>somevalue</value1>
  <value2>somevalue</value2>
  <value3>somevalue</value3>
  <value4>somevalue</value4>
  <value5>Australia</value5>
  <value6>India</value6>
  <value7>USA</value7>
  <value8>somevalue</value8>
  <value9>somevalue</value9>
  <value10>somevalue</value10>
</root> :)

let $element :=  element Root{
                    element A{"A"},
                    element B{"B"},
                    element C{"C"},
                    element D{"D"},
                    element E{"E"}
                }  

let $doc := xdmp:node-insert-after(doc("abc.xml")//value4, $element) 
return doc("abc.xml")

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

Example- If i am running this 2 times -

Фактический результат -

<root>
<value1>somevalue</value1>
<value2>somevalue</value2>
<value3>somevalue</value3>
<value4>somevalue</value4>
<Root>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>D</D>
    <E>E</E>
</Root>
<Root>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>D</D>
    <E>E</E>
</Root>
<value5>Australia</value5>
<value6>India</value6>
<value7>USA</value7>
<value8>somevalue</value8>
<value9>somevalue</value9>
<value10>somevalue</value10>
</root>

Ожидаемый результат-

<root>
<value1>somevalue</value1>
<value2>somevalue</value2>
<value3>somevalue</value3>
<value4>somevalue</value4>
<Root>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>D</D>
    <E>E</E>
</Root>
<value5>Australia</value5>
<value6>India</value6>
<value7>USA</value7>
<value8>somevalue</value8>
<value9>somevalue</value9>
<value10>somevalue</value10>
</root>

Любые предложения ??

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Обратите внимание, что вы используете xdmp: node-insert-after - это будет делать то, что говорит имя функции (вставлять после) каждый раз, когда она вызывается.Как прокомментировано, вы можете условно вызвать xdmp: node-update.В качестве альтернативы вы можете использовать xquery напрямую:

doc("file.xml" )/root ! <root>{ ./*[ . << ./value4] , $element , $a/value4, ./*[. >> ./value4] }</root>

Примечание: оператор «<<» сравнивает «порядок документов» (позиция, а не значение) </p>

0 голосов
/ 19 сентября 2018

Перед вставкой узла убедитесь, что его там еще нет:

if (empty(child::Root)) then xdmp:update....
...