BGBilling XSLT

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
 
(33 промежуточные версии не показаны)
Строка 1: Строка 1:
-
XSLT - язык, основанный на формате XML. Его назначение - трансформация XML дерева с данными в какой-либо результирующий формат. Например: TXT, XHTML (HTML документ, соответсвующий правилам формата XML). Трансформация производится XSLT процессором.
+
[[Категория:XSL]]
 +
Основная статья с описанием технологии на wiki.bitel.ru: [http://wiki.bitel.ru/index.php/XSLT XSLT]
-
{|
+
См. также раздел [http://wiki.bgbilling.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0#XSLT_.D1.88.D0.B0.D0.B1.D0.BB.D0.BE.D0.BD.D1.8B XSLT шаблоны]
-
|- valign=top
+
-
| [[Изображение:XSLT_1.png]]  
+
-
|}
+
-
В XSLT шаблоне различаются просто теги, которые без изменений перейдут в результирующий документ и управляющие теги для процессора с префиксом xslt. Пример фрагмента XSLT документа:
+
В биллинге в качестве xslt-процессора используется Xalan. Он поддерживает XSLT 1.0
-
<pre>
+
Можно использовать его расширения(описаны по ссылке на описание технологий, приведенной выше) .
-
<tbody>
+
-
  <xsl:for-each select="bills/bill">
+
-
  <xsl:variable name="uid" select="@uid"/>
+
-
  <tr>
+
-
  <td nowrap="nowrap"><xsl:value-of select="@number"/></td>
+
-
  <td><xsl:value-of select="@create_dt"/></td>
+
-
  <td><xsl:value-of select="@pay_dt"/></td>
+
-
  <td nowrap="nowrap"><xsl:value-of select="@summ"/></td>
+
-
  <td nowrap="nowrap">
+
-
    <xsl:choose>
+
-
    <xsl:when test="@status=0">не оплачен</xsl:when>
+
-
    <xsl:otherwise>оплачен</xsl:otherwise>
+
-
    </xsl:choose>
+
-
  </td>
+
-
  <td>
+
-
    <xsl:choose>
+
-
    <xsl:when test="$uid=-1">создан Вами</xsl:when>
+
-
    <xsl:otherwise>создан администратором</xsl:otherwise>
+
-
    </xsl:choose>
+
-
  < /td>
+
-
</pre>
+
-
Здесь форматируется XHTML документ, при этом используются стандартые HTML теги (tr, td) и управляющие теги поцессора (xsl:choose, xsl:value-of).
+
Также в биллинге доступны некоторые дополнительные возможности XSLT.  
-
Рассмотрим несколько XSLT директив, встречающихся в приведенном фрагменте:
+
== Счетчик ==
-
'''<xsl:for-each select="bills/bill">'''  - для каждого узла '''bills/bill''' исходного дерева XML данных выполнить то что указано до '''</xsl:for-each>'''
+
Используется для корректного сложения дробных чисел с десятичной точкой. При использовании сложения средствами XSLT возможны погрешности округления из-за перевода десятичных дробей к числам с плавающей точкой.
-
'''<xsl:variable name="uid" select="@uid"/>''' - создать переменную '''uid''' и присвоить ей значение из атрибута '''uid''' текущего узла '''bill'''
+
Объявляется так:
 +
<source lang="xml">
 +
<xsl:stylesheet
 +
version="1.0"  
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:fo="http://www.w3.org/1999/XSL/Format"
 +
xmlns:svg="http://www.w3.org/2000/svg"
 +
xmlns:xalan="http://xml.apache.org/xalan"
 +
xmlns:counter="bitel.billing.server.util.exslt.Counter">
 +
........
 +
</source>
-
'''<xsl:value-of select="@number"/>''' - вставить значение атрибута '''number''' текущего элемента '''bill'''
+
Используется так:
 +
<source lang="xml">
 +
<xsl:value-of select="counter:set('total', '0.0')"/>
 +
<xsl:value-of select="counter:add('total', '10.00')"/>
 +
<xsl:value-of select="counter:get('total')"/>
 +
</source>
-
'''<xsl:choose>''' - условный оператор, аналог case либо '''if-else''', внутри могу быть несколько '''<xsl:when>''' условий и действие по умолчанию '''<xsl:otherwise>'''
+
== SQL запрос ==
 +
Используется для выполнения произвольных выборок из базы биллинга. Пример здесь: [[Квитанция телефонии физ. лицам]].
-
С помощью XSLT формируются все выводимые биллингом XHTML, TXT, PDF формы, в т.ч. страницы статистики пользователя. Модифицируя шаблон, поставляемый в составе системы, вы можете менять оформление выводимых данных любым образом. Для этого нужно только получить XML документ с данными и имя XSLT шаблона, который биллинг использует для той или иной трансформации.
+
Объявляется расширение так:
 +
<source lang="xml">
 +
<xsl:stylesheet
 +
version="1.0"
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:fo="http://www.w3.org/1999/XSL/Format"
 +
xmlns:svg="http://www.w3.org/2000/svg"
 +
xmlns:xalan="http://xml.apache.org/xalan"
 +
xmlns:sql="bitel.billing.server.util.exslt.SQLQuery">
 +
......
 +
</source>
-
Ниже приведены ссылки на руководства по XSLT. Язык разметки XSLT тесно завязан с языком XPath - языком выборки данных в XML деревьях. XSLT процессор используемый биллингом поддерживает спецификации XSLT и XPath версий 1.0 и 2.0.
+
Используется так:
 +
<source lang="xml">
 +
<xsl:variable name="query" select="'SELECT id, title FROM contract'"/>
 +
<xsl:variable name="contracts" select="sql:select( $query )"/>
-
'''На русском:'''
+
<xsl:for-each select="$contracts/row">
-
#http://www.raleigh.ru/XML/XSLTutorial/contents.htm либо http://www.zvon.org/xxl/XSLTutorial/Output_rus/contents.htm
+
  <xsl:value-of select="@id"/>
-
#http://www.webclub.ru/archive/xml/article-724.html либо http://citforum.ru/internet/xmlxslt/xmlxslt.shtml
+
  <xsl:value-of select="@title"/>
-
#http://www.opennet.ru/base/dev/xml_example.txt.html
+
</xsl:for-each>
-
#http://citforum.ru/internet/xslt/index.shtml
+
</source>
-
'''На английском:'''
+
== Использование произвольных методов Java клаcсов ==
-
#ftp://bgbilling.ru/pub/bgbilling/doc
+
Например, вызов функции: http://bgbilling.ru/v4.5/javadoc/bitel/billing/common/CommonUtils.html#maskBlank(java.lang.String,%20java.lang.String)
-
#http://www.w3schools.com/xsl/default.asp
+
Возможен вызов любой функции с простыми параметрами (пустой список, либо строка) из любого класса, входящего в classpath BGBillingServer.
-
#http://www.w3schools.com/xpath/default.asp
+
 
-
#http://www.tizag.com/xmlTutorial/xslttutorial.php
+
Объявляется так:
-
#http://www.zvon.org/xxl/XSLTutorial/Books/Book1/index.html
+
<source lang="xml">
-
#http://www.topxml.com/xsl/tutorials/intro/default.asp
+
<xsl:stylesheet
-
#Запрос в Google: http://www.google.ru/search?hl=en&q=xslt+tutorial
+
version="1.0"
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:fo="http://www.w3.org/1999/XSL/Format"
 +
xmlns:svg="http://www.w3.org/2000/svg"
 +
xmlns:xalan="http://xml.apache.org/xalan"
 +
xmlns:utils="bitel.billing.common.CommonUtils">
 +
......
 +
</source>
 +
 
 +
Вызывается так:
 +
<source lang="xml">
 +
<xsl:variable name="abon_service" select="utils:replace( '5555,44', ',', '')"/>
 +
</source>
 +
 
 +
== Сумма прописью с большой буквы (Использование произвольных методов Java класcов, второй способ) ==
 +
 
 +
Объявляется так:
 +
<source lang="xml">
 +
<xsl:stylesheet
 +
version="1.0"
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:fo="http://www.w3.org/1999/XSL/Format"
 +
xmlns:svg="http://www.w3.org/2000/svg"
 +
xmlns:xalan="http://xml.apache.org/xalan"
 +
        xmlns:java="http://xml.apache.org/xalan/java" 
 +
exclude-result-prefixes="java">
 +
......
 +
</source>
 +
 
 +
Используется так:
 +
<source lang="xml">
 +
  <xsl:variable name="sumStr"  select="java:java.lang.String.new(st:summaToString(@total_sum))"/>
 +
  <xsl:variable name="sumStr2" select="java:concat(java:toUpperCase(java:substring($sumStr,0,1)),java:substring($sumStr,1))"/>
 +
  Итого к оплате: <xsl:value-of select="$sumStr2" />
 +
</source>
 +
 
 +
== Сумма через "-" ==
 +
 
 +
Объявляется так:
 +
<source lang="xml">
 +
<xsl:stylesheet
 +
version="1.0"
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:fo="http://www.w3.org/1999/XSL/Format"
 +
xmlns:svg="http://www.w3.org/2000/svg"
 +
xmlns:xalan="http://xml.apache.org/xalan"
 +
        xmlns:java="http://xml.apache.org/xalan/java" 
 +
exclude-result-prefixes="java">                       
 +
 
 +
 
 +
......
 +
</source>
 +
 
 +
Используется так:
 +
<source lang="xml">
 +
  <xsl:variable name="sumStr"  select="java:java.lang.String.new(@total_sum)"/>
 +
  Итого к оплате: <xsl:value-of select="java:concat(java:concat(java:substring($sumStr,0,java:lastIndexOf($sumStr,'.')),'-'),java:substring($sumStr,java:indexOf($sumStr,'.')+1))" />
 +
</source>
 +
 
 +
== Генерация картинки со штрих-кодом ==
 +
Используется вставки картинок с штрих-кодом в FO страницы. Пример здесь: [[Квитанция телефонии физ. лицам]].
 +
На протокол '''barcode''' в процессах биллинга повешен генератор картинок с штрих-кодом. Соответсвенно, Java машина при запросе данной картинки вызывает его. В данный момент поддержан формат Code128.
 +
Используется примерно так:
 +
 
 +
<source lang="xml">
 +
<!-- 128-тип кода, затем StartA, T, K, B, CodeC  -->
 +
<xsl:variable name="code_start" select="'128a|TKB&#199;'"/>
 +
<!-- номер телефона (первый) - 7 символов -->
 +
<xsl:variable name="number" select="$numbers/row/@number"/>
 +
<!-- период оплаты - 4 символа -->
 +
<xsl:variable name="period_opl" select="concat( $mm, $yy )"/>
 +
<!-- сумма -->
 +
<xsl:variable name="rub" select="substring-before(/data/bill/@total_sum,'.')"/>
 +
<xsl:variable name="kop" select="substring-after(/data/bill/@total_sum,'.')"/>
 +
<xsl:variable name="rub_length" select="string-length($rub)"/>
 +
 
 +
<fo:external-graphic width="6.5cm" height="1.1cm">
 +
<xsl:attribute name="src"><xsl:value-of select="concat('barcode:///', $code_start, $number, $period_opl, $sum_part_c, '&#201;', $sum_part_a, '&lt;SOH&gt;')"/></xsl:attribute>
 +
</fo:external-graphic>
 +
</source>
 +
 
 +
== Чтение параметра из конфигурации сервера и модулей (версия 4.6) ==
 +
Предоставляет возможность читать значения из конфигурации сервера и модулей.
 +
 
 +
Объявляется так:
 +
<source lang="xml">
 +
<xsl:stylesheet
 +
version="1.0"
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:fo="http://www.w3.org/1999/XSL/Format"
 +
xmlns:svg="http://www.w3.org/2000/svg"
 +
xmlns:xalan="http://xml.apache.org/xalan"
 +
xmlns:setup="bitel.billing.server.util.exslt.ConfigReader">
 +
......
 +
<xalan:component prefix="setup" functions="getValue">
 +
<xalan:script lang="javaclass" src="xalan://bitel.billing.server.util.exslt.ConfigReader"/>
 +
</xalan:component>
 +
......
 +
</source>
 +
 
 +
Вызывается так:
 +
<source lang="xml">
 +
<xsl:value-of select="setup:getValue(65,'bill.attributes' )" />
 +
</source>
 +
Метод:<br>
 +
:String getValue(int mid, String name);<br>
 +
Значения параметров:<br>
 +
:mid - код модуля, для которого читается конфиг, если 0 то читется из конфига сервера<br>
 +
:name - название параметра<br>
 +
Возвращает:<br>
 +
:строка - значение параметра из конфига. Если параметра нет, то пустая строка <br>
 +
 
 +
 
 +
== Выполнение функции из библиотеки скриптов (с версии 4.6) ==
 +
Выполняет функцию из библиотеки скриптов.
 +
 
 +
Объявляется так:
 +
<source lang="xml">
 +
<xsl:stylesheet
 +
version="1.0"
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:fo="http://www.w3.org/1999/XSL/Format"
 +
xmlns:svg="http://www.w3.org/2000/svg"
 +
xmlns:xalan="http://xml.apache.org/xalan"
 +
xmlns:script="bitel.billing.server.util.exslt.Scripting">
 +
......
 +
<xalan:component prefix="script" functions="invoke">
 +
<xalan:script lang="javaclass" src="xalan://bitel.billing.server.util.exslt.Scripting"/>
 +
</xalan:component>
 +
......
 +
</source>
 +
 
 +
Вызывается так:
 +
<source lang="xml">
 +
<xsl:value-of select="script:invoke('default','doSomething')" />
 +
</source>
 +
 
 +
Вызов с двумя параметрами param1, param2:
 +
<source lang="xml">
 +
<xsl:value-of select="script:invoke('default','doSomething', 'param1', 'param2')" />
 +
</source>
 +
 
 +
Метод:<br>
 +
:Object invoke(String lib, String method, Object arg1);<br>
 +
:Object invoke(String lib, String method, Object arg1, Object arg2);<br>
 +
:Object invoke(String lib, String method, Object[] args);<br>
 +
Значения параметров:<br>
 +
:lib - имя библиотеки<br>
 +
:method - имя функции<br>
 +
:arg1, arg2 / args - параметры, которые передается в метод.<br>
 +
Возвращает:
 +
:объект - результат выполнения метода.<br>
 +
 
 +
В скрипте также доступна функция getContext(), которая возвращает объект, содержащий поля:
 +
: con - объект типа java.sql.Connection, соединение с базой биллинга <br>
 +
: log - обьект класса org.apache.log4j.Logger<br>
 +
<source lang="java">
 +
public String doSomething()
 +
{
 +
  String result = null;
 +
  ctx = getContext();
 +
 
 +
  rs = ctx.con.createStatement().executeQuery( "SELECT 5 + 5" );
 +
  if (rs.next())
 +
  {
 +
    result = rs.getString( 1 );
 +
  }
 +
 
 +
  ctx.log.info( "result=" + result );
 +
 
 +
  return result;
 +
}
 +
</source>
 +
 
 +
== Вызов динамического кода (с версии 6.2) ==
 +
 
 +
Вызывает метод динамического класса.
 +
 
 +
Объявляется так:
 +
 
 +
<source lang="xml">
 +
<xsl:stylesheet
 +
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 +
xmlns:xalan="http://xml.apache.org/xalan"
 +
xmlns:script="bitel.billing.server.util.exslt.DynCodeExecuter"
 +
version="1.0">
 +
<xsl:import href="layout.xsl"></xsl:import>
 +
</source>
 +
 
 +
Вызывается так:
 +
<source lang="xml">
 +
// Передается название класса, название метода, далее - параметры функции
 +
<xsl:value-of select="script:execute('Test', 'method', 'myArg')" ></xsl:value-of>
 +
</source>
 +
 
 +
Пример вызываемого динамического класса:
 +
 
 +
<source lang="java">
 +
public class Test
 +
{
 +
    public Object method( String arg )
 +
      throws BGException
 +
    {
 +
      return arg;
 +
    }
 +
}
 +
</source>
 +
 
 +
В случае, если динамический класс реализует интерфейс DynCodeXslt (интерфейс, содержащий метод execute с Setup и Connection):
 +
 
 +
<source lang="java">
 +
public class Test
 +
    implements DynCodeXslt
 +
{
 +
    @Override
 +
    public Object execute( Setup setup, Connection connection, Object[] arg )
 +
      throws BGException
 +
    {
 +
      return arg;
 +
    }
 +
}
 +
</source>
 +
 
 +
 
 +
Вызов метода execute будет выглядеть так:
 +
<source lang="xml">
 +
<xsl:value-of select="script:execute('Test', 'execute', 'myArg')" ></xsl:value-of>
 +
</source>

Текущая версия на 10:59, 17 июня 2015

Основная статья с описанием технологии на wiki.bitel.ru: XSLT

См. также раздел XSLT шаблоны


В биллинге в качестве xslt-процессора используется Xalan. Он поддерживает XSLT 1.0. Можно использовать его расширения(описаны по ссылке на описание технологий, приведенной выше) .

Также в биллинге доступны некоторые дополнительные возможности XSLT.

Содержание

Счетчик

Используется для корректного сложения дробных чисел с десятичной точкой. При использовании сложения средствами XSLT возможны погрешности округления из-за перевода десятичных дробей к числам с плавающей точкой.

Объявляется так:

<xsl:stylesheet
	version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fo="http://www.w3.org/1999/XSL/Format"
	xmlns:svg="http://www.w3.org/2000/svg" 
	xmlns:xalan="http://xml.apache.org/xalan"
	xmlns:counter="bitel.billing.server.util.exslt.Counter">
	........

Используется так:

<xsl:value-of select="counter:set('total', '0.0')"/>
<xsl:value-of select="counter:add('total', '10.00')"/>
<xsl:value-of select="counter:get('total')"/>

SQL запрос

Используется для выполнения произвольных выборок из базы биллинга. Пример здесь: Квитанция телефонии физ. лицам.

Объявляется расширение так:

<xsl:stylesheet
	version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fo="http://www.w3.org/1999/XSL/Format"
	xmlns:svg="http://www.w3.org/2000/svg" 
	xmlns:xalan="http://xml.apache.org/xalan"
	xmlns:sql="bitel.billing.server.util.exslt.SQLQuery">
	......

Используется так:

<xsl:variable name="query" select="'SELECT id, title FROM contract'"/>
<xsl:variable name="contracts" select="sql:select( $query )"/>
 
<xsl:for-each select="$contracts/row">
  	<xsl:value-of select="@id"/>
  	<xsl:value-of select="@title"/>
</xsl:for-each>

Использование произвольных методов Java клаcсов

Например, вызов функции: http://bgbilling.ru/v4.5/javadoc/bitel/billing/common/CommonUtils.html#maskBlank(java.lang.String,%20java.lang.String) Возможен вызов любой функции с простыми параметрами (пустой список, либо строка) из любого класса, входящего в classpath BGBillingServer.

Объявляется так:

<xsl:stylesheet
	version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fo="http://www.w3.org/1999/XSL/Format"
	xmlns:svg="http://www.w3.org/2000/svg" 
	xmlns:xalan="http://xml.apache.org/xalan"
	xmlns:utils="bitel.billing.common.CommonUtils">
	......

Вызывается так:

<xsl:variable name="abon_service" select="utils:replace( '5555,44', ',', '')"/>

Сумма прописью с большой буквы (Использование произвольных методов Java класcов, второй способ)

Объявляется так:

<xsl:stylesheet
	version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fo="http://www.w3.org/1999/XSL/Format"
	xmlns:svg="http://www.w3.org/2000/svg" 
	xmlns:xalan="http://xml.apache.org/xalan"
        xmlns:java="http://xml.apache.org/xalan/java"   
	exclude-result-prefixes="java">
	......
Используется так:
<xsl:variable name="sumStr"  select="java:java.lang.String.new(st:summaToString(@total_sum))"/>
  <xsl:variable name="sumStr2" select="java:concat(java:toUpperCase(java:substring($sumStr,0,1)),java:substring($sumStr,1))"/>
  Итого к оплате: <xsl:value-of select="$sumStr2" />

Сумма через "-"

Объявляется так:

<xsl:stylesheet
	version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fo="http://www.w3.org/1999/XSL/Format"
	xmlns:svg="http://www.w3.org/2000/svg" 
	xmlns:xalan="http://xml.apache.org/xalan"
        xmlns:java="http://xml.apache.org/xalan/java"   
	exclude-result-prefixes="java">                         
 
 
	......
Используется так:
<xsl:variable name="sumStr"  select="java:java.lang.String.new(@total_sum)"/>
   Итого к оплате: <xsl:value-of select="java:concat(java:concat(java:substring($sumStr,0,java:lastIndexOf($sumStr,'.')),'-'),java:substring($sumStr,java:indexOf($sumStr,'.')+1))" />

Генерация картинки со штрих-кодом

Используется вставки картинок с штрих-кодом в FO страницы. Пример здесь: Квитанция телефонии физ. лицам. На протокол barcode в процессах биллинга повешен генератор картинок с штрих-кодом. Соответсвенно, Java машина при запросе данной картинки вызывает его. В данный момент поддержан формат Code128. Используется примерно так:

<!-- 128-тип кода, затем StartA, T, K, B, CodeC  -->
<xsl:variable name="code_start" select="'128a|TKB&#199;'"/>
<!-- номер телефона (первый) - 7 символов -->
<xsl:variable name="number" select="$numbers/row/@number"/>
<!-- период оплаты - 4 символа -->
<xsl:variable name="period_opl" select="concat( $mm, $yy )"/>
<!-- сумма -->
<xsl:variable name="rub" select="substring-before(/data/bill/@total_sum,'.')"/>
<xsl:variable name="kop" select="substring-after(/data/bill/@total_sum,'.')"/>
<xsl:variable name="rub_length" select="string-length($rub)"/>
 
<fo:external-graphic width="6.5cm" height="1.1cm">
 	<xsl:attribute name="src"><xsl:value-of select="concat('barcode:///', $code_start, $number, $period_opl, $sum_part_c, '&#201;', $sum_part_a, '&lt;SOH&gt;')"/></xsl:attribute>
</fo:external-graphic>

Чтение параметра из конфигурации сервера и модулей (версия 4.6)

Предоставляет возможность читать значения из конфигурации сервера и модулей.

Объявляется так:

<xsl:stylesheet
	version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fo="http://www.w3.org/1999/XSL/Format"
	xmlns:svg="http://www.w3.org/2000/svg" 
	xmlns:xalan="http://xml.apache.org/xalan"
	xmlns:setup="bitel.billing.server.util.exslt.ConfigReader">
	......
	<xalan:component prefix="setup" functions="getValue">
		<xalan:script lang="javaclass" src="xalan://bitel.billing.server.util.exslt.ConfigReader"/>
	</xalan:component>
 	......

Вызывается так:

<xsl:value-of select="setup:getValue(65,'bill.attributes' )" />

Метод:

String getValue(int mid, String name);

Значения параметров:

mid - код модуля, для которого читается конфиг, если 0 то читется из конфига сервера
name - название параметра

Возвращает:

строка - значение параметра из конфига. Если параметра нет, то пустая строка


Выполнение функции из библиотеки скриптов (с версии 4.6)

Выполняет функцию из библиотеки скриптов.

Объявляется так:

<xsl:stylesheet
	version="1.0" 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fo="http://www.w3.org/1999/XSL/Format"
	xmlns:svg="http://www.w3.org/2000/svg" 
	xmlns:xalan="http://xml.apache.org/xalan"
	xmlns:script="bitel.billing.server.util.exslt.Scripting">
	......
	<xalan:component prefix="script" functions="invoke">
		<xalan:script lang="javaclass" src="xalan://bitel.billing.server.util.exslt.Scripting"/>
	</xalan:component>
 	......

Вызывается так:

<xsl:value-of select="script:invoke('default','doSomething')" />

Вызов с двумя параметрами param1, param2:

<xsl:value-of select="script:invoke('default','doSomething', 'param1', 'param2')" />

Метод:

Object invoke(String lib, String method, Object arg1);
Object invoke(String lib, String method, Object arg1, Object arg2);
Object invoke(String lib, String method, Object[] args);

Значения параметров:

lib - имя библиотеки
method - имя функции
arg1, arg2 / args - параметры, которые передается в метод.

Возвращает:

объект - результат выполнения метода.

В скрипте также доступна функция getContext(), которая возвращает объект, содержащий поля:

con - объект типа java.sql.Connection, соединение с базой биллинга
log - обьект класса org.apache.log4j.Logger
public String doSomething()
{
  String result = null;
  ctx = getContext();
 
  rs = ctx.con.createStatement().executeQuery( "SELECT 5 + 5" );
  if (rs.next())
  {
    result = rs.getString( 1 );
  }
 
  ctx.log.info( "result=" + result );
 
  return result;
}

Вызов динамического кода (с версии 6.2)

Вызывает метод динамического класса.

Объявляется так:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:script="bitel.billing.server.util.exslt.DynCodeExecuter"
version="1.0">
<xsl:import href="layout.xsl"></xsl:import>

Вызывается так:

// Передается название класса, название метода, далее - параметры функции
<xsl:value-of select="script:execute('Test', 'method', 'myArg')" ></xsl:value-of>

Пример вызываемого динамического класса:

public class Test
{
    public Object method( String arg )
       throws BGException
    {
       return arg;
    }
}

В случае, если динамический класс реализует интерфейс DynCodeXslt (интерфейс, содержащий метод execute с Setup и Connection):

public class Test
    implements DynCodeXslt
{
    @Override
    public Object execute( Setup setup, Connection connection, Object[] arg )
       throws BGException
    {
       return arg;
    }
}


Вызов метода execute будет выглядеть так:

<xsl:value-of select="script:execute('Test', 'execute', 'myArg')" ></xsl:value-of>
Личные инструменты