2013-12-09 106 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 
)