2013-05-31 3 views
0

Xquery를 사용하여 XML 예제에서 표현 된 방식으로 원하는 모든 특성 값을 수정하는 방법?Xquery를 사용하여 모든 요소 특성 값 수정

저는 Basex 7.6 Xquery 및 XML 데이터베이스 엔진을 사용하고 있습니다. 지금까지 나의 목적은 XML 파일 만 처리하는 것이 었습니다.

구조를 이미 가지고 :

 <address ref="file1" title="title1"> 
     <address ref="file1.1" title="title1.1"> 
      <address ref="file1.1.1" title="title1.1.1"/> 
     </address> 
     <address ref="file1.2" title="title1.2"> 
      <address ref="file1.2.1" title="title1.2.1"/> 
      <address ref="file1.2.2" title="title1.2.2"> 
      <address ref="file1.2.2.1" title="title1.2.2.1"/> 
      <address ref="file1.2.2.2" title="title1.2.2.2"/> 
      </address> 
     </address> 
     </address> 
     <address ref="file2" title="title2"/> 

그러나 나는 다음과 같이 있어야합니다 :

 <address ref="mydir/file1" title="title1"> 
     <address ref="mydir/file1.1" title="title1.1"> 
      <address ref="mydir/file1.1.1" title="title1.1.1"/> 
     </address> 
     <address ref="mydir/file1.2" title="title1.2"> 
      <address ref="mydir/file1.2.1" title="title1.2.1"/> 
      <address ref="mydir/file1.2.2" title="title1.2.2"> 
      <address ref="mydir/file1.2.2.1" title="title1.2.2.1"/> 
      <address ref="mydir/file1.2.2.2" title="title1.2.2.2"/> 
      </address> 
     </address> 
     </address> 
     <address ref="mydir/file2" title="title2"/> 

내가 원했던 방식의 첫 번째 요소를 변경 관리해야하지만, 여전히 수 Xquery 엔진이 받아들이는 방식대로 올바르게 가져올 수 없습니다.

BaseX 7.6에서이 코드로 첫 번째 요소를 변경했으며이를 모든 요소에 적용하는 방법을 찾지 못했습니다. 나는이 문제를 내려고 노력했다 방식에 대해

 copy $c := 
       (<address ref="file1" title="title1"> 
        <address ref="file1.1" title="title1.1"> 
         <address ref="file1.1.1" title="title1.1.1"/> 
        </address> 
        <address ref="file1.2" title="title1.2"> 
         <address ref="file1.2.1" title="title1.2.1"/> 
         <address ref="file1.2.2" title="title1.2.2"> 
         <address ref="file1.2.2.1" title="title1.2.2.1"/> 
         <address ref="file1.2.2.2" title="title1.2.2.2"/> 
         </address> 
        </address> 
        </address> 
       (:<address ref="file2" title="title2"/> WHY IS THIS NOT BY THE WAY ACCEPTED?:) 

       ) 
       modify (
        replace value of node $c/@ref with concat('mydir/', $c/@ref) 
       ) 
       return $c 

정보는 여기에서 찾을 수 있습니다 : http://docs.basex.org/wiki/XQuery_Update#Non-Updating_Expressions

내가 BaseX이 작업을 수행하기위한 좋은 도구입니다 느낌이있다. 나는 그걸하는 법을 알아낼 수 없다. 나는 재귀가 어떻게 든이 경우에도 대답이라고 생각한다. 내 조그마한 경험이 없기 때문에 아직도 그것을 이해할 수 없다.

미리 감사드립니다.

답변

0

이 XML 데이터

copy $c := (<root> 
     <address ref="file1" title="title1"> 
     <address ref="file1.1" title="title1.1"> 
      <address ref="file1.1.1" title="title1.1.1"/> 
     </address> 
     <address ref="file1.2" title="title1.2"> 
      <address ref="file1.2.1" title="title1.2.1"/> 
      <address ref="file1.2.2" title="title1.2.2"> 
      <address ref="file1.2.2.1" title="title1.2.2.1"/> 
      <address ref="file1.2.2.2" title="title1.2.2.2"/> 
      </address> 
     </address> 
     </address> 
     <address ref="file2" title="title2"/> 
     </root>) 
    modify (
    for $e in $c//@ref 
    return replace value of node $e with concat('mydir/', $e) 
) 
    return $c 

두 번째 address 노드가 있기 때문에 정확히 하나의 루트 노드를 가져야 XML에서 작동하지 않습니다 각 ref 속성에 mydir/ 앞에 추가됩니다. 원하는 경우 시퀀스을 사용할 수 있습니다. 즉 (<address />, <address2 />)

+0

감사합니다. 나는 해결책에서 멀리 아니지만 여전히 마지막 킥이 필요하다는 것을 알았다. :) – sailfish