forum.bitel.ru
http://forum.bitel.ru/

xalan:nodeset()
http://forum.bitel.ru/viewtopic.php?f=14&t=1855
Страница 1 из 1

Автор:  Jimson [ 27 янв 2009, 22:39 ]
Заголовок сообщения:  xalan:nodeset()

<xsl:variable name="xmlsql" select="sql:select('select xml_content from xml_test_table')" />
<xsl:variable name="xmltest" select="$xmlsql/row[1]/@xml_content" />
<xsl:for-each select="xalan:nodeset($xmltest)//*">.....

такое будет работать ?
с объявленной переменной явно в тексте стиля работает, а если попытаться получить XML текст из базы то for-each не делает итераций вообще, как будто nodeset возращает пустоту

P.S. типа да, я пытаюсь извратиться нарисовать сложный отчет... еще такая ерунда

<xsl:variable name="sqlq" select="sql:select('select var from testtable')"/>
<xsl:variable name="xmltest">
<xsl:for-each select="$sqlq/row">
<spin><xsl:value-of select="@var"/></spin>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="xalan:nodeset($xmltest)//*">
<fo:block><xsl:value-of select="."/></fo:block>
</xsl:for-each>

вообщем это тоже не работает как хотелось бы, если вместо <xsl:value-of select="@var"/> вставить просто текст какой то то все получается как и ожидается, вылазит нестолько раз (ровно столько сколько было в итераций по $sqlq/row) этот текст, а при попытке вытащить значение @var выходит пустота, я подохреваю что тут проблема в контексте из которого я пытаюсь вытащить этот @var, он этот атрибут ищет в <spin> ? тогда как обратится к текущему $sqlq/row ? через parent::*/@var тоже не выходит


P.P.S. тяжко очень осваивается xslt, все доки какие то непонятные нифига, даже о'рейли не помогает, реальных возможностей что то напрограмить в xslt нету, и что самое обидное в mysql тоже (из за ущербности хранимых функций и отсутсвии нормально plsql), все мои идеи упираются в стенки :)

Автор:  Jimson [ 04 фев 2009, 04:20 ]
Заголовок сообщения: 

* бьюсь головой в монитор в истерике

скажите как обойди колючую проволоку и вытащить из базы XML в чистом виде, который затем можно обработать аплай темплейтом или for-each :)

Автор:  Администратор [ 04 фев 2009, 17:31 ]
Заголовок сообщения: 

C nodeset не работал.. Как вариант - можете написать Java расширение, скомпилить, подключить и использовать..
P.S. Кинул в TODO возможность вызова BGBS функций в шаблонах.

Автор:  Jimson [ 04 фев 2009, 20:58 ]
Заголовок сообщения: 

nodeset это обычный обман интерпритатора XSL, лечение недостатка XSL 1.0, суть в том что там отдельный тип данных какой то RFT или чет такое, типа конечный узел XML, который не совпадает с типом данным XML
не помню уже слова правильные, но
<xsl:variable name=var">
<MYELEM>
<SUBELEM></SUBELEM>
</MYELEM>
</xsl:variable>
с точки зреня XSl 1.0 не является XML деревом, и заюзать его например через <xsl:for-each select="$var/node()"> нельзя, для этого все интерпритаторы включая xalan реализуют функцию nodeset, приведение типа

<xsl:for-each select="xalan:nodeset($var)/Node()">

к теме возврата из SQLQuery XML это все врядли отношение имеет, так как походу вы квотите угловые скобки в значениях вытаскиваемых из mysql, расскажите хотя бы что вы делаете, может можно будет востановить эти симворы через replace....

Администратор писал(а):
C nodeset не работал.. Как вариант - можете написать Java расширение, скомпилить, подключить и использовать..

с удовольствием, если расскажите хотя бы примерно что читать на эту тему кроме собственно док по програмирования на жаве ) точнее куда именно копать на тему сопряжения XSL интепритатора внутри билинга со своими расширениями и где описана структура классов которые устроят XSL интерпритатор

Автор:  Администратор [ 05 фев 2009, 12:55 ]
Заголовок сообщения: 

Начните отсюда:
http://wiki.bgbilling.ru/index.php/XSLT
http://wiki.bitel.ru/index.php/XSLT

