Я пытаюсь рекурсивно сгенерировать XML-документ стран, граничащих друг с другом в базе данных mondial. В документе должно быть указано, сколько границ вам нужно будет пересечь, чтобы добраться до страны, и общее количество пересеченных стран.
XML должен выглядеть так:
<from_swe_cross>
<cross num="1" sum="2">
<country>Finland</country>
<country>Norway</country>
</cross>
<cross num="2" sum="3">
<country>Russia</country>
</cross>
Я знаю, как составить список стран, в которые вы можете поехать, но не знаю, как правильно его отформатировать, и знаю, сколько было сделано пересечений границы или общее количество пересеченных стран.
Мой код сейчас:
declare function local:crossing($stack, $seen, $level, $sum) {
if(empty($stack)) then $seen
else (
let $country := $stack[1]
let $neighbors :=
for $code in $country/border/@country[not(. = $seen/@car_code)]
return $country/../country[@car_code = $code]
return local:crossing(($neighbors, $stack[position() > 1]), ($seen, $neighbors), $level + 1, $sum + count($neighbors))
)
};
<from_swe_cross>{
local:crossing(db:open('mondial')//country[@car_code = 'S'], db:open('mondial')//country[@car_code = 'S'], 1, 0)/name
}
</from_swe_cross>
Но в этом списке перечислены только те страны, в которые вы можете перейти, например:
<from_swe_cross>
<name>Albania</name>
<name>Greece</name>
<name>Macedonia</name>
<name>Serbia</name>
<name>Montenegro</name>
...
</from_swe_cross>
Как мне сгенерировать правильный XML?