XSLT Saxon

  • Автор темы oshmianski
  • Дата начала
O

oshmianski

Гость
#1
использовал ли кто сабж в Lotus?

интересует трансформация XML -> XSL -> XML.

Saxon
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#2
не понятно как соотносится с ЛДН, и почему именно Saxon
если связано с ХСЛТ 2 - то понятно :(
а что конкретно хотелось бы узнать?
 
O

oshmianski

Гость
#3
Да, именно xslt 2.0 хочу заюзать.

Пущаю java на 8.5.2 (JDK 1.6) из cdm = все хорошо, трансформит.
А вот из Notes не получаетсо.

В JAVA я ламо, посему и вопрос тут.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import net.sf.saxon.Configuration;
import net.sf.saxon.TransformerFactoryImpl;
import org.xml.sax.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class TraxExamples {
public static void exampleSimple1(String sourceXML, String sourceXSL, String resultXML)
throws TransformerException {
try {
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");

// Create a transform factory instance.

//Configuration config = Configuration.newConfiguration();

TransformerFactory tfactory = TransformerFactory.newInstance();
//TransformerFactoryImpl tfactory = new TransformerFactoryImpl(config);
/*
// Create a transformer for the stylesheet.
Transformer transformer =
tfactory.newTransformer(new StreamSource(sourceXSL));

// Transform the source XML to System.out.
transformer.transform(new StreamSource(sourceXML), new StreamResult(System.out));

// Transform the source XML to System.out.
//transformer.transform(new StreamSource(sourceID), new StreamResult(new File(resultXML)));

*/
} catch (Exception ex) {
handleException(ex);
}
}

private static void handleException(Exception ex) {

System.out.println("EXCEPTION: " + ex);
ex.printStackTrace();

if (ex instanceof TransformerConfigurationException) {
System.out.println();
System.out.println("Test failed");

Throwable ex1 =
((TransformerConfigurationException) ex).getException();

if (ex1!=null) { // added by MHK
ex1.printStackTrace();

if (ex1 instanceof SAXException) {
Exception ex2 = ((SAXException) ex1).getException();

System.out.println("Internal sub-exception: ");
ex2.printStackTrace();
}
}
}
}
}[/CODE]
Ошибка в Notes:
<!--QuoteBegin-"IBM Lotus Notes"+-->
<table border="0" cellpadding="0" cellspacing="0" align="center" width="98%"> [tr] <td class="vbquote"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="75" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="50px"> [tr] <td class="vbquote" width="28" valign="top">
</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quote-bg.gif'); background-position: center;" valign="middle"><span class="vbquote">Цитата:</span></td> <td class="vbquote" valign="top">
</td> [/tr] </table> </td> <td class="vbquote" align="left" style="background-image: url('style_images/ckr/quotes/quot-lr-bg.gif')" valign="bottom"></td><td class="vbquote" width="0" align="left" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="200"> [tr] <td class="vbquote" valign="top">
</td> <td class="vbquote" width="100%" style="background-image: url('style_images/ckr/quotes/quot-bye-bg.gif')" align="left" valign="middle" nowrap="nowrap"><span class="vbquote">("IBM Lotus Notes")</span></td> <td class="vbquote" valign="top">
</td> [/tr] </table> </td><td class="vbquote" width="100%" align="right" valign="bottom"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="100%"> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" style="background-image: url('style_images/ckr/quotes/quot-top-bg.gif')" width="100%" valign="middle"></td> <td class="vbquote" align="left" valign="top">
</td> [/tr] </table> </td> [/tr] </table> </td> [/tr] </table> <table border="0" cellpadding="0" cellspacing="0" width="100%"> [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-left.gif')"></td> <td class="vbquotemain" width="100%" valign="top"></td> <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quoting-right.gif')"></td> [/tr] [tr] <td class="vbquote" width="10" style="background-image: url('style_images/ckr/quotes/quot-left-bg.gif')"></td> <td class="vbquotemain" width="100%" valign="top"><!--QuoteEBegin-->LS2J Error: Threw java.lang.ExceptionInInitializerError<!--QuoteEnd--></td> [/tr] [tr] [/tr] </table> </td> [/tr] </table>
<!--QuoteEEnd-->Ошибка в java консоли:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">java.lang.RuntimeException: Cannot read edition.properties file</div></div><div class="sp-body"><div class="sp-content"> at net.sf.saxon.Configuration.<clinit>(Configuration.java:233)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
at net.sf.saxon.TransformerFactoryImpl.<init>(TransformerFactoryImpl.java:36)
at java.lang.J9VMInternals.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1325)
at javax.xml.transform.FactoryFinder.newInstance(Unknown Source)
at javax.xml.transform.FactoryFinder.find(Unknown Source)
at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
at TraxExamples.exampleSimple1(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
a:37)
at java.lang.reflect.Method.invoke(Method.java:600)
at lotus.domino.JavaConnectInvoker.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
a:37)
at java.lang.reflect.Method.invoke(Method.java:600)
at lotus.domino.JavaConnectLoader.invoke(Unknown Source)
Я так понимаю какая-то конфигурация не нравится ему?
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#4
Я так понимаю какая-то конфигурация не нравится ему?
нет, просто lotus что то мутит с класслоадерами.
каким образом подключаешь saxon?

