кто знает как сделать???
От: hooper11  
Дата: 14.04.05 09:27
Оценка:
Необходимо вывести постраничный список авторов, отсортированных по количеству написанных книг.
Под именем автора должен быть список книг, в написании которых учавствовал текущий автор.
На странице может быть не более 6 книг.
Книга, которая не попала на текущую страницу должна перейти на следующую страницу вместе с именем автора.
Авторы, которые не учавствовали в написании книг, присутствовать в списке не должны.
Количество книг на странице нужно вынести в глобальную переменную.

Например:

PAGE 1

author 1
***********************
book 1
book 4
book 7
book 9
book 10
***********************

author 3
***********************
book 1
***********************

PAGE 2

author 3
***********************
book 2
book 6
book 8
book 9
***********************

author 6
***********************
book 1
book 6

и т.д.

вот xml файл
<?xml-stylesheet type="text/xsl" href="D:\vano\qqq\xml_done\books1.xsl"?>
<root xmlns="http://www.epam.com/ROOTNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epam.com/ROOTNS
root.xsd">
<books xmlns="http://www.epam.com/BOOKSNS">
<book id="b1">
<name>book 1</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a1"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a3"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a6"/>
</book>
<book id="b2">
<name>book 2</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a2"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a3"/>
</book>
<book id="b3">
<name>book 3</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a5"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a8"/>
</book>
<book id="b4">
<name>book 4</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a9"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a1"/>
</book>
<book id="b5">
<name>book 5</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a9"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a7"/>
</book>
<book id="b6">
<name>book 6</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a6"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a3"/>
</book>
<book id="b7">
<name>book 7</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a1"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a4"/>
</book>
<book id="b8">
<name>book 8</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a3"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a5"/>
</book>
<book id="b9">
<name>book 9</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a1"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a3"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a6"/>
</book>
<book id="b10">
<name>book 10</name>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a1"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a2"/>
<author_reference xmlns="http://www.epam.com/AUTHORSNS" author_id="a6"/>
</book>
</books>
<authors xmlns="http://www.epam.com/AUTHORSNS">
<author id="a1">
<name>author 1</name>
</author>
<author id="a2">
<name>author 2</name>
</author>
<author id="a3">
<name>author 3</name>
</author>
<author id="a4">
<name>author 4</name>
</author>
<author id="a5">
<name>author 5</name>
</author>
<author id="a6">
<name>author 6</name>
</author>
<author id="a7">
<name>author 7</name>
</author>
<author id="a8">
<name>author 8</name>
</author>
<author id="a9">
<name>author 9</name>
</author>
<author id="a10">
<name>author 10</name>
</author>
</authors>
</root>


вот что я наваял не могу сделать счетчик чтобы выводилось как в примере

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:root="http://www.epam.com/ROOTNS" xmlns:books="http://www.epam.com/BOOKSNS" xmlns:authors="http://www.epam.com/AUTHORSNS" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="root:root">
<xsl:apply-templates select="authors:authors"/>
</xsl:template>
<xsl:template match="authors:authors">
<xsl:apply-templates select="authors:author">
<xsl:sort order="descending" select="count (//books:books/books:book [authors:author_reference/@author_id = current ()/@id])"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="authors:author">
<xsl:if test="//books:books/books:book [authors:author_reference/@author_id = current ()/@id]">
<h1>
<xsl:value-of select="authors:name"/>
</h1>
<xsl:apply-templates select="//books:books/books:book [authors:author_reference/@author_id = current ()/@id]"/>
</xsl:if>
</xsl:template>
<xsl:template match="books:book">
<xsl:value-of select="books:name"/>
<br/>
</xsl:template>
</xsl:stylesheet> помогите плз или хотя бы подскажите в каком направлнии двигаться. Заранее блогодарен
Re: кто знает как сделать???
От: Lloyd Россия  
Дата: 14.04.05 09:34
Оценка:
Здравствуйте, hooper11, Вы писали:

H>Необходимо вывести постраничный список авторов, отсортированных по количеству написанных книг.

H>Под именем автора должен быть список книг, в написании которых учавствовал текущий автор.
H>На странице может быть не более 6 книг.
H>Книга, которая не попала на текущую страницу должна перейти на следующую страницу вместе с именем автора.
H>Авторы, которые не учавствовали в написании книг, присутствовать в списке не должны.
H>Количество книг на странице нужно вынести в глобальную переменную.

Похоже, за один проход такое не сделать. Вечером поковыряюсь, может накидаю чего.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re: кто знает как сделать???
От: don_Kabanos Россия  
Дата: 14.04.05 11:30
Оценка:
Здравствуйте, hooper11, Вы писали:

H>Необходимо вывести постраничный список авторов, отсортированных по количеству написанных книг.

H>Под именем автора должен быть список книг, в написании которых учавствовал текущий автор.
H>На странице может быть не более 6 книг.
H>Книга, которая не попала на текущую страницу должна перейти на следующую страницу вместе с именем автора.
H>Авторы, которые не учавствовали в написании книг, присутствовать в списке не должны.
H>Количество книг на странице нужно вынести в глобальную переменную.

