Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/432: Рейтинг темы: голосов - 432, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 13.10.2005
Сообщений: 848
1

XSLT Saxon

05.10.2010, 17:27. Показов 78959. Ответов 107
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
использовал ли кто сабж в Lotus?

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

Saxon
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2010, 17:27
Ответы с готовыми решениями:

XSLT и т.д.
Тема по общим вопросам и проблемам, возникающим при работе с XSLT. Ссылки на смежные темы: • •...

Readviewentries & Xslt
Добрый день, раньше как-то не приходилось ничего делать под веб, а тут столкнулся с такой задачей:...

Notesxsltransformer для Xslt
Доброго. Возникла проблема в XSLT преобразовании данных с обработкой (форматированием) в...

XSLT 3.0
наконец-то появилась доступная для закачки .NET версия последней реализации XSLT 3.0 от Saxonic...

107
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
13.01.2013, 16:19 41
Author24 — интернет-сервис помощи студентам
либо передавать уже содержимое в виде стрингов (а внутри преобразовывать как я указал прежде)
выход - тоже в стринг <!--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 уже содержимое, а не имена файлов!
0
0 / 0 / 0
Регистрация: 27.08.2011
Сообщений: 71
16.01.2013, 11:51 42
Imike,
подскажите еще, пожалуйста, как получить стринг ответа? Конструкция вида:

LotusScript
1
MessageBox( javaTr.E2E_TransformSaxon(xml.Readtext(), xsl_2.Readtext()))
выдает мне TRUE. Соответственно, xml и xsl_2 - это NotesStreamы.
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
16.01.2013, 13:03 43
Цитата Сообщение от HelenHelen
Imike,
подскажите еще, пожалуйста, как получить стринг ответа? Конструкция вида:

LotusScript
1
MessageBox( javaTr.E2E_TransformSaxon(xml.Readtext(), xsl_2.Readtext()))
выдает мне TRUE. Соответственно, xml и xsl_2 - это NotesStreamы.
а код у ф-ции - как я написал выше?
0
0 / 0 / 0
Регистрация: 27.08.2011
Сообщений: 71
16.01.2013, 15:51 44
Цитата Сообщение от lmike
а код у ф-ции - как я написал выше?
сначала я забыла поменять тип функции с 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">

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
16.01.2013, 16:05 45
ф-ция ReadText - ... корявая, чем её заменить - я не знаю, но она не даёт UTF-8 (вернее - там надо мудрить)
XSL яб получал напрямую из конфигурационного дока:

LotusScript
1
2
3
4
5
6
7
8
9
10
    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)
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
16.01.2013, 17:08 46
короче так<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">

LotusScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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.ConvertNotesBytmapsToGIF=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 видно тока шапку, может к.л. символы мешают), по размеру - совпадает с джавой, но разбираться я не стал , в джава консоле - нормальный резалт отображает
0
0 / 0 / 0
Регистрация: 27.08.2011
Сообщений: 71
16.01.2013, 17:37 47
XSL-то я могу взять из рич-текста (спасибо за идею!! ), а как быть с тем, что у меня идет преобразование dxl в потоке? Я имею в виду кусок:

LotusScript
1
2
3
4
5
6
Dim exporter As NotesDXLExporter
 
