BGBilling 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://abilling.ru/v4.5/javadoc/bitel/billing/common/CommonUtils.html#maskBlank(java.lang.String,%20java.lang.String) Возможен вызов любой функции с простыми параметрами (пустой список, либо строка) из любого класса, входящего в classpath BillingServer.

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

<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>