BGBilling XSLT
Материал из BiTel WiKi
Boris (Обсуждение | вклад) |
Skn (Обсуждение | вклад) |
||
| (22 промежуточные версии не показаны) | |||
| Строка 1: | Строка 1: | ||
| - | Основная статья с описанием технологии: http://wiki.bitel.ru/index.php/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 шаблоны] | ||
| + | |||
В биллинге в качестве xslt-процессора используется Xalan. Он поддерживает XSLT 1.0. | В биллинге в качестве xslt-процессора используется Xalan. Он поддерживает XSLT 1.0. | ||
| - | + | Можно использовать его расширения(описаны по ссылке на описание технологий, приведенной выше) . | |
| - | Также | + | Также в биллинге доступны некоторые дополнительные возможности XSLT. |
== Счетчик == | == Счетчик == | ||
| Строка 48: | Строка 52: | ||
<xsl:variable name="contracts" select="sql:select( $query )"/> | <xsl:variable name="contracts" select="sql:select( $query )"/> | ||
| - | <xsl:for-each select="$ | + | <xsl:for-each select="$contracts/row"> |
<xsl:value-of select="@id"/> | <xsl:value-of select="@id"/> | ||
<xsl:value-of select="@title"/> | <xsl:value-of select="@title"/> | ||
| Строка 54: | Строка 58: | ||
</source> | </source> | ||
| - | == Использование произвольных методов Java | + | == Использование произвольных методов Java клаcсов == |
Например, вызов функции: http://bgbilling.ru/v4.5/javadoc/bitel/billing/common/CommonUtils.html#maskBlank(java.lang.String,%20java.lang.String) | Например, вызов функции: http://bgbilling.ru/v4.5/javadoc/bitel/billing/common/CommonUtils.html#maskBlank(java.lang.String,%20java.lang.String) | ||
Возможен вызов любой функции с простыми параметрами (пустой список, либо строка) из любого класса, входящего в classpath BGBillingServer. | Возможен вызов любой функции с простыми параметрами (пустой список, либо строка) из любого класса, входящего в classpath BGBillingServer. | ||
| Строка 73: | Строка 77: | ||
<source lang="xml"> | <source lang="xml"> | ||
<xsl:variable name="abon_service" select="utils:replace( '5555,44', ',', '')"/> | <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> | </source> | ||
| Строка 123: | Строка 172: | ||
:String getValue(int mid, String name);<br> | :String getValue(int mid, String name);<br> | ||
Значения параметров:<br> | Значения параметров:<br> | ||
| - | :mid - | + | :mid - код модуля, для которого читается конфиг, если 0 то читется из конфига сервера<br> |
| - | :name - | + | :name - название параметра<br> |
Возвращает:<br> | Возвращает:<br> | ||
| - | : | + | :строка - значение параметра из конфига. Если параметра нет, то пустая строка <br> |
| - | == Выполнение | + | == Выполнение функции из библиотеки скриптов (с версии 4.6) == |
| - | Выполняет | + | Выполняет функцию из библиотеки скриптов. |
Объявляется так: | Объявляется так: | ||
| Строка 140: | Строка 189: | ||
xmlns:svg="http://www.w3.org/2000/svg" | xmlns:svg="http://www.w3.org/2000/svg" | ||
xmlns:xalan="http://xml.apache.org/xalan" | xmlns:xalan="http://xml.apache.org/xalan" | ||
| - | xmlns: | + | xmlns:script="bitel.billing.server.util.exslt.Scripting"> |
...... | ...... | ||
| - | <xalan:component prefix=" | + | <xalan:component prefix="script" functions="invoke"> |
| - | <xalan:script lang="javaclass" src="xalan://bitel.billing.server.util.exslt. | + | <xalan:script lang="javaclass" src="xalan://bitel.billing.server.util.exslt.Scripting"/> |
</xalan:component> | </xalan:component> | ||
...... | ...... | ||
| Строка 150: | Строка 199: | ||
Вызывается так: | Вызывается так: | ||
<source lang="xml"> | <source lang="xml"> | ||
| - | <xsl:value-of select=" | + | <xsl:value-of select="script:invoke('default','doSomething')" /> |
</source> | </source> | ||
| + | |||
| + | Вызов с двумя параметрами param1, param2: | ||
| + | <source lang="xml"> | ||
| + | <xsl:value-of select="script:invoke('default','doSomething', 'param1', 'param2')" /> | ||
| + | </source> | ||
| + | |||
Метод:<br> | Метод:<br> | ||
| - | :String | + | :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> | Значения параметров:<br> | ||
| - | : | + | :lib - имя библиотеки<br> |
| - | : | + | :method - имя функции<br> |
| - | : | + | :arg1, arg2 / args - параметры, которые передается в метод.<br> |
Возвращает: | Возвращает: | ||
| - | : | + | :объект - результат выполнения метода.<br> |
| - | В скрипте также | + | В скрипте также доступна функция getContext(), которая возвращает объект, содержащий поля: |
| - | : con - | + | : con - объект типа java.sql.Connection, соединение с базой биллинга <br> |
| - | : log - | + | : 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Ç'"/> <!-- номер телефона (первый) - 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, 'É', $sum_part_a, '<SOH>')"/></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>
