Reputation: 1
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.
<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>
<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
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