powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
16 сообщений из 16, страница 1 из 1
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37638851
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дано:

База данных выдавливает из себя отчёты в виде 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.
<report>
   <payment_type code="НАЛ" name="Наличные" />
   <payment_type code="БЕЗНАЛ" name="Безналичные"/>
   <payment_type code="VISA" name="Кредиткой" />
   <payment id="1">
       <type>НАЛ</type>
       <date>2012-01-01</date>
       <summa>100</date>
   </payment>
   <payment id="2">
       <type>НАЛ</type>
       <date>2012-01-02</date>
       <summa>200</date>
   </payment>
   ...
</report>



Вариант вызова 1: передать строки, которые потом использовать в качестве XPATH-путей к для навигации по исходному файлу:

Код: xml
1.
2.
3.
4.
5.
6.
<xsl:call-template name="piechart">
   <xsl:with-param name="legend">/report/payment_code</xsl:with-param>
   <xsl:with-param name="hook">@code</xsl:with-param>
   <xsl:with-param name="label">@name</xs:with-param>
   <xsl:with-param name="value">sum(/report/payment[type = $h]/summa)</xsl:with-param>
</xsl:call-template>



При этом сам темплейт:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<xsl:template name="piechart">
  <xsl:param name="legend" /><xsl:param name="hook"/><xsl:param name="label" /><xsl:param name="value"/>
  <xsl:for-each select="{$legend}" >
     <xsl:variable name="h" select="{$legend}{$hook}"/>
      ....
  </xsl:for-each>   
</xsl:template>



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.
<xsl:call-template name="piechart">
  <xsl:with-param name="datasource">
      <ds>
         <xsl:for-each select="/report/payment_type">
             <sector>
                 <xsl:attribute name="label" select="name"/>
                 <xsl:attribute name="value" select="sum(/report/payment[type = current()/code]/summa)"/>
             </sector>
         <xsl:for-each>
      <ds>
    <xsl:with-param>   
</xsl>



Обрабатывающий шаблон:
Код: xml
1.
2.
3.
4.
5.
6.
<xsl:template name="piechart">
   <xsl:param name="datasource"/>
   <xsl:for-each select="$datasource/ds/sector">
      ....
   </xsl:for-each>
</xsl:template>



Запись 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. Гуглил. Возможно, не тот гугль теребил... :(
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37638884
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
<xsl:call-template name="piechart">
   <xsl:with-param name="legend" select="/report/payment_code"/>
   <xsl:with-param name="hook" select="@code"/>
   <xsl:with-param name="label" select="@name"/>
   <xsl:with-param name="value" select="sum(/report/payment[type = $h]/summa)"/>
</xsl:call-template>

и будет счастье

По поводу node-set() (здесь он не нужен, но на будущее) делаю так
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:func="http://exslt.org/functions"
  xmlns:common="http://exslt.org/common"
  extension-element-prefixes="msxsl func common">

  <func:function name="msxsl:node-set">
    <xsl:param name="ANodes"/>
    <func:result select="common:node-set($ANodes)"/>
  </func:function>
</xsl:stylesheet>


И теперь вызов msxsl:node-set понимают все
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37639092
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Код: xml
1.
2.
3.
4.
5.
6.
<xsl:call-template name="piechart">
   <xsl:with-param name="legend" select="/report/payment_code"/>
   <xsl:with-param name="hook" select="@code"/>
   <xsl:with-param name="label" select="@name"/>
   <xsl:with-param name="value" select="sum(/report/payment[type = $h]/summa)"/>
</xsl:call-template>

и будет счастье


А где счастье то будет? В таком контексте сумма вычислится :
а) одна
б) в момент вызова
в) не вычислится, т.к. $h еще не задана.

Мне же нужно внутри template name="piechart" получить набор из нескольких сумм (в данном случае - сгруппированных по типу платежа), чтобы построить из них диаграмму.

extension-element-prefixes="msxsl func common">


