declare function local:getRelated20s($item) { let $nextItem := $item/following-sibling::*[local-name()!="record_20" and local-name()!="record_30"][1] for $related in $item/following-sibling::*[local-name()="record_20"] where if($nextItem) then $related << $nextItem else true() return $related }; declare function local:getRelated30s($item) { let $nextItem := $item/following-sibling::*[local-name()!="record_30"][1] for $related in $item/following-sibling::*[local-name()="record_30"] where if($nextItem) then $related << $nextItem else true() return $related }; { for $record_10 in doc('converter:file:///c:/test.conv?http://www.stylusstudio.com/SSDN/upload/SampleInput.TXT')/root/record_10 return {$record_10/customer_id/text()} {$record_10/lastname/text()} {$record_10/firstname/text()} { for $record_20 in local:getRelated20s($record_10) return {$record_20/account_id/text()} { for $record_30 in local:getRelated30s($record_20) return {$record_30/value/text()} } } }