|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Помогите составить XSLT. Есть такие исходные данные: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Мне нужно вывести Items/Item, сгруппировав их вначале по группе, затем по категории. Группы сортируются по индексу группы, категории сортируются по индексу категории, внутри группы элементы сортируются по индексу элемента. То есть мне нужно получить примерно такую структуру: Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Как это сделать? В for-each-group можно задавать только один ключ для группировки. И еще я бы хотел сделать XSLT не в одном общем шаблоне, а в трех шаблона (для заголовка группы, для заголовка категории и для списка элементов), но не соображу, как для шаблона задавать атрибут match. ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 10:07 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Вот тут я решал похожую проблему: 13107213 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 10:16 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
На stackoverflow я нашел несколько примеров с группировкой Мюнха. Но все примеры исходят из того, что все используемые атрибуты заданы непосредственно для элемента. У меня же сортировку нужно осуществлять по атрибуту из другого узла. Можно в крайнем случае сделать два преобразования — первый раз в Item добавить атрибуты group_index и category_index, а вторым проходом группировать по ним — но это как-то неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 10:19 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Посмотрел внимательнее — абсолютно тоже самое, что у меня. Только названия групп и категорий лежат отдельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 10:22 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
AntonariyТолько названия групп и категорий лежат отдельно. В этом и сложность. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 10:23 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Еще вопрос. В исходных данных я немного неправильно структуру привел. Правильнее узлы Group выглядят так: Код: xml 1.
Как мне в XSL получить содержимое узла? Так можно? Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 10:58 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Alibek B.AntonariyТолько названия групп и категорий лежат отдельно. В этом и сложность.Выборка из известного раздела по известным условиям? В чем тут сложность? Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 11:01 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Alibek B.Еще вопрос. В исходных данных я немного неправильно структуру привел. Правильнее узлы Group выглядят так: Код: xml 1.
Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 11:04 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Ошибочка. Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 11:06 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Еще ошибки нашел. Вот окончательный вариант: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 11:09 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Сделал вот так: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
В целом структура примерно такая, какая мне нужна. Однако внутри группы элементы почему-то не сортируются. Что нужно исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 11:20 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Antonariy<xsl:param name="group"/> Действительно, про параметры я забыл. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 11:23 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Alibek B.Что нужно исправить? Разобрался, нужно было числовой тип данных указать (data-type="number"). Он у меня сортировал @index как текст. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 11:27 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Еще вопрос, можно ли пронумеровать все элементы (сквозная нумерация)? position() не подходит, он начинает нумерацию с начала в каждой группе. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2013, 11:38 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Alibek B., зачем для такой простой задачи, такое сложное решение? Как описали, так и надо решать. Что касается нумерации, если нет избыточных данных, то можно сделать, если есть... будет нетривиально, с помощью рекурсии, либо с помощью двойной трансформации, итемы набираются в переменную, там где надо вставить группы/категории у итемов прописывается что-то, потом все гонится в один for на выход с проверкой, не надо ли порубить OL с помощью CDATA. Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 13:28 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
mage.lan , про такой способ я тоже думал. Но у него есть два недостатка. А в предложенной реализации даже три. 1. В предложенной реализации заголовок группы выводится для каждой категории. Мне заголовок группы нужно выводить только один раз, то есть этот фрагмент нужно переместить во внешний цикл. 2. Могут выводится пустые заголовки. В предложенной реализации считается число узлов, соответствующих критерию, чтобы не выводить пустой заголовок. Но с учетом п.1 такую проверку нужно делать дважды. 3. Число записей у меня ожидается достаточно большое (минимум несколько сотен). При таких значениях key будет гораздо быстрее, чем вычисление $items[@category=$category/@name and @group=$group/@name] на каждом проходе. И кстати, разве в XSLT1 можно использовать переменную для ссылки на узел? Помоему там были какие-то сложности. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 14:37 |
|
XSLT: Двухуровневая группировка
|
|||
---|---|---|---|
#18+
Alibek B., 1) не проблема, в первом цикле заводим переменную pos = position() вокруг h1 делаем проверку на $pos = 1, нет проблемы. 2) не нужно делать проверку дважды, вторая проверка будет делаться внутри 3) приведенный код жрет любой парсер, даже браузерный, проблемы с переменными в другом. И еще, ваша реализация с ключами и то, как вы их используете, медленнее. Парсеры оптимизированы на простые выборки. Не верите - проверяйте. На 1000 записей вы вообще разницы не увидите в скорости. Ну и еще, когда вы через 2 месяца полезете править свой код, волосы на голове у вас начнут шевелится, т.к. вы вообще не поймете, что там было написано, в поддержке мой вариант как бы тоже предпочтительнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2013, 17:32 |
|
|
start [/forum/topic.php?fid=14&fpage=18&tid=1332528]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 243ms |
total: | 382ms |
0 / 0 |