а самое просто и быстрое решение это пропатчить net.sf.saxon.Configuration.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#5
соблюдено ли правило - класть библы в jvm/lib/ext/ а не в базу ?
потому как ошибки вызываются при создании класса:
at java.lang.Class.newInstance(Class.java:1325)
at javax.xml.transform.FactoryFinder.newInstance(Unknown Source)
at javax.xml.transform.FactoryFinder.find(Unknown Source)
at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
 
O

oshmianski

Гость
#6
каким образом подключаешь saxon?
импортирую jar в java библиотеку.

соблюдено ли правило - класть библы в jvm/lib/ext/ а не в базу ?
нет. jar архив импортирую прямо в java библиотеку базы.
класть библу в jvm/lib/ext не очень подходит, ибо всем пользователям не "наложишь" ))) (да и скриптом это делать не особо хочется).

а самое просто и быстрое решение это пропатчить net.sf.saxon.Configuration
что значит пропатчить? это как?
 
O

oshmianski

Гость
#7
если положить jar архив в jvm/lib/ext, то все работает.
но это не очень красиво. хотелось бы все таки использовать импортированный в библу.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#8
логика класслоадера от ИБМ и "родных" (жвм) отличаются ;)
все библиотеки используют стандартный подход (через classpath)...
перехватом вызовов ИБМ жвм занимается только в ограниченном спектре
ежелиб они эмулировали ФС - не былоб отличий
и большинство библиотек, использующих фэктори и рефлекшн, не будут работать с библиотеками из базы (уж так ИБМ реализовал ;) )
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#9
импортирую jar в java библиотеку.
я не знаком с лотус терминологией

что значит пропатчить? это как?
как обычно: скачал исходники, изменил, собрал, подложил. это гораздо проще, чем кажется на первый взгляд.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#10
класть библу в jvm/lib/ext не очень подходит, ибо всем пользователям не "наложишь" ))) (да и скриптом это делать не особо хочется).
а придётся ;) либо классы надо грузить самому и инстансы подсовывать, а не вызывать загрузчики либы (хотя - это "плохой" подход)
а чего пользователю-то - ну сделайте скрипт, кот. проверит присут либы, попробует скопировать, если либыа там была и жвм запущена - будет облом, кот. можно отловить и попросить передёрнуть нотуса (скрип мона пущать при старте базы)
 
O

oshmianski

Гость
#11
т.е. кроме как положить jar в jvm/lib/ext никак?
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#14
если коротко - то никак
ты повторяешь это как мантру. это у тебя религия такая?

как минимум можно в TransformerFactory.newInstance() попробовать подсунуть свой класслоадер.

логика класслоадера от ИБМ и "родных" (жвм) отличаются
у IBM JVM которая идет с Websphere отличий не заметил.

ясно что лотусовские агенты запускаются в своеобразный песочницах из соображений безопастности, но из этого не следуют что в реализации IBM JVM есть существенные отличия.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#17
не помню, кто-то экспериментировал с подменой класслоадера - получился облом по секурити ИБМжвм

Добавлено:
у IBM JVM которая идет с Websphere отличий не заметил.
нативные классы разные, возможно, открытие секурити, по-полной, разрешит подставлять класслоадер, но получим яйца в профиль - ибо на каждом клиенте придётся менять
 

