2013-12-09 3 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에서 추가 정보를 참조하십시오.

따라서 insertreplace 전에 적용되므로 실제로 삽입 된 노드를 실제로 대체하므로이 변경 사항을 덮어 씁니다.

이 문제를 해결하려면 텍스트 값을 바꾸고 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 
) 
관련 문제