Его устроит любой Java класс, только там ограничены типы параметров и возвращаемых методами результатов.

Класс должен быть подключен в CLASSPATH сервера биллинга, как сделать - смотрите доки по Java.

Автор:  Jimson [ 06 фев 2009, 03:17 ]
Заголовок сообщения: 

Попробовал объявить компонент на javascript и опять обломался

<xalan:component prefix="race" functions="getdate">
<xalan:script lang="javascript">
function getdate(numdays) {
return "превед красавчег";
}
</xalan:script>
</xalan:component>

враги не пройдут ? :)
http://xml.apache.org/xalan-j/extensions.html

P.S. нашел вроде доки по типам и примерчики как расширять xsl своими класами, будем пробовать, спасиб
заодно нашел описание как в FOp делать несколько колонок на странице, вообще жара :)

Автор:  Jimson [ 24 фев 2009, 00:35 ]
Заголовок сообщения: 

не подскажете чем отличается

<xsl:variable name="xx" select="sql:select( $query )" />

от

<xsl:variable name="xx">
<xsl:value-of select="sql:select( $query )" />
</xsl:variable>


уже сил никаких нет, мало припонов со стороны собственно стандартов таблиц стилей, так еще начинается явный глюкодром

даже xalan:nodeset() не помагает во втором варианте, пустое дерево, хотя если переписать через variable select то все нормально, за идентичность запроса и его корректность я отвечаю руками...

Автор:  Jimson [ 24 фев 2009, 03:39 ]
Заголовок сообщения: 

Реально убрать мат на пустой query ?

Я пытаюсь закрыть условиями часть обращений к базе данных, пытался сделать условие так

<xsl:variable name="result">
<xsl:if test="...."
<xsl:value-of select="sql:select( $query )" />
</xsl:if>
</xsl:variable>

в result при этом выходит какая то каша полная, даже xalan:nodeset не может там ничего живого найти

ок, пытаюсь как обычно костылями обойтись

<xsl:variable name="query">
<xsl:if test="...."
SELECT .......
</xsl:if>
</xsl:variable>
<xsl:variable name="result" select="sql:select( $query )" />

получаем 200 строк мата в логи о великой беде:

ERROR 24.02.2009 00:01:05 Error on query: Query was empty
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Query was empty

щас прийдется вместо xsl:if совать choose и в otherwise писать что то вроде 'select 1 as preved'

Автор:  Amir [ 25 фев 2009, 16:57 ]
Заголовок сообщения: 

<xsl:variable name="xx" select="sql:select( $query )" />
тип variable будет типом возвращенного значения (string, int, etc.)

<xsl:variable name="xx">
<xsl:value-of select="sql:select( $query )" />
</xsl:variable>
тип variable будет только string

<xsl:variable name="query">
<xsl:if test="...."
SELECT .......
</xsl:if>
</xsl:variable>
здесь похоже условие if не отрабатывает и получаем sql:select( '' )
а за ним Error on query: Query was empty

попробуйте так
<xsl:variable name="xx" select="sql:select( $query )[$condition]" />

Автор:  Jimson [ 25 фев 2009, 22:51 ]
Заголовок сообщения: 

не очень понял при чем тут предикат...
у меня как раз проблема была в том что бы условиями заблокировать обращения к БД когда параметров не хватает, те если у меня не определен ID то запрос просто превращается в пустую строку и sql:select молча возвращает пустоту и не парится, а уже мои проблемы дальше проверить что у меня запрос вернул пустоту

вообщем прикладываю свою версию ацкой "фактуры", с актами и детализациями по IPN и VoIP, может кому пригодится в качестве example по извращениям на XSL, вариант не окончательный в плане оформления

p.s. да и... печается нормально это только через сохранение в PDF и печать через акробат, FO визуализация и печать коряво обращаются с мелкими объектами, например таблица которая в PDF имеет на страницу 180 строк на печати через FO получается на 210+ строк, не говорю уже про теряющиеся стили border's и тп.

Вложения:
Комментарий к файлу: не советую пытаться программировать на XSL :)
race_invoice_pdf.rar [10.32 КБ]
Скачиваний: 405

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/