А вот про такую запись не подозревал. Дома вот, правда, MSXML нет (потому как MS нет), завтра на работе попробую.
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37639100
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George A Eliseeffв) не вычислится, т.к. $h еще не задана.Не заметил. Так тогда Вам и node-set() не поможет
George A EliseeffА вот про такую запись не подозревал.ключевое здесь не это, а <func:function>, а extension-element-prefixes это рюшечки для форматирования конечного XML
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37639507
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кросс-платформенность не получилась.

На приведённых ниже файлах libxslt и IE9 работает, а Firefox 9 пишет:
"Ошибка при XSLT преобразовании: Была вызвана неизвестная функция расширения XPath."
Похоже, нет в жизни счастья :(

rep.xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="3.xsl"?>
<report>
  <a>
    <b>First</b>
    <b>Second</b>
  </a>
</report>



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.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:msxsl="urn:schemas-microsoft-com:xslt"
   xmlns:func="http://exslt.org/functions"
   xmlns:common="http://exslt.org/common"
   xmlns="http://www.w3.org/1999/xhtml"
   extension-element-prefixes="msxsl func common"
>

 <func:function name="msxsl:node-set">
    <xsl:param name="ANodes"/>
    <func:result select="common:node-set($ANodes)"/>
 </func:function>

<xsl:output method="xml"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
	encoding="utf-8"
	standalone="yes"
	indent="yes"
	omit-xml-declaration="yes"
    media-type="text/xhtml"/>

<xsl:template match="report">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Test</title></head>
<body><div>
  <xsl:call-template name="test">
    <xsl:with-param name="p1">
      <xsl:copy-of select="a"/>
    </xsl:with-param>
  </xsl:call-template>
</div></body>
</html>
</xsl:template>

<xsl:template name="test">
  <xsl:param name="p1"/>
    <div style="border:1px solid blue;">
      <xsl:copy-of select="msxsl:node-set($p1)"/>
    </div>
    <div style="border:1px solid red;">
      <xsl:for-each select="msxsl:node-set($p1)/a">
        <ul>
           <xsl:for-each select="b">
             <li><xsl:value-of select="." /></li>
           </xsl:for-each>
        </ul>
      </xsl:for-each>
    </div>
</xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37639543
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть, следует подумать такой вариант:

Промаркировать нужные элементы исходного XML через generate-id, а в библиотечном шаблоне работать с ними через key?

Кто нибудь успешно решал похожую задачу? Не дайте зачахнуть в расцвете лет!
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37639837
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я Вам еще раз повторяю -в Вашей задаче node-set не нужен
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 <xsl:call-template name="test">
    <xsl:with-param name="p1" select="a"/>
  </xsl:call-template>

<xsl:template name="test">
  <xsl:param name="p1"/>
    <div style="border:1px solid blue;">
      <xsl:copy-of select="$p1"/>
    </div>
    <div style="border:1px solid red;">
      <xsl:for-each select="$p1/a">
        <ul>
           <xsl:for-each select="b">
             <li><xsl:value-of select="." /></li>
           </xsl:for-each>
        </ul>
      </xsl:for-each>
    </div>
</xsl:template>
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37640128
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да как же не нужен.
В спойлере 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.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:msxsl="urn:schemas-microsoft-com:xslt"
   xmlns:func="http://exslt.org/functions"
   xmlns:common="http://exslt.org/common"
   xmlns="http://www.w3.org/1999/xhtml"
   extension-element-prefixes="msxsl func common"
>

<xsl:output method="xml"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
	encoding="utf-8"
	standalone="yes"
	indent="yes"
	omit-xml-declaration="yes"
    media-type="text/xhtml"/>

<xsl:template name="report">
 <xsl:call-template name="test">
    <xsl:with-param name="p1" select="a"/>
  </xsl:call-template>
 </xsl:template>

<xsl:template name="test">
  <xsl:param name="p1"/>
    <div style="border:1px solid blue;">
      <xsl:copy-of select="$p1"/>
    </div>
    <div style="border:1px solid red;">
      <xsl:for-each select="$p1/a">
        <ul>
           <xsl:for-each select="b">
             <li><xsl:value-of select="." /></li>
           </xsl:for-each>
        </ul>
      </xsl:for-each>
    </div>
</xsl:template>

</xsl:stylesheet>




Вот что делает из него IE9:


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Transitional//EN"><META http-equiv="Content-Type" content="text/html; charset=windows-1251">

<html>
<head><style>

</style></head>


<body>FirstSecond</body>

</html>




Вот выхлоп xsltproc (libxslt):


Код: plaintext
1.
2.
3.
4.
5.
6.
  
    First
    Second
  




Никаких UL и LI не видать :(

Спецификация XSL-1.0 не позволяет делать селекты из RTF :( Это уже XSL-2.0, а оно поддерживается далеко не всем, что есть в моём списке: все свежие браузеры, libxslt, Apache-FO.

Зачем тогда вообще придумали node-set, как не для селектов по Result Tree Fragment ?
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37640233
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упс. Зарапортовался.
Вместо template match написал template name.
Работает.
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37640285
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George A EliseeffЗачем тогда вообще придумали node-set, как не для селектов по Result Tree Fragment ?Для формирования нового набора узлов
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37640480
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чёрт. Что-то я уже не понимаю.

Мне как раз и нужно сделать НОВЫЙ набор, хоть и на основе имеющихся данных.

Во входном xml - payment_type и payment, а для построения графика нужно (это ж библиотечный должен быть template, который о peyment ничего не знает!), должно быть что-то такое:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  <dataset>
    <col label="Наличка"/>
    <col label="Безналичка"/>
    <col label="Кредика"/>
    <row label="Январь 2011">
       <val>20</val><val>200</val><val>0</val>
    </row>
    <row label="Январь 2012">
       <val>200</val><val>20</val><val>1</val>
    </row>
  </dataset>



Причём совсем не факт, что все необходимые данные есть во входном 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.
  <xsl:call-template name="multigraph">
     <xsl:with-param name="dimension">
         <dimension>
            <width>500</width><height>300</height><margin>10</margin>
            <alegend>80</alegend><olegend>40</oledend>
         </dimension>
     </xsl:with-param>    
     <xsl:with-param name="color-sequence">
         <colors><color>red</color><color>orange</color><color>yellow</color><color>green</color>
                    <colot>blue</color><color>navy</color><color>violet</color>
         </colors>
     </xsl:with-param>
     <xsl:with-param name="dataset">
          <dataset>
              <xsl:for-each select="....."><col label="{...}"/></xsl:for-each>
              <xsl:for-each select=".....">
                  <row label="{....}"/>
                  <xsl:for-each select="{....}"><val><xsl:value-of select="...."/></val></xsl:for-each>
              </xsl:for-each>
          </dataset>
     <xsl:with-param>
  </xsl:call-template>



... и если color-sequence я еще могу не передавать, передав функции раскраски в css, и размеры задать отдельными параметрами, то итерации по <dataset>, а равно и count, sum и max по ним - необходимы в обязательном порядке.


Может быть извратиться, и применять несколько XSL последовательно? На сервере это не проблема, а браузер можно заставить?
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37640525
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George A EliseeffМне как раз и нужно сделать НОВЫЙ набор, хоть и на основе имеющихся данных.Ну тогда опаньки.
George A EliseeffНа сервере это не проблема, а браузер можно заставить?Нет. Вообще делать XSLT преобразование на клиенте это очень большой геморрой (ну это Вы уже поняли). Нет никакой возможности перенести его на сервер?
George A EliseeffПричём совсем не факт, что все необходимые данные есть во входном XML'е.
Например, порядка цветов для раскраски графиков и диаграмм там явно нет, их придумывает автор XSL-ки перед тем, как позвать библиотечный темплейт, рисующий картинку.Сделайте частичное преобразование на сервере, сформируйте самодостаточный XML и отдайте уже новый документ клиенту.
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37640593
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Серверу базы данных и так есть чем заняться. Понятно, что на 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.
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37641645
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уфф. Кажется, "сварил".
Работает в IE9, Firefox 9, Opera 11.6.
Почему-то не работает в Google Chrome, но еще вообще не разбирался.
Работает на libxslt.
Работает на "TurboPower Software Company" - так себя идентифицирует XMLPAD.

Пример делает дамп куска дерева исходного XML-файла, или промежуточного дерева.

XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="1.xsl"?>
<report>
   <value label="First">1</value>
   <value label="Second">2</value>
   <value label="Third">3</value>
</report>




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.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:common="http://exslt.org/common"
    xmlns:func="http://exslt.org/functions"
    xmlns="http://www.w3.org/1999/xhtml"
    extension-element-prefixes="msxsl common func"
>

<xsl:output method="xml"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
	encoding="utf-8"
	standalone="yes"
	indent="yes"
	omit-xml-declaration="yes"
    media-type="text/xhtml"/>


<xsl:template match="/report">
   <html xmlns="http://www.w3.org/1999/xhtml">
   <head><title>Browser XSLT Test</title></head>
   <body>
      <h1>Browser XSLT Test</h1>
      <div style="border: 1px solid black; background-color: rgb(200,200,200);">
         <xsl:text>XSL:VENDOR = </xsl:text>
         <xsl:value-of select="system-property('xsl:vendor')"/>
      </div>
      <div style="border: 1px solid navy; background-color: rgb(200,200,255);">
        <xsl:call-template name="dump">
          <xsl:with-param name="tree" select="/report"/>
        </xsl:call-template>
      </div>
      <div style="border:1px solid rgb(128,0,0); background-color: rgb(255,200,200);">
        <xsl:call-template name="dump">
          <xsl:with-param name="tree">
            <report>
              <value xmlns="" label="Created First">101</value>
              <value xmlns="" label="Created Second">102</value>
              <value xmlns="" label="Created Third">103</value>
            </report>
          </xsl:with-param>
        </xsl:call-template>
      </div>
   </body>
   </html>
</xsl:template>


<xsl:template name="dump">
   <xsl:param name="tree"/>
   <xsl:choose>
     <!-- for most non-ms transformers -->
     <xsl:when test="function-available('common:node-set')">
        <xsl:for-each select="common:node-set($tree)">
           <xsl:call-template name="dump_tree"/>
        </xsl:for-each>
     </xsl:when>
     <!-- for msxml 3.0+ transformers -->
     <xsl:when test="function-available('msxsl:node-set')">
        <xsl:for-each select="msxsl:node-set($tree)">
           <xsl:call-template name="dump_tree"/>
        </xsl:for-each>
     </xsl:when>
     <!-- for msxml 2.0, XSL-2.0, TurboPower transformers -->
     <xsl:otherwise>
        <xsl:for-each select="$tree">
           <xsl:call-template name="dump_tree"/>
        </xsl:for-each>
     </xsl:otherwise>
   </xsl:choose>
</xsl:template>

<xsl:template name="dump_tree">
   <xsl:value-of select="concat('&#60;',name(),' ')"/>
    <xsl:for-each select="@*">
       <xsl:value-of select="concat(' ',name(),'=&#34;', ., '&#34;')" />
   </xsl:for-each>
   <xsl:text>&#62;</xsl:text>

   <xsl:if test="count(*) > 0" >
     <div style="padding-left: 20px">
       <xsl:for-each select="*">
          <xsl:call-template name="dump_tree"/>
       </xsl:for-each>
     </div>
   </xsl:if>

   <xsl:value-of select="text()"/>
   <xsl:value-of select="concat('&#60;/',name(),'&#62;')"/>
   <br/>
</xsl:template>

</xsl:stylesheet>



Хитрый трюк заключается в том, что вызывается не "рабочий" template (dump_tree), выполняющий что-то полезное, а "обёртка" (dump), определяющая наличие доступных функций, при их доступности - выполняющая эти функции, и передающая результат выполнения функции а "рабочий" template.

Неприятный глюк - временное дерево начинается с элемента, не имеющего имени. Типа "документ", наверное. Приходится "давить".
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37641883
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
George A Eliseeff, Понятно, что-то подобное я и предполагал.

А на <func:function> FF кладет?
...
Рейтинг: 0 / 0
Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
    #37642015
George A Eliseeff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, ... я бы даже сказал - "ложит"...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Хочу сделать библиотеку SVG-бизнес-графики. Не получается передать данные в xsl:template.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]