user3819906
user3819906

Reputation: 1

xQuery recursive function/ nested for-loop (unbounded) - add elements at multiple level?

Is it possible to generate below output using xquery? output and input given below. Basically needs to add the element 'Level' with value(1, 1.1,1.2,1.2.3 etc) in the input xml which doesn't have the 'Level' element. There is no limit on the level, it can go up to any level.

Required output.

    <Root>
                    <Level>1</Level>
                    <Nodes>
                                    <Level>1.1</Level>
                                    <Param1>value1</Param1>
                                    <Param2>value2</Param2>
                    <Nodes>
                                    <Level>1.2</Level>
                                    <Param1>value5</Param1>
                                    <Param2>value7</Param2>
                                    <Nodes>
                                                    <Level>1.2.1</Level>
                                                    <Param1>value1</Param1>
                                                    <Param2>value8</Param2>
                                    </Nodes>
                    <Nodes>
                                    <Level>1.3</Level>
                                    <Param1>value3</Param1>
                                    <Param2>value6</Param2>
                                    <Nodes>
                                                    <Level>1.3.1</Level>
                                                    <Param1>value7</Param1>
                                                    <Param2>value9</Param2>
                                    </Nodes>
                                    <Nodes>
                                                    <Level>1.3.2</Level>
                                                    <Param1>value1</Param1>
                                                    <Param2>value8</Param2>
                                    </Nodes>
                    </Nodes>
                    </Nodes>
                    </Nodes> 
</Root>

Input

<Root>
                <Nodes>
                                <Param1>value1</Param1>
                                <Param2>value2</Param2>
                <Nodes>
                                <Param1>value5</Param1>
                                <Param2>value7</Param2>
                                <Nodes>
                                                <Param1>value1</Param1>
                                                <Param2>value8</Param2>
                                </Nodes>
                <Nodes>
                                <Param1>value3</Param1>
                                <Param2>value6</Param2>
                                <Nodes>
                                                <Param1>value7</Param1>
                                                <Param2>value9</Param2>
                                </Nodes>
                                <Nodes>
                                                <Param1>value1</Param1>
                                                <Param2>value8</Param2>
                                </Nodes>
                </Nodes>
                </Nodes>
                </Nodes>
</Root>

Upvotes: 0

Views: 501

Answers (1)

Cisco Java
Cisco Java

Reputation: 233

declare namespace xf = "http://tempuri.org/rb/";

declare function xf:injectLevel($node as element(), $plevel as xs:string, $clevel as xs:int) as element() 
{
    <Nodes>
      <Level>{ concat($plevel, '.', $clevel) }</Level>
      {$node/Param1}
      {$node/Param2}
      {
         for $cnodes at $pos1 in $node/Nodes
         return 
            xf:injectLevel($cnodes, concat($plevel, '.', $clevel) , xs:int($pos1))
      }
      </Nodes>
 };

 declare function xf:update($root as element()) as element() 
 {
    <root>
      <Level>1</Level>
      {
         for $Nodes at $pos in $root/Nodes
         return 
            xf:injectLevel($Nodes, xs:string(1), xs:int($pos))          
      }       
   </root>  
 };

 declare variable $root as element() external;

 xf:update($root)

Upvotes: 1

Related Questions