Set exporter = s.CreateDXLExporter(doc)
Set transformer_1=s.Createxsltransformer(exporter, xsl_1, xml)
exporter.OutputDOCTYPE = False
Call exporter.Process
Как мне тогда передать результат первой трансформации (ну или выгрузки, если убрать промежуточную трансформацию) в ява-стрим?
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
16.01.2013, 17:51 48
следующий пост
там прикрутить кодировку в джаве, т.е после readtext, в джава кодировку ставим (принудительно)
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
16.01.2013, 20:13 49
А что даёт строка
<!--shcode--><pre><code class=java>System.setProperty("javax.xml.transform.TransformerFactory", "com.icl.saxon.TransformerFactoryImpl");[/CODE]?
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
16.01.2013, 21:45 50
Цитата Сообщение от VladSh
А что даёт строка
<!--shcode--><pre><code class=java>System.setProperty("javax.xml.transform.TransformerFactory", "com.icl.saxon.TransformerFactoryImpl");[/CODE]?
устанавливается конкретный обработчик для данного хэндлера (в этом случае - для трансформера устанвливаем обработку через saxon)
названия говорят сами за себя, следующий код смотрит на это св-во
0
0 / 0 / 0
Регистрация: 27.08.2011
Сообщений: 71
17.01.2013, 07:15 51
А может можно сделать все на яве, начиная от выгрузки dxl? Чтобы не было проблем с передачей потока?
И Imike, не могли бы вы выложить ваш jar-файл для саксона 6.5? А то то, что я сама скачала, ломало мне клиента((
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
17.01.2013, 12:51 52
ну не знаю - что там может поломать клиента...
я скачал с офсайта, выложу, разумеется (мне не жалко )
Посмотреть вложение saxon_jdom.zip

с передачей потока проблемы нет - он просто не передаётся - передаем стринги и там я не вижу проблем (за искл. принудительной кодировки), вопрос больше в том - что с результатом делать
если отправлять дальше, в тырнет - то удобнее джава
если работать на клиенте - бридж (вызовы из формочек и т.п.)
0
0 / 0 / 0
Регистрация: 27.08.2011
Сообщений: 71
17.01.2013, 20:06 53
Все равно та же ошибка, что и раньше, на каждом клике((
тема с кодировкой не помогает (правда, на 9м саксоне). Все равно ответ пустой. Похоже, что придется возвращаться к идее с файликами, как это ни печально((, т.е. записать предварительный результат в файл (или WriteText тоже косячная?... я пока не пробовала), а оттуда уже брать в ява-парсер...
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
17.01.2013, 20:26 54
выложите базу - чета вы не так делаете
вы ошибки в консоли смотрите?
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
17.01.2013, 22:51 55
Цитата Сообщение от lmike
устанавливается конкретный обработчик для данного хэндлера
следующий код смотрит на это св-во
Не привязанный к данной теме вопрос: а если агенты работают в разных потоках и используют это свойство с разными значениями, это им не помешает?
0
0 / 0 / 0
Регистрация: 27.08.2011
Сообщений: 71
19.01.2013, 15:04 56
Выкладываю свою базу.
В первом документе лежит XSL, как вы советовали. Во втором - документ, который должен трансформироваться в dxl. Нужно его выделить кареткой и запустить агент testProcess. Сам процесс описан в процедуре ComplexHandler.Process. Java-код, который я сейчас пытаюсь добить (т.е. с получением на вход стринга), находится в библе Copy of libXMLTransform.

Понять, как запустить ява-консоль, мне так и не удалось, хотя прогуглила этот вопрос.
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
19.01.2013, 20:57 57
след. неделю буду на конференции... не уверен, что смогу посмотреть
консоль , в 8.5 - Tools -> Show Java Debug Console


Добавлено:


Цитата Сообщение от VladSh
Не привязанный к данной теме вопрос: а если агенты работают в разных потоках и используют это свойство с разными значениями, это им не помешает?
не должно, агент - это типа "отдельная жвм"
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
24.01.2013, 16:42 58
Цитата Сообщение от HelenHelen
Выкладываю свою базу.
В первом документе лежит XSL, как вы советовали. Во втором - документ, который должен трансформироваться в dxl. Нужно его выделить кареткой и запустить агент testProcess. Сам процесс описан в процедуре ComplexHandler.Process. Java-код, который я сейчас пытаюсь добить (т.е. с получением на вход стринга), находится в библе Copy of libXMLTransform.

Понять, как запустить ява-консоль, мне так и не удалось, хотя прогуглила этот вопрос.
нет ХСЛ файла в архиве (xsl-nonamespace.xsl)
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
24.01.2013, 17:17 59
ещё, в коде - "баден-баден":

LotusScript
1
2
3
        Call saxonObj.TrasformFFF (sXML, sXSL)
.....
E2E_TransformSaxon = saxonObj.TrasformFFF (sXML, sXSL)
два раза вызывается трансформация
0
0 / 0 / 0
Регистрация: 27.08.2011
Сообщений: 71
17.02.2013, 14:31 60
Добрый день всем!

SAXparser на джаве в принципе заработал, вся конструкция, которая вокруг него, тоже. Однако запускается все это через раз: требуется какое-то нереальное шаманство вроде запустить дебагер лотусскрипта - открыть джава-консоль, наверное, еще что-то, и тогда все работает отлично и в полном объеме. Перезагрузка лотусового клиента - и все, уже ничего не работает вообще... Не понимаю, как такое может быть, потому что в принципе код рабочий и отлаженный... Подскажите, пожалуйста, как решить такую проблему?
0
17.02.2013, 14:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2013, 14:31
Помогаю со студенческими работами здесь

XSLT
Народ, каким образом можно написать XSLT шаблон, чтобы сымулировать команду include. Т. е.: Есть...

XSLT рекурсия
вопрос в том, как мне сделать рекурсию с определенным количеством раз... делаю многоуровневое...

Xslt преобразование
Здравствуйте есть тэг в d xml файле &lt;C_NAZN&gt;KEY_ddvdvdv:989898; LAST:24432432434; &lt;/C_NAZN&gt; ...

Меню на XSLT
Доброго времени суток! Используется закрытая CMS на ASP.NET Все контролы уже спрограммированы и не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru