Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > XSLT и вызов java метода. не понимаю :(


Автор: Sleepy_PIP 18.4.2006, 17:09
вот, приведу начало xslt-ника:
Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="math"
    extension-element-prefixes="math" 
    xmlns:gmr="http://www.gnome.org/gnumeric/v7"
    xmlns:math="java.lang.Math">

    <xsl:import href="search_result_xls.xsl" />
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes" encoding="UTF-8"/>

    <xsl:variable name="rows_with_shipping" select="count( /result-set/rows/row[ cell[@path='/IncludeShipping'][@alias='app']/@value='1' ] )"/>
    <xsl:variable name="rows_without_shipping" select="count( /result-set/rows/row[ cell[@path='/IncludeShipping'][@alias='app']/@value='0' ] )"/>
    <xsl:variable name="rows_params" select="count( /result-set/query-params/param[ @visible = 'true' ] )" />
    <xsl:variable name="columns">17</xsl:variable>
    <xsl:variable name="pip" select="math:sqrt(10.1)"/>
.....


беру нужный для него xml-ник,
гружу в Altova XMLSpy, натравливаю на него этот xslt-ник и получаю ошибку на 
    <xsl:variable name="pip" select="math:sqrt(10.1)"/>
о том, что Function not in namespace.
А как-же так?
    xmlns:math="java.lang.Math" - есть ведь!
В чем я не прав?
Спасибо!

 

Автор: ALKS 18.4.2006, 18:11
вот это: 
xmlns:math="java.lang.Math"
меня напугало.

может быть я не прав, но вообще math:sqrt это из EXSLT. подключать надо так: 
xmlns:math="http://exslt.org/math"

что такое EXSLT смотреть тут: http://www.exslt.org

но это пол беды. еще твой JAXP compatible transformer должен это суметь сожрать. потому как нужно чтобы была имплементация EXSLT...

и еще одно XMLSpy это не java-мир. не факт, что то что успешно отработает в XMLSpy будет так же прекрасно работать c используемыми тобой JAXP compatible имплементациями...

ну и вдогонку: есть еще стандарт XSLT 2.0 который держет custom функции. деталей я к сожалению не знаю, но знаю что sqrt таким образом можно описать и что Saxon8-B поддерживает XSLT 2.0. 

P.S. вообще нужно понимать, что стандарты XSLT не имеют с Java ничего общего... 

Автор: Sleepy_PIP 19.4.2006, 12:06
вот. добился. привожу результат.
1. SMXSpy ничего про Xalan не знает, от сбда и все проблеммы. Пришлось отлаживать путем многокр. запусков web приложения где все это используется smile(((((.

вот xslt (часть):
Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="java CONS"
    extension-element-prefixes="java CONS" 
    xmlns:gmr="http://www.gnome.org/gnumeric/v7"
        xmlns:CONS="xalan://com.*.business"
        xmlns:java="xalan://java">

    <xsl:import href="search_result_xls.xsl" />
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes" encoding="UTF-8"/>

    <xsl:variable name="rows_with_shipping" select="count( /result-set/rows/row[ cell[@path='/IncludeShipping'][@alias='app']/@value='1' ] )"/>
    <xsl:variable name="rows_without_shipping" select="count( /result-set/rows/row[ cell[@path='/IncludeShipping'][@alias='app']/@value='0' ] )"/>
    <xsl:variable name="rows_params" select="count( /result-set/query-params/param[ @visible = 'true' ] )" />
    <xsl:variable name="columns">17</xsl:variable>
    <xsl:variable name="cur_date" select="java:util.Date.new()"/>
    <xsl:variable name="dfmt" select="CONS:CONST.getHumanDateFormat()"/>

    <xsl:template match="/">
        <gmr:Workbook xmlns:gmr="http://www.gnome.org/gnumeric/v7">
            <gmr:SheetNameIndex>
                <gmr:SheetName>main</gmr:SheetName>
            </gmr:SheetNameIndex>
            <gmr:Sheets>
                <gmr:Sheet>
                    <gmr:Name>main</gmr:Name>
                    <gmr:MaxCol>-1</gmr:MaxCol>
                    <gmr:MaxRow>-1</gmr:MaxRow>
                    <!--<gmr:Zoom>0.75</gmr:Zoom>-->
                    <gmr:Scale type="percentage" percentage="75"/>

                    <xsl:call-template name="styles" />

                    <gmr:Cells>

                        <!-- write caption -->
                        <gmr:Cell Row="0" Col="5" ValueType="60">
                            <xsl:value-of select="concat(/result-set/@caption,' ',java:format($dfmt,$cur_date))"/> 
                        </gmr:Cell>
.....


теперь все прекрасно работает.
с Xalan надо пользовать
типа
        xmlns:CONS="xalan://com.*.business"
и очень дуратская система работы с созданным объектом и его методами
java:format($dfmt,$cur_date)) - где dfmt - объект тиа DateFormat, возврящаемый по CONST.getHumanDateFormat()

т.е. написать типа CONS:CONST.getHumanDateFormat().format($cur_date) - нельзя! smile((.

информация почерпнута из 
http://xml.apache.org/xalan-j/extensions.html#java-namespace

А может кто посоветовать XML редактор с XSLT преобразователем, который может использовать Xalan?
Спасибо! 

Автор: ALKS 19.4.2006, 12:21
Я пользуюсь этим:
http://www.editix.com/release.html

Он позволяет подключать произвольный JAXP compaible парсер и/или трансформер(и Хalan естественно в том числе) можно играть с разными имплементациями и их версиями, как следствие. да и вообще мощный, полноценный XML-Editor.

P.S. Не знал что Xalan такое умеет. Но я бы в любом случае так не делал. твой XSL, подозреваю, не переносим теперь даже между различными имплементациями JAXP а про мир вне Java даже реч не идет... 

Автор: LSD 19.4.2006, 12:21
Цитата(Sleepy_PIP @  19.4.2006,  13:06 Найти цитируемый пост)
А может кто посоветовать XML редактор с XSLT преобразователем, который может использовать Xalan?

Попробуй Stylus Studio XML, по моему он поддерживает Xalan. 

Автор: Sleepy_PIP 19.4.2006, 16:22
To ALKS & LSD - большое СПАСИБО за наводки. правда Stylus платный. а я бедный довольно сильно как и контора.

То ALKS
я пользую xslt-fo - с сериалайзером в эсель (xls).
В исходном XML нет и не будет даты генерации отчета. А юзера хотят дату и время в эеселе.
Что-бы Вы предложили?

Добавлено @ 16:25 
блин. я хотел сказать Exсel smile ... извините! 

Автор: ALKS 19.4.2006, 17:44
smile Если у вас нету даты генерации отчета, то какую дату вы можете предложить вашим жаждущим пользователям? дату файла? дату когда фаил был с конвертирован в формат Excel? я полагаю это не совсем те даты которые им нужны. у вас же нету данных. 

если у вас нету куска пластелина то вы не cможете показать другу слепленный из пластилина кубик smile как бы сильно ваш друг не хотeл это увидеть smile  

Автор: Sleepy_PIP 19.4.2006, 19:06
To ALKS (к сожалению - цитирование НЕ работает - это МОДЕРАТОРАМ и сисопам! - просто цитириуем а потом ссылки по предв. просмотру и публикации - просто ничего не делают)

Увы, вынужден Вас огорчить.
Генерация xml варианта отчета ни одному пользователю лично у нас не нужна, посему именно сразу после генерации накладывается преобразование в нужный (и выбранный пользователем ) формат.
Если у Вас по другому - я опускаю кисточку и палитру перед Вами! smile.
Так вы так и не ответили мне на простой вопрос - как получить _правильно_ с точки зрения xslt дату генерации отчета если ее нет в исходном xml.
Извините - xml исходный уже не подправить - по разделению прав (дуратскому, принятому только с внедрением XSLT) источник генерации xml уже не доступен smile.
Итак?
Конечно дурных отзывов можно написать много, что не правильно учтена постановка задачи для входного xml к примеру. 
Ага. только требование вот понимаете, народилось гораздо позже, чем была произведена постановка задачи на xml входной.
Право слово - порой кажется что некоторые сидят (я не про Вас конкретно) на разовой работе - получил ТЗ детерминированное, сделал - отвалил ...
вот и результат кстати, который я и обсуждаю ...
Бога Ради! простите за резкость. но надоели разовые решения и размазывание алгоритмов по всяческим технологиям.
Все ведь просто - был-бы класс, генерирующий БЕЗ xslt прямой XLS - поправил-бы я его и все ... а тут ...
А ведь простейшая проблемка -то возникла. а сколько трудов ..., съеденнго инета, напряжения других людей.
Итак - все-ж жду предложений как это сделать не прибегая к вызовам java методов в xslt ...
PS: простите все, я не гуру в XSLT но блин - из-за одной даты потратил более 4-х часов.... никуда не годится ...

Добавлено @ 19:09 
прикольно. у меня часы кажут 20:08 (время -2 минуты публикации мессага)
а пред. письмо по часам сайта
Дата 19.4.2006, 19:06 (ссылка)

эээ. вроде не есть хорошо. 
 
 

Автор: ALKS 19.4.2006, 20:55
А я тебе уже давал линк smile - http://www.exslt.org/date/functions/date/index.html

Код

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:value-of select="date:date()"/>:
    </xsl:template>
</xsl:stylesheet>


Xalan последней версии это умеет, как и заявлено на сайте EXSLT. я проверил.

а вот как эту дату форматировать это уже вопрос второй. smile  

Вообще Sleepy я тебе настоятельно рекомендую разобраться с EXSLT, хотя бы потому что EXSLT достаточно широко поддерживается за пределами java трансформатерров (я почти на 100% уверен что например XMLSpy поймёт EXSLT) и IMHO это более правильный путь чем неявный вызов JAVA API. 

P.S. вообще лично я использую Saxon а не Xalan. главным образом потому что SAXON поддерживает XSLT 2.0 и XPath 2.0. а XPath 2.0 это вот: http://www.w3.org/TR/2001/WD-xquery-operators-20011220/  -  что ещё  нужно для счастья?

  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)