2014-01-13 1 views
4

내가 가진 노드가 자식 노드에 textchild node 변환 텍스트가 포함 된 경우 의미 모든 노드가이 문서를 변환하는 방법xquery update를 사용하여 노드 내부의 텍스트를 자식 노드로 변환하는 방법은 무엇입니까?

<root> 
    <first> 
    First Level 
    <second> 
     second level 
     <third> 
     Third Level 
     </third> 
    </second> 
    <second2> 
     another second level 
    </second2> 
    </first> 
</root> 

같은 XML 문서는 XQuery 업데이트를 사용 (의이 childtext 말을하자)

<root> 
    <first> 
    <childtext>First Level</childtext> 
    <second> 
     <childtext>second level</childtext> 
     <third> 
     Third Level 
     </third> 
    </second> 
    <second2> 
     another second level 
    </second2> 
    </first> 
</root> 

그리고 여기 내가 뭘하려 :

let $a := 
<root> 
    <first> 
    First Level 
    <second> 
     second level 
     <third> 
     Third Level 
     </third> 
    </second> 
    <second2> 
     another second level 
    </second2> 
    </first> 
</root> 
return 
copy $i := $a 
modify (
    for $x in $i/descendant-or-self::* 
    return (
    if($x/text() and exists($x/*)) then (
     insert node <childtext> 
     {$x/text()} 
     </childtext> as first into $x 
     (: here should be some code to delete the text only:) 
    ) else() 
) 
) 
return $i 

형제 노드가있는 텍스트를 삭제할 수 없습니다.

+0

먼저 값 text()를 사용하여 노드 "childtext"를 만들 수 있습니다. 이제는 여전히 오래된 텍스트를 삭제해야합니다.>이 텍스트 만 삭제할 수 없습니다. 값을 비우려면 다른 자식 노드도 제거해야합니다. 달러 (A $)하자 : ((=이 $ A 수정 $ $의 I/하위 - 또는 - 자체 :: * 대가로 x의 을 = .... 반환 복사 $ 난 내가하려고 여기에서 –

+0

경우 ($ X/텍스트()와 존재 ($ X/*)) 다음 ( 삽입 노드 {$ X/텍스트()}로 처음 $의 X에 , (: 여기 어떻게 든이 삭제해야 다음 단계로 텍스트 또는 업데이트 : ) 다른 ( ) ) 는) $ 내가 –

+0

질문 (의 헥타르에이 코드를 수정하십시오 반환 여기에서 읽을 수 있음), 코드의 일부를 생략하지 않으므로 더 이상 실행되지 않습니다 ('let $ a : = ....'는 작동 코드가 아닙니다). 현재 코드에 어떤 문제점이 있습니까? –

답변

3

요소를 바꾸려면 새 요소를 삽입하고 이전 요소를 삭제하는 대신 replace 구문을 사용하면됩니다. 나에게 훨씬 간단 같다 :

copy $i := $a 
modify (
    for $x in $i/descendant-or-self::* 
    return (
    if($x/text() and exists($x/*)) then (
     if(count($x/text())=1) then (
     replace node $x/text() with <child> {$x/text()}</child> 
    ) else (
     for $j at $pos in 1 to count($x/text()) 
     return 
     replace node $x/text()[$pos] with <child>{$x/text()[$pos]}</child> 

    ) 


    ) else() 
) 
) 
return $i 

다시 한번 감사 :

copy $i := $a 
modify (
    for $x in $i/descendant-or-self::*[exists(*)]/text() 
    return replace node $x with <childtext>{$x}</childtext> 
) 
return $i 
+0

예 예, 그게 내가 정말로 원했던 것입니다 :-) 감사합니다 @dirkk :-) –

+0

안녕하세요 Dirkk 그것은 하나의 텍스트()에 대해 작동합니다. 즉, ab ab과 같이 작동하지 않습니다. 그것을 해결하는 방법. –

+1

@PrakashThapa 나는 당신의 해결책을 보았지만 나는 나의 대답을 편집했다. 나의 업데이트 된 답변은 일반적으로 이전처럼 (조건을 조건문에 'for'문으로 직접 입력하는 것보다) 더 좋으며이 방법으로 여러 개의 'text()'요소를 존중합니다.나는이 솔루션을 매우 선호 할 것이고, 더 읽기 쉽고 더 좋은 성능을 제공한다. – dirkk

0

수정 된 솔루션은 여기 @dirkk에서입니다.

관련 문제