Есть список персон. В цикле xsl:for-each он сортируется по имени а алфавитном порядке. Но надо еще озаглавить каждый раздел. Раздел - это фамилии на 1 букву. Т.е. допустим у нас есть люди на Б, Ж и Я. Вот надо перед фамилиями на Б вывести большую букву Б, перед Ж - Ж и перед Я - Я.
Б
Бананов
Баранкин
Бубнов
Ж
Жуков
Я
Ямов
Решение мне кажется таким: (поправьте если есть проще)
Смотрим предыдущий элемент и если первая буква другая, то выводим первую букву у текущего элемента.
Проблема в том, что вроде нет "предыдущего" элемента. (мб я слепой?) Есть position(), но если сделать так:
Код
<xsl:template name="personlist">
<xsl:param name="list" />
<xsl:for-each select="$list/Person">
<xsl:sort select="./@name" data-type="text" order="ascending" />
<xsl:variable name="prev" select="position() - 1" />
Prev: <xsl:value-of select="../Person[$prev]/@name" />
Curr: <xsl:value-of select="./@name" />
<br/>
</xsl:for-each>
</xsl:template>
<xsl:param name="list" />
<xsl:for-each select="$list/Person">
<xsl:sort select="./@name" data-type="text" order="ascending" />
<xsl:variable name="prev" select="position() - 1" />
Prev: <xsl:value-of select="../Person[$prev]/@name" />
Curr: <xsl:value-of select="./@name" />
<br/>
</xsl:for-each>
</xsl:template>
то выводится не предыдущий элемент, а элемент с позицией position() - 1 из оригинального ХМЛ без сортировки.
ЗЫ: В догонку вопрос номер два: Есть ли способ средствами ТОЛЬКО xml + xslt подгружать другие xmlки. Причем по параметру? (Т.е. ссылка на другую персону, и по ID нужно ее из такого файла подгрузить и вывести имя). JS не предлагать. Через JS я и сам умею