Форум Академгородка, Новосибирск > XSLt: предыдущий элемент в xsl:for-each
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: XSLt: предыдущий элемент в xsl:for-each
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование > WEB-программирование
Zebooka
Собственно суть проблемы:

Есть список персон. В цикле 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>

то выводится не предыдущий элемент, а элемент с позицией position() - 1 из оригинального ХМЛ без сортировки.

ЗЫ: В догонку вопрос номер два: Есть ли способ средствами ТОЛЬКО xml + xslt подгружать другие xmlки. Причем по параметру? (Т.е. ссылка на другую персону, и по ID нужно ее из такого файла подгрузить и вывести имя). JS не предлагать. Через JS я и сам умею smile.gif
Zebooka
Проблема решена след. образом:

Код
<xsl:key name="mytree_key_letter" match="/Tree/PersonsIndex/Person" use="substring(./@name, 1, 1)" />

<xsl:template name="mytree_personlist">
<xsl:param name="list" />
    <hr/>
    <xsl:for-each select="$list/Person[generate-id()=generate-id(key('mytree_key_letter', substring(./@name, 1, 1)))]">
        <xsl:sort select="./@name" data-type="text" order="ascending" />
        <xsl:value-of select="substring(./@name, 1, 1)" />
        <br/>
        <xsl:for-each select="key('mytree_key_letter', substring(./@name, 1, 1))">
            <xsl:sort select="./@name" data-type="text" order="ascending" />
            <xsl:value-of select="./@name" />
            <br/>    
        </xsl:for-each>
    </xsl:for-each>
    <hr/>
</xsl:template>
Zebooka
Вот с document косяк. Если документа нету, то все срубается. Похоже в XSL 1.0 нету способа проверить есть ли файл и не вызвать исключение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.