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

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

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

(: abc.xml looks like--

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

let $wrapper := if($doc//Country eq "Australia") then "AUS" 
                else if($doc//Country eq "India") then "IND"
                else ()
let $element :=  element {$wrapper}{
                    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, но я хочу, чтобы, если я выполняю это несколько раз, он должен проверить все «элемент», а также $ wrapper.Если он уже существует, он ничего не должен делать, но если какое-либо значение изменилось, он должен заменить оболочку или добавить новую оболочку

Example- If i am running this 2 times-

Actual Output when my country is AUSTRALIA and elements are "ABCDE"

<root>
<value1>somevalue</value1>
<value2>somevalue</value2>
<value3>somevalue</value3>
<value4>somevalue</value4>
<AUS>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>D</D>
    <E>E</E>
</AUS>
<AUS>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>D</D>
    <E>E</E>
</AUS>
<Country>Australia</Country>
<value8>somevalue</value8>
<value9>somevalue</value9>
<value10>somevalue</value10>
</root>

Expected Output- After running 2 or more times
Case-1-If the elements are "ABCDE"  and country is AUSTRALIA then it should give-

<root>
<value1>somevalue</value1>
<value2>somevalue</value2>
<value3>somevalue</value3>
<value4>somevalue</value4>
<AUS>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>D</D>
    <E>E</E>
</AUS>
<Country>Australia</Country>
<value8>somevalue</value8>
<value9>somevalue</value9>
<value10>somevalue</value10>
</root>

Expected Output- Case-2-If the elements are "ABCFJ" and country is AUSTRALIA then it should give-

<root>
<value1>somevalue</value1>
<value2>somevalue</value2>
<value3>somevalue</value3>
<value4>somevalue</value4>
<AUS>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>F</D>
    <E>J</E>
</AUS>
<Country>Australia</Country>
<value8>somevalue</value8>
<value9>somevalue</value9>
<value10>somevalue</value10>
</root>

Expected Output- Case-3-If the elements are "ABCDE" and country changed to INDIA in 2nd run then it should give-
<root>
<value1>somevalue</value1>
<value2>somevalue</value2>
<value3>somevalue</value3>
<value4>somevalue</value4>
<AUS>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>F</D>
    <E>E</E>
</AUS>
<IND>
    <A>A</A>
    <B>B</B>
    <C>C</C>
    <D>F</D>
    <E>E</E>
</IND>
<Country>Australia</Country>
<value8>somevalue</value8>
<value9>somevalue</value9>
<value10>somevalue</value10>
</root>

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

Ответы [ 3 ]

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

Вопрос и ответ такие же, как и на ваш предыдущий вопрос Как вставить построенные узлы XML в XQuery?

Не имеет значения, является ли узел только текстовым контентом,элемент или смешанное содержимое.

0 голосов
/ 13 декабря 2018

@ shalini-- Пожалуйста, проверьте ниже запрос, я думаю, что он удовлетворит все ваши требования.

  xquery version "1.0-ml";
  let $input :=doc("abc.xml")

    let $wrapper := if($input//Country eq "Australia") then "AUS" 
            else if($input//Country eq "India") then "IND"
            else ()
    let $element :=  element {$wrapper}{
                element A{"A"},
                element B{"E"},
                element C{"D"},
                element D{"D"},
                element E{"E"}
            }

     let $result:=(
           if(fn:exists($input//AUS) and ($wrapper eq "AUS") and ($element eq 
           $input//AUS)) then ("Element already added no need to update")
           else if(fn:exists($input//AUS) and ($wrapper eq "AUS") and ($element ne 
            $input//AUS))
           then(
                 let $insert-node :=(xdmp:node-insert-after($input//value4, 
            $element),  
           <root>
          <Meassge>==Below Element added==</Meassge>
          <element>{$element}</element>
            </root>)
                 return $insert-node
               )
          else if(fn:exists($input//IND) and ($wrapper eq "IND") and ($element eq 
          $input//IND)) then ("Element already added no need to update") 
        else if(fn:exists($input//IND) and ($wrapper eq "IND") and ($element ne 
        $input//IND))
        then(
              let $insert-node :=(xdmp:node-insert-after($input//value4, $element),  
        <root>
       <Meassge>==Below Element added==</Meassge>
      <element>{$element}</element>
       </root>)
             return $insert-node
            )
       else(
       let $insert-node :=(xdmp:node-insert-after($input//value4, $element),  
      <root>
      <Meassge>==Below Element added==</Meassge>
       <element>{$element}</element>
      </root>)
       return $insert-node
       )
      )
     return $result
0 голосов
/ 24 сентября 2018

Проверьте наличие элемента 'AUS' перед его добавлением, а затем либо не добавляйте его повторно, либо замените его на xdmp: node-replace.

HTH!

...