Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<xsl:for-each select="categories/category" >
<xsl:sort order="ascending" select="@title"/>
...
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" />
<xsl:template match="categories">
<select>
<xsl:apply-templates select="descendant::category" />
</select>
</xsl:template>
<xsl:template match="category">
<option value="{@id}">
<xsl:call-template name="pad_string">
<xsl:with-param name="size" select="count(ancestor::category)"/>
</xsl:call-template>
<xsl:value-of select="@title"/>
</option>
</xsl:template>
<xsl:template name="pad_string">
<xsl:param name="space" select="'  '"/>
<xsl:param name="size" select="number(0)"/>
<xsl:if test="$size">
<xsl:value-of select="$space"/>
<xsl:call-template name="pad_string">
<xsl:with-param name="space" select="$space"/>
<xsl:with-param name="size" select="$size - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
count(ancestor::category). А шаблон pad_string постоянно вызывает сам себя, снижая количесво отступов.
<xsl:template match="/">
<select>
Корневая категория
<xsl:apply-templates select="categories/category">
<xsl:with-param name="space" select = "'--'" />
</xsl:apply-templates>
</select>
</xsl:template>
<!-- Общий шаблон -->
<xsl:template match="categories/category">
<xsl:param name="space"/>
<option value="{@id}">
<xsl:value-of select="$space" />
<xsl:value-of select="@title"/>
</option>
<xsl:value-of select="concat($space, @title)"/>
<xsl:apply-templates select="categories/category">
<xsl:with-param name="space" select="concat($space, '--')" />
</xsl:apply-templates>
</xsl:template>
<!-- Персональный шаблон -->
<xsl:template match="categories/category[@title = 'AMD']">
<xsl:param name="space"/>
<option value="{@id}">
<xsl:value-of select="$space" />
<xsl:value-of select="@title"/> (sic!)
</option>
<xsl:value-of select="concat($space, @title)"/>
<xsl:apply-templates select="categories/category">
<xsl:with-param name="space" select="concat($space, '--')" />
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>

Дерево в выпадающем списке средствами XSLT