Все это смахивает на какое-то шаманство

Где собственно отделение логики от контента???

))))
Чем дальше тем больше понимаешь что мы просто перетаскиваем часть кода из PHP или PERL в шаблонные правила XSLT. Дизайнеру там делать нечего

)
А еще к слову что XSLT не сложнее HTML отвечу на собственный вопрос по поводу группировки по трем значениям (подсказали умные люди на форуме). Тоесть создание древовидного меню с уникальными значениями:
Входной XML
Код:

<menu>
<item category="Рафтинг" country="Украина" namen="Днестр"/>
<item category="Рафтинг" country="Россия" namen="Карелия"/>
<item category="Рафтинг" country="Россия" namen="Байкал"/>
<item category="Треккинг" country="Украина" namen="Днестр"/>
<item category="Рафтинг" country="Россия" namen="Карелия"/>
<item category="Рафтинг" country="Россия" namen="Карелия"/>
<item category="Спелео" country="Россия" namen="Алтай"/>
<item category="Рафтинг" country="Украина" namen="Черемош"/>
</menu>
XSLT:
Код:

<xsl:key name="category" match="item" use="@category"/>
<xsl:key name="country" match="item" use="concat(@category,'-',@country)"/>
<xsl:key name="name" match="item" use="concat(@category,'-',@country,'-',@namen)"/>
<xsl:template match="menu">
<list><xsl:text>
</xsl:text>
<xsl:apply-templates select="item[generate-id(.) = generate-id(key('category',@category))]"/>
</list>
</xsl:template>
<xsl:template match="item">
<category name="{@category}"><xsl:text>
</xsl:text>
<xsl:for-each select="key('category',@category)">
<xsl:variable name='country' select="key('country', concat(@category,'-',@country))"/>
<xsl:if test="generate-id(.) = generate-id($country)">
<country name="{@country}"><xsl:text>
</xsl:text>
<xsl:apply-templates select='$country' mode='country'/>
</country><xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</category><xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match='item' mode='country'>
<xsl:variable name='name' select="key('name', concat(@category,'-',@country,'-',@namen))"/>
<xsl:if test="generate-id(.) = generate-id($name)">
<item name='{@namen}'/><xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
Выход:
Код:

<category name="Рафтинг и сплавы">
<country name="Украина">
<item name="Днестр"></item>
<item name="Черемош"></item>
<item name="Тиса"></item>
<item name="Черный Черемош"></item>
<item name="Южный Буг"></item>
<item name="Десна"></item>
<item name="Рось"></item>
<item name="Северский Донец"></item>
</country>
<country name="Россия">
<item name="Карелия"></item>
<item name="Байкал"></item>
<item name="Алтай"></item>
<item name="Кавказ"></item>
<item name="Урал"></item>
</country>
</category>
...
Глаза сломать тут можно точно.

Но хочу вам сказать что лучше рыться в этом, чем в бесчисленных шаблонах разнообразных шаблонизаторов.