Вобщем, для затравки.


1. Организовываем рекурсию №1 по страницам (условие выхода из нее количесвто_строк_на_странице > $заданного_в_глобальной_переменной).
Таскаем с собой переменные: текущее_количество_строк, текущий_автор


2. Внутри рекурсии №1 можно запустить рекурсию №2, котороя крутится по автору
Таскаем с собой переменные: текущий_автор, номер_текущей_книги, количество_книг_данного_автора


Вот и все. При входе в рекурсию №1 проверять начали ли мы новую страницу и если да, то смотреть, продолжаем ли мы список книг данного автора или начинаем нового.


Все довольно просто, за исключением того, что нужно аккуратненько таскать в рекурсивные шаблоны все нужные значения переменных и ничего не потерять.
Ah! The infinite wonders of Abyss! If there's anything you don't like — you'll find it here. (c) Tanar'ri saying
Re[2]: кто знает как сделать???
От: don_Kabanos Россия  
Дата: 14.04.05 11:34
Оценка:
Здравствуйте, don_Kabanos, Вы писали:

_K>Здравствуйте, hooper11, Вы писали:


H>>Необходимо вывести постраничный список авторов, отсортированных по количеству написанных книг.

H>>Под именем автора должен быть список книг, в написании которых учавствовал текущий автор.
H>>На странице может быть не более 6 книг.
H>>Книга, которая не попала на текущую страницу должна перейти на следующую страницу вместе с именем автора.
H>>Авторы, которые не учавствовали в написании книг, присутствовать в списке не должны.
H>>Количество книг на странице нужно вынести в глобальную переменную.

_K>Вобщем, для затравки.



_K>1. Организовываем рекурсию №1 по страницам (условие выхода из нее количесвто_строк_на_странице > $заданного_в_глобальной_переменной).

_K>Таскаем с собой переменные: текущее_количество_строк, текущий_автор


_K>2. Внутри рекурсии №1 можно запустить рекурсию №2, котороя крутится по автору

_K>Таскаем с собой переменные: текущий_автор, номер_текущей_книги, количество_книг_данного_автора


_K>Вот и все. При входе в рекурсию №1 проверять начали ли мы новую страницу и если да, то смотреть, продолжаем ли мы список книг данного автора или начинаем нового.



_K>Все довольно просто, за исключением того, что нужно аккуратненько таскать в рекурсивные шаблоны все нужные значения переменных и ничего не потерять.




кстати, данный подход удобен тем, что задача разбивается на 2 этапа. Сначала просто разбить весь этот список по страницам, а потом внедрить логику "какого автора писать в начале страницы"
Ah! The infinite wonders of Abyss! If there's anything you don't like — you'll find it here. (c) Tanar'ri saying
Re[2]: кто знает как сделать???
От: Lloyd Россия  
Дата: 14.04.05 13:31
Оценка:
Здравствуйте, don_Kabanos, Вы писали:

_K>Все довольно просто, за исключением того, что нужно аккуратненько таскать в рекурсивные шаблоны все нужные значения переменных и ничего не потерять.


Все было бы просто, если бы не сортировка по кол-ву книг в написании которых автор принимал участие.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re[3]: кто знает как сделать???
От: don_Kabanos Россия  
Дата: 14.04.05 15:28
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, don_Kabanos, Вы писали:


_K>>Все довольно просто, за исключением того, что нужно аккуратненько таскать в рекурсивные шаблоны все нужные значения переменных и ничего не потерять.


L>Все было бы просто, если бы не сортировка по кол-ву книг в написании которых автор принимал участие.



Слоненка я и не приметил... ну, ничего...

как я понял, проблемя в том, чтобы организовать счетчик строк, обрабатывая отсортированных авторов... можно исхитриться так (чисто набросок):



<xsl:template name="крутилка_авторов">
<xsl:param name="счетчик_строк"/>
<xsl:param name="текущий автор"/>

<xsl:if test=""><!-- для антизацикливания -->

<!-- Крутилка авторов -->
<xsl:for-each select="">
<xsl:sort /> <!-- Сортировка их как надо -->
<!-- Проверка текущего ли автора обрабатываем -->
<xsl:if test="">
    <xsl:call-template name="отрисовка одной строки">
        <!-- нужные параметры -->
    </xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:template>

<xsl:template name="отрисовка одной строки">
<!-- отрисовка -->
<xsl:call-template name="крутилка_авторов">
    <xsl:param name="счетчик_строк"/>
    <xsl:param name="текущий автор"/>
</xsl:call-template>
</xsl:template>



Надеюсь, нигде не лоханулся. Есть маза, что в template name="отрисовка одной строки" потребуется вставить антизацикливающий if

