XSLT Saxon

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
либо передавать уже содержимое в виде стрингов (а внутри преобразовывать как я указал прежде)
выход - тоже в стринг <!--shcode--><pre><code class='java'>//import java.io.File;
import java.io.*;
....
public static String TrasformFFF(String sourceXML, String sourceXSL)
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(new ByteArrayInputStream(sourceXSL.getBytes())));

// Transform the source XML to System.out.
ByteArrayOutputStream resultXML=new ByteArrayOutputStream();
transformer.transform(new StreamSource(new ByteArrayInputStream(sourceXML.getBytes())), new StreamResult(resultXML));
try {
String out = new String(resultXML.toByteArray(), "UTF-8");
return out;
} catch (Exception e) {
handleException(e);
}
} catch (Exception ex) {
handleException(ex);
}
return "";
}[/CODE]

Добавлено: здесь XSL и XML уже содержимое, а не имена файлов!
 
H

HelenHelen

Imike,
подскажите еще, пожалуйста, как получить стринг ответа? Конструкция вида:
Код:
MessageBox( javaTr.E2E_TransformSaxon(xml.Readtext(), xsl_2.Readtext()))
выдает мне TRUE. Соответственно, xml и xsl_2 - это NotesStream'ы.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
Imike,
подскажите еще, пожалуйста, как получить стринг ответа? Конструкция вида:
Код:
MessageBox( javaTr.E2E_TransformSaxon(xml.Readtext(), xsl_2.Readtext()))
выдает мне TRUE. Соответственно, xml и xsl_2 - это NotesStream'ы.
а код у ф-ции - как я написал выше?
 
H

HelenHelen

а код у ф-ции - как я написал выше?
сначала я забыла поменять тип функции с Boolean на String. Потом поменяла, но стринг мне возвращается пустой. По идее сам метод TransformFFF возвращает стринг, насколько я понимаю?

<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">
Код:
Function E2E_TransformSaxon (sXML As String, sXSL As String) As String 
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)

'seconds = (GetThreadInfo (6) - startTic) / GetThreadInfo (7)

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

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

E2E_TransformSaxon = saxonObj.TrasformFFF (sXML, sXSL)

ex:
Exit Function

errorHandler:
'Call ProcessError (MODULE_NAME, Err, Error, Erl, GetThreadInfo (LSI_THREAD_PROC), GetThreadInfo (LSI_THREAD_CALLPROC))
Resume Ex
End Function
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
ф-ция ReadText - ... корявая, чем её заменить - я не знаю, но она не даёт UTF-8 (вернее - там надо мудрить)
XSL яб получал напрямую из конфигурационного дока:
Код:
	Dim cfgdoc As NotesDocument
Dim cfgview As NotesView
Set cfgview=db.getView(CFG_VIEW)
Set cfgdoc=cfgview.getDocumentByKey(XSL_NAME)

Dim body As NotesRichTextItem
Set body=cfgdoc.GetFirstItem({body})

Dim txtXSL As String
txtXSL=body.GetFormattedText(False, 255)
наверняка в джава консоли ругаецо на хмл (см. её)
ругань будет типа
Error at byte 1550 of file:///C:\Program Files\lotus\notes/:
Error reported by XML parser: bad continuation of multi-byte UTF-8 sequence (code: 0xfffffff0)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
короче так<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"LS"</div></div><div class="sp-body"><div class="sp-content">
Код:
Option Public
Option Declare
Uselsx "*javacon"
Use "libXMLTransform"

Const CFG_VIEW={Configurations}
Const XSL_NAME={dxl2fo}

Sub Initialize
try:
On Error Goto catch

Dim ses As New NotesSession
Dim db As NotesDatabase
Set db=ses.CurrentDatabase

Dim cfgdoc As NotesDocument
Dim cfgview As NotesView
Set cfgview=db.getView(CFG_VIEW)
Set cfgdoc=cfgview.getDocumentByKey(XSL_NAME)

Dim body As NotesRichTextItem
Set body=cfgdoc.GetFirstItem({body})

Dim txtXSL As String
txtXSL=body.GetFormattedText(False, 255)