HelenHelen

Well-Known Member
31.08.2011
74
0
#18
А SAX Parser (только не лотусовский, а родной джавовский) не пробовал?
Вообще SAX когда-то считался самым экономным по памяти, сейчас не знаю.
а можно как-нибудь в лотусе запустить именно парсер, написанный на джаве? дело в том, что штатный парсер лотуса ругается на Xpath-конструкции, которые работают в SAXON 6.5.5. Конструкции правильные с точки зрения Xpath, поэтому не знаю, как их переделать, в чем отлаживать, да и вообще не вижу смысла. Гораздо лучше, на мой взгляд, прикрутить SAXON в лотус. Импортировала его jar, вопрос только в том, как теперь запустить саму трансформацию?...
 

oshmianski

Достойный программист
Lotus team
25.04.2012
546
13
#19
как-то так...

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">java-код</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='java'>import java.io.File;
//import net.sf.saxon.Configuration;
//import net.sf.saxon.TransformerFactoryImpl;
import org.xml.sax.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class SaxonXML2Transformer {

public static void TrasformFFF(String sourceXML, String sourceXSL, String resultXML)
throws TransformerException {
try {
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");

// Create a transform factory instance.
TransformerFactory tfactory = TransformerFactory.newInstance();

// Create a transformer for the stylesheet.
Transformer transformer =
tfactory.newTransformer(new StreamSource(sourceXSL));

// Transform the source XML to System.out.
transformer.transform(new StreamSource(sourceXML), new StreamResult(new File(resultXML)));

} catch (Exception ex) {
handleException(ex);
}
}

private static void handleException(Exception ex) {

System.out.println("EXCEPTION: " + ex);
ex.printStackTrace();

if (ex instanceof TransformerConfigurationException) {
System.out.println();
System.out.println("Test failed");

Throwable ex1 =
((TransformerConfigurationException) ex).getException();

if (ex1!=null) { // added by MHK
ex1.printStackTrace();

if (ex1 instanceof SAXException) {
Exception ex2 = ((SAXException) ex1).getException();

System.out.println("Internal sub-exception: ");
ex2.printStackTrace();
}
}
}
}
}[/CODE]
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">LS2J-вызов</div></div><div class="sp-body"><div class="sp-content">
Код:
Function E2E_TransformSaxon (sXML As String, sXSL As String, sTargetXML As String) As Boolean
On Error Goto errorHandler
E2E_TransformSaxon = False

Dim js As JAVASESSION 
Dim saxonClass As JAVACLASS 
Dim saxonObj As JavaObject 

Dim startTic As Long

Dim seconds As Double

Print "Трансформирую данные..."

startTic = Getthreadinfo (6)

Set js = New JAVASESSION 
Set saxonClass = js.GetClass("SaxonXML2Transformer") 
Set saxonObj = saxonClass.CreateObject ()

Call saxonObj.TrasformFFF (sXML, sXSL, sTargetXML)

seconds = (Getthreadinfo (6) - startTic) / Getthreadinfo (7)

Print "На трансформацию данных потрачено секунд: " & Format (seconds, "##0.00")

Print "Трансформирую данные...ОК"

E2E_TransformSaxon = True

ex:
Exit Function

errorHandler:
Call ProcessError (MODULE_NAME, Err, Error, Erl, Getthreadinfo (LSI_THREAD_PROC), Getthreadinfo (LSI_THREAD_CALLPROC))
Resume Ex
End Function
 
#20
дело в том, что штатный парсер лотуса ругается на Xpath-конструкции, которые работают в SAXON 6.5.5. Конструкции правильные с точки зрения Xpath, поэтому не знаю, как их переделать, в чем отлаживать, да и вообще не вижу смысла.
XPath бывает двух версий: 1.0 и 2.0. Вы наверняка заюзали что-то из  xpath 2.0 ( интересно кстати что именно ). А лотус как обычно слегка не успевает за ходом технического прогресса и штатный парсер вторую версию не поддерживает.
Гораздо лучше, на мой взгляд, прикрутить SAXON в лотус. Импортировала его jar, вопрос только в том, как теперь запустить саму трансформацию?...
Добавляете необходимые библиотеки к нужному элементу дизайна ( агенту или java-library, кнопка "edit project") и вперед, согласно документации saxon и примерам из гугла