2017-12-26 28 views
1

'CNode3'의 자식 요소 ('CCNode1')가 'CCValue1'일 때마다 'CNode3'에서 'ChangedNode3'으로 노드 이름을 변경하는 xquery를 만들려고합니다.Xquery를 통한 노드 이름 변경

<PNode> 
    <CNode1>Node1</CNode1> 
    <CNode2>Node2</CNode2> 
    <CNode3> 
    <CCNode1>CCValue1</CCNode1> 
    <CCNode2>CCValue2</CCNode2> 
    </CNode3> 
    <CNode3> 
    <CCNode1>CCValue3</CCNode1> 
    <CCNode2>CCValue4</CCNode2> 
    </CNode3></PNode> 

이 시나리오에서는 많은 도움을 얻지 못했습니다. 나는 아래 링크를 체크했으나 모든 'CNode3'의 이름을 'ChangedNode3'으로 바꾼다. PFB 링크 : http://www.xqueryfunctions.com/xq/functx_change-element-names-deep.html

답변

1

functx:change-element-names-deep() 함수는 요소 이름 만 평가합니다. 좀 더 사용자 정의가 필요합니다.

당신은 로컬 함수에서 typeswitch를 사용할 수 있습니다

declare function local:transform($nodes as node()*) as item()* { 
    for $node in $nodes 
    return 
     typeswitch($node) 
      case text() return $node 
      case comment() return $node 
      case attribute() return $node 
      case processing-instruction() return $node 
      case element(CNode3) 
       return 
       if ($node[CCNode1 eq "CCValue1"]) then 
        element ChangedNode3 {($node/@*, local:transform($node/node()))} 
       else 
        element {name($node)} {($node/@*, local:transform($node/node()))} 
      case element() 
       return element {name($node)} {($node/@*, local:transform($node/node()))} 
      default return local:transform($node/node()) 
}; 

typeswitch transformation pattern에 대한 자세한 설명을.