ну, всегда зная текущего автора и имея счетчик строк — думаю, можно все налабать
Ah! The infinite wonders of Abyss! If there's anything you don't like — you'll find it here. (c) Tanar'ri saying
Re[4]: кто знает как сделать???
От: don_Kabanos Россия  
Дата: 14.04.05 15:34
Оценка:
_K>
_K><xsl:template name="крутилка_авторов">
_K><xsl:param name="счетчик_строк"/>
_K><xsl:param name="текущий автор"/>

_K><xsl:if test=""><!-- для антизацикливания -->

_K><!-- Крутилка авторов -->
_K><xsl:for-each select="">
_K><xsl:sort /> <!-- Сортировка их как надо -->
_K><!-- Проверка текущего ли автора обрабатываем -->
_K><xsl:if test="">
_K>    <xsl:call-template name="отрисовка одной строки">
_K>        <!-- нужные параметры -->
_K>    </xsl:call-template>
_K></xsl:if>
_K></xsl:for-each>
_K></xsl:if>
_K></xsl:template>

_K><xsl:template name="отрисовка одной строки">
_K><!-- отрисовка -->
_K><xsl:call-template name="крутилка_авторов">
_K>    <xsl:param name="счетчик_строк"/>
_K>    <xsl:param name="текущий автор"/>
_K></xsl:call-template>
_K></xsl:template>
_K>


в этоv for-each использовать переменную текущий автор, чтобы нужный автор всегда был первым в списке. тогда даже вложенный if не потребуется
Ah! The infinite wonders of Abyss! If there's anything you don't like — you'll find it here. (c) Tanar'ri saying
Re[4]: кто знает как сделать???
От: Lloyd Россия  
Дата: 14.04.05 15:36
Оценка:
Здравствуйте, don_Kabanos, Вы писали:

_K>Слоненка я и не приметил... ну, ничего...


_K>как я понял, проблемя в том, чтобы организовать счетчик строк, обрабатывая отсортированных авторов... можно исхитриться так (чисто набросок):



А ты напиши. Мне тоже показалось что не проблема будет, но как-то не вышло сходу.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re[5]: кто знает как сделать???
От: don_Kabanos Россия  
Дата: 15.04.05 06:14
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, don_Kabanos, Вы писали:


_K>>Слоненка я и не приметил... ну, ничего...


_K>>как я понял, проблемя в том, чтобы организовать счетчик строк, обрабатывая отсортированных авторов... можно исхитриться так (чисто набросок):



L>А ты напиши. Мне тоже показалось что не проблема будет, но как-то не вышло сходу.



http://www.rsdn.ru/Forum/Message.aspx?mid=1125501&amp;only=1
Автор: don_Kabanos
Дата: 14.04.05
в том наброске это реализовано. Там вся фишка в том, чтобы тащить параметр из for-each через промежуточный шаблон
Ah! The infinite wonders of Abyss! If there's anything you don't like — you'll find it here. (c) Tanar'ri saying
Re[6]: кто знает как сделать???
От: Lloyd Россия  
Дата: 15.04.05 08:07
Оценка:
Здравствуйте, don_Kabanos, Вы писали:

_K>http://www.rsdn.ru/Forum/Message.aspx?mid=1125501&amp;only=1
Автор: don_Kabanos
Дата: 14.04.05
в том наброске это реализовано. Там вся фишка в том, чтобы тащить параметр из for-each через промежуточный шаблон


Да ты не набросок, а готовый xsl выложи. Мне тоже поначалу показалось, что все просто, но когда начал писать ....
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re[7]: кто знает как сделать???
От: don_Kabanos Россия  
Дата: 15.04.05 10:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, don_Kabanos, Вы писали:


_K>>http://www.rsdn.ru/Forum/Message.aspx?mid=1125501&amp;only=1
Автор: don_Kabanos
Дата: 14.04.05
в том наброске это реализовано. Там вся фишка в том, чтобы тащить параметр из for-each через промежуточный шаблон


L>Да ты не набросок, а готовый xsl выложи. Мне тоже поначалу показалось, что все просто, но когда начал писать ....



Постараюсь... просто у меня предотпускная пятница...
Ah! The infinite wonders of Abyss! If there's anything you don't like — you'll find it here. (c) Tanar'ri saying
Re[8]: кто знает как сделать???
От: hooper11  
Дата: 15.04.05 12:20
Оценка:
Здравствуйте, don_Kabanos, Вы писали:

_K>Здравствуйте, Lloyd, Вы писали:


L>>Здравствуйте, don_Kabanos, Вы писали:


_K>>>http://www.rsdn.ru/Forum/Message.aspx?mid=1125501&amp;only=1
Автор: don_Kabanos
Дата: 14.04.05
в том наброске это реализовано. Там вся фишка в том, чтобы тащить параметр из for-each через промежуточный шаблон


L>>Да ты не набросок, а готовый xsl выложи. Мне тоже поначалу показалось, что все просто, но когда начал писать ....



_K>Постараюсь... просто у меня предотпускная пятница...



если у вас получиться это сделать буду очень благодарен, потому что я не могу что -то ето сделать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.