declare function local:overlap($manager, $tstart,$tend) { if (xs:date($manager/@tstart) <= xs:date($tstart) and xs:date($manager/@tend) >= xs:date($tend)) then ( element mgrno { attribute tstart{$tstart}, attribute tend{$tend}, $manager/text() }) else if (xs:date($manager/@tstart) <= xs:date($tstart) and (xs:date($manager/@tend)) >= xs:date($tstart) and (xs:date($manager/@tend)) <= xs:date($tend)) then ( element mgrno { attribute tstart{$tstart}, attribute tend{$manager/@tend}, $manager/text() }) else if (($manager/xs:date(@tend) >= xs:date($tend)) and ($manager/xs:date(@tstart) >= xs:date($tstart)) and ($manager/xs:date(@tstart) <= xs:date($tend))) then ( element mgrno { attribute tstart{$manager/@tstart}, attribute tend{$tend}, $manager/text() } ) else if (($manager/xs:date(@tstart) >= xs:date($tstart)) and ($manager/xs:date(@tend) <= xs:date($tend))) then ( element mgrno { attribute tstart{$manager/@tstart}, attribute tend{$manager/@tend}, $manager/text() } ) else () }; declare function local:get_all(){ for $r in doc("v-depts.xml")/departments/department let $k := for $m in $r/mgrno return local:overlap($m, '1994-05-06', '9995-05-06') where exists($k) return element event{$r/deptno, $k} }; let $data := local:get_all() return $data