XQuery没有插入子节点

时间:2013-12-09 05:58:57

标签: xquery basex

以下是XML结构。它是我原始结构的标本,而不是确切的结构。

<Docs>
  <Doc>
   <Para>
      <P n="1"><B>Constants : T</B>he value of pi is 3.14</P>
      <P n="2">pi is a geometric term.</P>
   </Para>
  </Doc>
  <Doc>
   <Para>
     <P n="1"><B>Constants : T</B>he value of g is 9.81 m/sqr of sec</P>
     <P n="2">g is a acceleration due to gravity.</P>
   </Para>
  </Doc>
  <Doc>
    <Para>
      <P n="1"><B>Constants : T</B>he value of c is 3.00 x 10 power 8 m/sec</P>
      <P n="2">c is a speed of light in vacuum.</P>
    </Para>
  </Doc>
</Docs>

我已经以编程方式生成了XML文件。 B节点的数据为Constant : T,其中只有Constants :。我编写了一个XQuery来进行必要的更改,但它没有按预期工作。

下面是XQuery - Version 1

for $x in doc('doc1')//Doc
where $x/Para/P[@n="1"]/B/text()="Constants : T"

return
let $p := $x/Para/P[@n="1"]
let $pText := concat("T", $p/text())
let $tag := <P n="1">{$pText}</P>

return
(
delete node $p,
insert node $tag as first into $x/Para,
insert node <B>Constants :</B> as first into $x/Para/P[@n="1"]  
)

版本 - 2(更小,更甜,但不工作!!!)

let $b := <B> Constants :</B>
for $x in doc('doc1')//Doc/Para[P[@n="1"]/B/text()="Constants : T"]/P[@n="1"]

return
(
 replace value of node $x with concat("T", $x/text()),
 insert node $b/node() as first into $x
)

两个查询都没有插入<B>Constants : </B>。有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

您面临的问题与XQuery更新的本质有关。它使用挂起的更新列表,并在查询结束时应用所有更新。更新操作的顺序已明确定义,因此与您在update语句中提供的顺序无关。请参阅https://docs.basex.org/wiki/Updates#Pending_Update_List上的更多信息。

因此,在您的情况下,在insert之前应用replace,因此您实际上正在替换刚刚插入的节点,从而覆盖此更改。

要解决此问题,我只需替换文本值并替换B节点。因此,您的两个操作都是独立的,并且可以毫无问题地更改它们的执行顺序。

let $b := <B> Constants :</B>
for $x in doc('doc1')//Doc/Para[P[@n="1"]/B/text()="Constants : T"]/P[@n="1"]

return
(
    replace value of node $x/text() with concat("T", $x/text()),
    replace node $x/B with $b
)