Dim txtXML As String

Dim doc As NotesDocument
Set doc=ses.DocumentContext
Dim exporter As NotesDXLExporter, stream As NotesStream
Set stream=ses.CreateStream
Set exporter=ses.CreateDXLExporter(doc, stream)
exporter.ForceNoteFormat=False
exporter.ConvertNotesBitmapsToGIF=True
exporter.OutputDOCTYPE=False
exporter.Process
stream.Position=0
Msgbox "size:" &stream.Bytes
'	Dim buffer As String
'	Do
'		buffer = stream.ReadText(STMREAD_LINE, EOL_CRLF)
'		txtXML=txtXML & buffer
'	Loop Until stream.IsEOS
txtXML=stream.ReadText()
'	Msgbox "size:" &Len(txtXSL) & Chr(10) &txtXSL
Msgbox "stream size:" &stream.Bytes & Chr(10) _
&"str size:" &Len(txtXML) & Chr(10) _
&txtXML

Dim res As String
res=E2E_TransformSaxon(_
txtXML,_
txtXSL)
Msgbox {str size:} &Len(res) & Chr(10) _
&res
Goto finally

catch:
Print Error,{line:} &Cstr(Erl), {#} & Cstr(Err)
Resume finally
finally:
End Sub
Private Function E2E_TransformSaxon (sXML As String,_
sXSL As String) As String

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

Dim startTic As Long

Dim seconds As Double

try:
On Error Goto catch

E2E_TransformSaxon = "*no result*"

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

startTic = Getthreadinfo (6)

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

E2E_TransformSaxon=saxonObj.TrasformFFF (sXML, sXSL)

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

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

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

Goto finally

catch:
'	Call ProcessError (MODULE_NAME, Err, Error, Erl, GetThreadInfo (LSI_THREAD_PROC), GetThreadInfo (LSI_THREAD_CALLPROC))
Print Error, Erl, Err
Resume finally

finally:
End Function
<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'>public static String TrasformFFF(String sourceXML, String sourceXSL)
throws TransformerException {
try {
System.setProperty("javax.xml.transform.TransformerFactory", "com.icl.saxon.TransformerFactoryImpl");
//"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(new ByteArrayInputStream(sourceXSL.getBytes("UTF-8"))));

// Transform the source XML to ByteArray
ByteArrayOutputStream resultXML=new ByteArrayOutputStream();
transformer.transform(new StreamSource(new ByteArrayInputStream(sourceXML.getBytes("UTF-8"))), new StreamResult(resultXML));
try {
String out = new String(resultXML.toByteArray(), "UTF-8");
System.out.println ("success, size=" + out.length());
System.out.println (out);
return out;
} catch (Exception e) {
handleException(e);
}
} catch (Exception ex) {
handleException(ex);
}
return "";
}[/CODE]
в джаве:т.к. трасформерм я взял саксон 6.5 (у мя жвм от 7-ки - 1.4) - то закоментил новый трасформер (тот кот. был изначально)
поставил принты в консоль (после отладки надо убрать)
в LS результат полностью не выводится (в msgbox видно тока шапку, может к.л. символы мешают), по размеру - совпадает с джавой, но разбираться я не стал :rolleyes:, в джава консоле - нормальный резалт отображает
 
H

HelenHelen

XSL-то я могу взять из рич-текста (спасибо за идею!! :rolleyes: ), а как быть с тем, что у меня идет преобразование dxl в потоке? Я имею в виду кусок:
Код:
Dim exporter As NotesDXLExporter

Set exporter = s.CreateDXLExporter(doc)
Set transformer_1=s.Createxsltransformer(exporter, xsl_1, xml)
exporter.OutputDOCTYPE = False
Call exporter.Process
Как мне тогда передать результат первой трансформации (ну или выгрузки, если убрать промежуточную трансформацию) в ява-стрим?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
А что даёт строка
<!--shcode--><pre><code class='java'>System.setProperty("javax.xml.transform.TransformerFactory", "com.icl.saxon.TransformerFactoryImpl");[/CODE]?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
А что даёт строка
<!--shcode--><pre><code class='java'>System.setProperty("javax.xml.transform.TransformerFactory", "com.icl.saxon.TransformerFactoryImpl");[/CODE]?
устанавливается конкретный обработчик для данного хэндлера (в этом случае - для трансформера устанвливаем обработку через saxon)
названия говорят сами за себя, следующий код смотрит на это св-во
 
H

HelenHelen

А может можно сделать все на яве, начиная от выгрузки dxl? Чтобы не было проблем с передачей потока?
И Imike, не могли бы вы выложить ваш jar-файл для саксона 6.5? А то то, что я сама скачала, ломало мне клиента((
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
ну не знаю - что там может поломать клиента...
я скачал с офсайта, выложу, разумеется (мне не жалко :rolleyes: )
Посмотреть вложение saxon_jdom.zip
с передачей потока проблемы нет - он просто не передаётся :) - передаем стринги и там я не вижу проблем (за искл. принудительной кодировки), вопрос больше в том - что с результатом делать
если отправлять дальше, в тырнет - то удобнее джава
если работать на клиенте - бридж (вызовы из формочек и т.п.)
 
H

HelenHelen

Все равно та же ошибка, что и раньше, на каждом клике((
тема с кодировкой не помогает (правда, на 9м саксоне). Все равно ответ пустой. Похоже, что придется возвращаться к идее с файликами, как это ни печально((, т.е. записать предварительный результат в файл (или WriteText тоже косячная?... я пока не пробовала), а оттуда уже брать в ява-парсер...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
выложите базу - чета вы не так делаете
вы ошибки в консоли смотрите?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
устанавливается конкретный обработчик для данного хэндлера
следующий код смотрит на это св-во
Не привязанный к данной теме вопрос: а если агенты работают в разных потоках и используют это свойство с разными значениями, это им не помешает?
 
H

HelenHelen

Выкладываю свою базу.
В первом документе лежит XSL, как вы советовали. Во втором - документ, который должен трансформироваться в dxl. Нужно его выделить кареткой и запустить агент testProcess. Сам процесс описан в процедуре ComplexHandler.Process. Java-код, который я сейчас пытаюсь добить (т.е. с получением на вход стринга), находится в библе Copy of libXMLTransform.

Понять, как запустить ява-консоль, мне так и не удалось, хотя прогуглила этот вопрос.
 

Вложения

  • XML.zip
    112,7 КБ · Просмотры: 211

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
след. неделю буду на конференции... не уверен, что смогу посмотреть
консоль , в 8.5 - Tools -> Show Java Debug Console


Добавлено:
Не привязанный к данной теме вопрос: а если агенты работают в разных потоках и используют это свойство с разными значениями, это им не помешает?
не должно, агент - это типа "отдельная жвм" :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
Выкладываю свою базу.
В первом документе лежит XSL, как вы советовали. Во втором - документ, который должен трансформироваться в dxl. Нужно его выделить кареткой и запустить агент testProcess. Сам процесс описан в процедуре ComplexHandler.Process. Java-код, который я сейчас пытаюсь добить (т.е. с получением на вход стринга), находится в библе Copy of libXMLTransform.

Понять, как запустить ява-консоль, мне так и не удалось, хотя прогуглила этот вопрос.
нет ХСЛ файла в архиве (xsl-nonamespace.xsl)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
ещё, в коде - "баден-баден":
Код:
		Call saxonObj.TrasformFFF (sXML, sXSL)
.....
E2E_TransformSaxon = saxonObj.TrasformFFF (sXML, sXSL)
два раза вызывается трансформация
 
H

HelenHelen

Добрый день всем!

SAXparser на джаве в принципе заработал, вся конструкция, которая вокруг него, тоже. Однако запускается все это через раз: требуется какое-то нереальное шаманство вроде запустить дебагер лотусскрипта - открыть джава-консоль, наверное, еще что-то, и тогда все работает отлично и в полном объеме. Перезагрузка лотусового клиента - и все, уже ничего не работает вообще... Не понимаю, как такое может быть, потому что в принципе код рабочий и отлаженный... Подскажите, пожалуйста, как решить такую проблему?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!