2013-12-09 48 views
3

下面是XML结构。它是我原始结构的标本,不是确切的。XQuery不插入子节点

<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 - 版本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>。有人可以帮助我吗?

回答

3

您面临的问题与XQuery更新的本质有关。它使用挂起的更新列表并在查询结束时应用所有更新。更新操作的顺序已被很好地定义,因此与您在更新声明中给出的顺序无关。请参阅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 
)