【问题标题】:How to insert a constructed XML nodes in XQuery?如何在 XQuery 中插入构造的 XML 节点?
【发布时间】:2018-09-19 10:29:34
【问题描述】:

我想使用下面的代码插入一个节点,但如果我要重新运行代码,我不希望我的节点重复两次-

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 之后插入,但我希望如果我多次运行此查询,那么我的元素应该只插入一次而不是多次。

例子-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>

有什么建议吗??

【问题讨论】:

  • 您可以将其包装在 try catch 中,try 会在其中查看元素是否存在,如果缺少则 catch 会创建它。
  • 在一个新问题中发布了我的确切查询-stackoverflow.com/questions/52476912/…

标签: xquery xslt-2.0 marklogic


【解决方案1】:

在插入节点之前,检查它是否已经存在:

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

【讨论】:

  • @Michael-- 谢谢你的建议。我面临的问题是,如果在我的元素中任何节点的值都发生了变化(例如&lt;D&gt;D&lt;/D&gt; becomes &lt;D&gt;India&lt;/D&gt;),那么我不需要为此创建第二个条目,而是需要单独更新该条目。
  • 在新问题中发布了我的确切查询-stackoverflow.com/questions/52476912/…
【解决方案2】:

请注意,您使用的是 xdmp:node-insert-after - 这将在每次调用时执行函数名称所说的(插入之后)。如评论所述,您可以有条件地调用 xdmp:node-update 。或者,您可以直接使用 xquery:

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

注意:“

【讨论】:

  • @DALDEI-- 你的代码对我来说看起来有点复杂 :) 但谢谢你的建议。我面临的问题是,如果在我的元素中任何节点的值都发生了变化(例如&lt;D&gt;D&lt;/D&gt; becomes &lt;D&gt;India&lt;/D&gt;),那么我不需要为此创建第二个条目,而是需要单独更新该条目。
  • 在新问题中发布了我的确切查询-stackoverflow.com/questions/52476912/…
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多