|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Дано: База данных выдавливает из себя отчёты в виде XML. XML'и скрищеваются с XSL'ями на различных процессорах: Браузеры - для интерактивного показа пользователям с возможностью Drill-Down. В т.ч. и через Ajax. Apache FO - для подготовки PDF'ок на печать и для массовой рассылки "форматных" документов (счета, счета-фактуры, поздравительные открытки к 8 марта и т.п.) xsltproc (libxslt) - для изготовления "статичных" xhtml-файлов для того-же спама подписчикам, например. С выходом в свет IE9, который наконец-то научился показывать SVG, появилось желание использовать деловую графику в формате SVG. С самой генераций SVG, и рендерингом её на различных средствах отображения проблем пока нет. Но хочется создать библиотеку файликов типа piechart.xsl, piechart3d.xsl, manhattan.xsl, multigraphic.xsl и т.п., чтобы пользовать её в отчётах, и не заморачивать каждый раз мозги с пикселями, синусами и полигонами. И вот тут проблема: как бы передать в такой темплейт данные, которые нужно отобразить? Да еще и так, чтобы работало на всех вышеперечисленных процессорах (браузеры, Apache FO, libxslt. А еще, желательно, чтобы всякие встроенные в XML-редакторы процессоры тоже понимали. Тот же xmlpad, хотя бы. Отлаживаться то нужно как-то? Откуда и ограничение - XSL 1.0). Мои варианты (больно не пинайте, с XSLT знаком совсем недавно). Предположим, есть исходный XML (реестр платежей) вида: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Вариант вызова 1: передать строки, которые потом использовать в качестве XPATH-путей к для навигации по исходному файлу: Код: xml 1. 2. 3. 4. 5. 6.
При этом сам темплейт: Код: xml 1. 2. 3. 4. 5. 6. 7.
select="{$legend}" уже не работает. Или работает, но возвращает не желаемый набор узлов, а какую-нибудь нежелаемую чушь. Если $legend растёт от самого корня, то прокатывает select="/*[name() = $legend]", но это не позволит работать с "длинными" путями типа /report/payment/2012/january. Глубина вложенности настоящих данных заранее неизвестна, да и возможность фильтрации хотелось бы поиметь (/report/payment_type[@aaa = 'bbb']). Можно как-то заставить xslt-процессор понимать, что переданные ему строки нужно разрешить в node-set'ы ? Вариант 2: передавать сформированное временное дерево Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Обрабатывающий шаблон: Код: xml 1. 2. 3. 4. 5. 6.
Запись select="$datasource/ds/sector, как ни странно, кое-где даже работает (в xmlpad'e, например), а в xsltproc отказывается. exsl:node-set() работает (в Apache-FO не проверял, но если и не работает - можно предварительно переварить на xsltproc), но для каждого процессора свой формат подключения. Для msxml 2.0 node-set'а вообще, кажется, нет (зато $datasource селектится). Для msxml 3+ это xmlns:msxsl="urn:schemas-microsoft-com:xslt". Для не-майкрософта - xmlns:exsl=" http://exslt.org/common" extension-element-prefixes="exsl". Может быть, кто-нибудь придумал гарантированно работающий работающий способ кроссплатформенно подключить node-set (ну и прочие math:синус'ы заодно - иначе 3D считать неуютно...) ? Может быть, есть ещё логичные способы? Например, "на ходу" прогонять piechart.xsl через какой-нибудь другой xsl, подменяя в нём ссылки $datasource на /report/payment[a = 'b']/summa? Ужасссс... P.S. Гуглил. Возможно, не тот гугль теребил... :( ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2012, 19:10 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3. 4. 5. 6.
и будет счастье По поводу node-set() (здесь он не нужен, но на будущее) делаю так Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
И теперь вызов msxsl:node-set понимают все ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2012, 19:40 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
_Vasilisk_ Код: xml 1. 2. 3. 4. 5. 6.
и будет счастье А где счастье то будет? В таком контексте сумма вычислится : а) одна б) в момент вызова в) не вычислится, т.к. $h еще не задана. Мне же нужно внутри template name="piechart" получить набор из нескольких сумм (в данном случае - сгруппированных по типу платежа), чтобы построить из них диаграмму. extension-element-prefixes="msxsl func common"> А вот про такую запись не подозревал. Дома вот, правда, MSXML нет (потому как MS нет), завтра на работе попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2012, 22:21 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
George A Eliseeffв) не вычислится, т.к. $h еще не задана.Не заметил. Так тогда Вам и node-set() не поможет George A EliseeffА вот про такую запись не подозревал.ключевое здесь не это, а <func:function>, а extension-element-prefixes это рюшечки для форматирования конечного XML ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2012, 22:29 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Кросс-платформенность не получилась. На приведённых ниже файлах libxslt и IE9 работает, а Firefox 9 пишет: "Ошибка при XSLT преобразовании: Была вызвана неизвестная функция расширения XPath." Похоже, нет в жизни счастья :( rep.xml: Код: xml 1. 2. 3. 4. 5. 6. 7. 8.
3.xsl: Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 10:40 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Может быть, следует подумать такой вариант: Промаркировать нужные элементы исходного XML через generate-id, а в библиотечном шаблоне работать с ними через key? Кто нибудь успешно решал похожую задачу? Не дайте зачахнуть в расцвете лет! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 10:58 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Я Вам еще раз повторяю -в Вашей задаче node-set не нужен Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 13:15 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Да как же не нужен. В спойлере xsl, сделанный из Вашего добавлением заголовка. Код: 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.
Вот что делает из него IE9: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Вот выхлоп xsltproc (libxslt): Код: plaintext 1. 2. 3. 4. 5. 6.
Никаких UL и LI не видать :( Спецификация XSL-1.0 не позволяет делать селекты из RTF :( Это уже XSL-2.0, а оно поддерживается далеко не всем, что есть в моём списке: все свежие браузеры, libxslt, Apache-FO. Зачем тогда вообще придумали node-set, как не для селектов по Result Tree Fragment ? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 15:06 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Упс. Зарапортовался. Вместо template match написал template name. Работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 15:57 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
George A EliseeffЗачем тогда вообще придумали node-set, как не для селектов по Result Tree Fragment ?Для формирования нового набора узлов ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 16:19 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Чёрт. Что-то я уже не понимаю. Мне как раз и нужно сделать НОВЫЙ набор, хоть и на основе имеющихся данных. Во входном xml - payment_type и payment, а для построения графика нужно (это ж библиотечный должен быть template, который о peyment ничего не знает!), должно быть что-то такое: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Причём совсем не факт, что все необходимые данные есть во входном XML'е. Например, порядка цветов для раскраски графиков и диаграмм там явно нет, их придумывает автор XSL-ки перед тем, как позвать библиотечный темплейт, рисующий картинку. Т.е. вызов полностью выглядит как-то так: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... и если color-sequence я еще могу не передавать, передав функции раскраски в css, и размеры задать отдельными параметрами, то итерации по <dataset>, а равно и count, sum и max по ним - необходимы в обязательном порядке. Может быть извратиться, и применять несколько XSL последовательно? На сервере это не проблема, а браузер можно заставить? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 17:55 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
George A EliseeffМне как раз и нужно сделать НОВЫЙ набор, хоть и на основе имеющихся данных.Ну тогда опаньки. George A EliseeffНа сервере это не проблема, а браузер можно заставить?Нет. Вообще делать XSLT преобразование на клиенте это очень большой геморрой (ну это Вы уже поняли). Нет никакой возможности перенести его на сервер? George A EliseeffПричём совсем не факт, что все необходимые данные есть во входном XML'е. Например, порядка цветов для раскраски графиков и диаграмм там явно нет, их придумывает автор XSL-ки перед тем, как позвать библиотечный темплейт, рисующий картинку.Сделайте частичное преобразование на сервере, сформируйте самодостаточный XML и отдайте уже новый документ клиенту. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 18:24 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Серверу базы данных и так есть чем заняться. Понятно, что на PL/SQL я могу и готовые SVG генерить, не занимаясь мозгоправством с XSL. XML нужен для: а) разгрузить сервер БД при массовой генерации отчётов. Сервер выплёвывает, например, всю первичку по счёту в едином порыве, не отвлекаясь на расчёт сумм, раздумывание о том, будет из этого сделан XHTML или PDF. Серверок же отчётов не обременён лицензионными отчислениями в пользу Oracle, и за какие-то невзрачные (по сравенению с ценами Оракл-лиценщий) пару тысяч долларов на процессор и память переваривает эти XML, и выплёвывает счета, счета-фактуры, сверки, акты, подсчитывая самостоятельно суммы и координаты пикселей. б) для выдачи отчётов в веб-клиент. Причём они могут вылетать и через <a href="?такой-то отчёт">, так и подгружаясь через Ajax, и удобно располагаясь в Iframe'ах и прочих div'ах, попутно обернувшись XSLT-процессором браузера. С мелочью вроде счетов, где всего-то нужно исходные данные разложить по HTML и FO-табличке вопросов почти не возникает. Все браузеры с этим вполне справляются, и серверок с Apache FO и libxslt не отстаёт. Но вот на графике - затык. Рисование XSLT-трансформера для табличного отчёта при набитой руке и наличии свалки шаблонов занимает полчаса-час, тут уже и оптимизировать ничего не надо. А вот расчёт "куда какой пиксел нарисовать" каждый раз с нуля - это уже от полудня до недели. А потом вылазиет желание заменить вот тут "манхэттен" на "мультиграф" или "цветной манхэттен", или повернуть по оси Z градусов на 20-25... и снова пол-дня перерисовки. Без оптимизации никак. В общем, путь лежит в сторону кроссплатформенного позыва exslt:node-set. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2012, 19:03 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
Уфф. Кажется, "сварил". Работает в IE9, Firefox 9, Opera 11.6. Почему-то не работает в Google Chrome, но еще вообще не разбирался. Работает на libxslt. Работает на "TurboPower Software Company" - так себя идентифицирует XMLPAD. Пример делает дамп куска дерева исходного XML-файла, или промежуточного дерева. XML: Код: xml 1. 2. 3. 4. 5. 6. 7.
XSLT: Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95.
Хитрый трюк заключается в том, что вызывается не "рабочий" template (dump_tree), выполняющий что-то полезное, а "обёртка" (dump), определяющая наличие доступных функций, при их доступности - выполняющая эти функции, и передающая результат выполнения функции а "рабочий" template. Неприятный глюк - временное дерево начинается с элемента, не имеющего имени. Типа "документ", наверное. Приходится "давить". ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 12:45 |
|
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
|
|||
---|---|---|---|
#18+
George A Eliseeff, Понятно, что-то подобное я и предполагал. А на <func:function> FF кладет? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2012, 14:06 |
|
|
start [/forum/topic.php?fid=14&msg=37639507&tid=1332779]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 292ms |
total: | 438ms |
0 / 0 |