Привет, У меня есть проблема, требующая довольно специализированной сортировки и хотелось бы получить обратную связь по наилучшему подходу. Вот некоторые XML:Пользовательская группировка в xsl
<root>
<locations>
<location>
<address>123 4 st Smallville</address>
<number>1</number>
</location>
<location>
<address>432 1 st Metropolis</address>
<number>2</number>
</location>
</locations>
<insuranceCoverages>
<coverage>
<name>General Coverage</name>
<locationSplits>
<coverage>
<name>Building Coverage</name>
<locationNumber>1</locationNumber>
<clauses>
<coverage>
<name>Earthquake Exclusion</name>
</coverage>
</clauses>
</coverage>
</locationSplits>
</coverage>
<coverage>
<name>General Liability</name>
</coverage>
</insuranceCoverages>
</root>
Что я хотел бы сделать, это групповые охваты от места в довольно плоскую иерархию. Что-то вроде:
┌Location 1
├┬Coverage "Building Coverage"
│└Coverage "Earthquake Exclusion"
├Location 2
├No Location
├┬Coverage "General Coverage"
│└Coverage "General Liability"
моего текущего решения использует шаблон на места/месте и перечисляет список покрытий, которые ищут номер места, которое соответствует текущему местоположению. Однако, поскольку этот алгоритм перебирает все охваты для каждого места, это
O(nm)
where n = # locations + 1
m = # coverages
Я бы предпочел, если мой алгоритм может быть оптимизирован для обхода дерева покрытий только один раз, помещая каждое покрытие в виде набора на основе текущего местоположения себя или своих предков, а затем распечатывать эти наборы.
O(n)
where n = # coverages
Конечно, если есть более эффективные способы выражения этого с помощью XSL (возможно с XSL: для-каждой группы инструкции) мне было бы интересно услышать о том, что слишком.
Я хотел бы добавить, что я использую версию xslt 2.0, но могу свободно использовать любую версию. – eisenpony