В основном вопрос об использовании for-each
вместо шаблонов сводится к созданию повторно используемых, более общих преобразований.
Используя шаблоны, все подходящие узлы - не только те, которые явно используются в for-each - могутВоспользуйтесь шаблоном, который помогает избежать дублирования кода и в то же время разбивает лист на более мелкие блоки, которыми легче управлять.На самом деле это почти то же самое, что иметь огромную процедуру или меньшие процедуры, вызывающие друг друга в императивном программировании.
Хотя некоторые люди предполагают, что использование шаблонов может работать лучше в некоторых движках, я считаю, что это не будетдействительно имеет значение.
Тем не менее, вы можете узнать о muenchian методе (который использует ключи) для фактической группировки данных, где у вас есть повторяющиеся ключи.Использование оси preceding-sibling
очень медленное на некоторых двигателях, поэтому лучше избегать этого, когда это не обязательно.
Что-то вроде этого должно помочь при делениях (не проверено):
<xsl:key name="divisions" match="/CheckedOutBoxes/row/Division" use="." />
...
<xsl:apply-templates mode="Division" select="/CheckedOutBoxes/Division[generate-id(.)=generate-id(key('divisions', .))]" />