XSLT Saxon

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

HelenHelen

А, ну раз так... Я просто оптимизировать думала)) Спасибо большое, сейчас попробую тогда...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
если имя элемента менять не надо, то делаем:
Код:
	<xsl:template match="ldn:item">
<xsl:if test="@name='mobilephone'">
<xsl:element name="{@name}"><xsl:value-of select="." /></xsl:element>
<!--<mobilephone><xsl:value-of select="." /></mobilephone>-->
</xsl:if>
</xsl:template>
 
H

HelenHelen

Хотела сейчас попробовать новую схему - оказалось, что проблема совсем в другом. Если записать dxl-строку в файл
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">сохранение dxl в файл</div></div><div class="sp-body"><div class="sp-content">
Код:
Dim exporter As NotesDXLExporter
Set exporter = s.CreateDXLExporter
exporter.OutputDOCTYPE = False
dxl=exporter.Export(xmlDoc)

'выгружаем в файл
fileNum=FreeFile()
fileName="D:\Equifax\logs\"+Today+"№ "+xmlDoc.claimNo(0)+" "+xmlDoc.F(0)".xml"
Open fileName For Output As fileNum
Write #fileNum, dxl
Close fileNum

'принтуем в консоль
Print "DXL: " dxl

'сохраняем в RT-поле		
Call xmlDoc.Replaceitemvalue("xmlDxlResult", dxl)

то получается, что уже в дхл половина скобок подменяется ">" и "<", и на вход в парсер подается уже поломанная строчка... Когда я смотрела результат, сохраненный в РТ-поле, этого не было видно, похоже, Лотус сам интерпретировал эти инструкции в скобки. Код отрабатывает на чистом, только что установленном лотусовом сервере. На моей локальной машине все работало (до переустановки системы, которая потребовалась из-за посыпавшегося харда)... Может, что-то нужно в ОС настроить?...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
у-у-у как все запутано :)
сохраняйте NotesStream, его же и получайте из дока сразу (в экспортере)

Добавлено: а вот кусок преобраз. стрим из дока в IntupStream:<!--shcode--><pre><code class='java'> DxlExporter exporter = session.createDxlExporter();
exporter.setForceNoteFormat(false);
exporter.setConvertNotesBitmapsToGIF(true);
exporter.setOutputDOCTYPE(false);

Stream stream = session.createStream();
//if (stream.open(filename, "UTF-8")) {
// stream.truncate();
System.out.println("Exported " + stream.writeText(exporter.exportDxl(doc)) +
" bytes ");//to "+filename);
System.out.println(exporter.getLog());
//}
// stream.close();
//пробразуем выходной поток во входной
ByteArrayOutputStream osxml=new ByteArrayOutputStream();
stream.getContents(osxml);
InputStream isxml=new ByteArrayInputStream(osxml.toByteArray());[/CODE]
 
H

HelenHelen

А парсер на вход принимает стринг, если я не ошибаюсь... Функция readText - косячная, как вы сами говорили мне по этому вопросу некоторое время назад... Плюс мне очень желательно, чтобы промежуточные хмл-ки сохранялись куда-нибудь, лучше всего, в РТ-поля, ну или хотя бы в файлики
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
все (с кот. я сталкивался) парсеры принимают InputStream (в java)

Добавлено: или StreamSource: Source src = new StreamSource(isxml);
чтобы промежуточные хмл-ки сохранялись куда-нибудь
не понял - есть хмл, хсл и выходно хмл
все промежуточные отсутствуют
ну если надо дхл - просто скажите OutputStream куда сохранить
 
H

HelenHelen

В итоге мне нужно создать еще одну java-функцию? Как мне передать в нее нужный док? Как object?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
типа стандартно:<!--shcode--><pre><code class='java'> Session session = getSession();
AgentContext agentContext = session.getAgentContext();

// (Your code goes here)
Database db = agentContext.getCurrentDatabase();
Document doc = db.getDocumentByID(agent.getParameterDocID());[/CODE]
 
H

HelenHelen

Imike,
переписала вызов трансформации в яву. Дхл выгружается, падаю на конструкции

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
TransformerFactory tfactory = TransformerFactory.newInstance();

Agent error: java.lang.NoClassDefFoundError: net.sf.saxon.Configuration (initialization failure)
Дальше, соответственно, ничего не работает.

jar саксона я подложила в jvm/lib/ext на сервере, где исполняется код. Импорт не помогает:

import net.sf.saxon.Configuration;
import net.sf.saxon.TransformerFactoryImpl;

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

Чего ему не хватает?...
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Нужен полный стэктрейс, класс net.sf.saxon.Configuration находится, но какой то из его статических инициализаторов падает с исключением
 
H

HelenHelen

19.07.2013 13:54:14 Agent error: Exception in thread "AgentThread: JavaAgent"
19.07.2013 13:54:14 Agent error: java.lang.NoClassDefFoundError: net.sf.saxon.Configuration (initialization failure)
19.07.2013 13:54:14 Agent error: at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
19.07.2013 13:54:14 Agent error: at net.sf.saxon.TransformerFactoryImpl.<init>(TransformerFactoryImpl.java:36)
19.07.2013 13:54:14 Agent error: at java.lang.J9VMInternals.newInstanceImpl(Native Method)
19.07.2013 13:54:14 Agent error: at java.lang.Class.newInstance(Class.java:1474)
19.07.2013 13:54:14 Agent error: at javax.xml.transform.FactoryFinder.newInstance(Unknown Source)
19.07.2013 13:54:14 Agent error: at javax.xml.transform.FactoryFinder.find(Unknown Source)
19.07.2013 13:54:14 Agent error: at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
19.07.2013 13:54:14 Agent error: at JavaAgent.NotesMain(Unknown Source)
19.07.2013 13:54:14 Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
19.07.2013 13:54:14 Agent error: at lotus.domino.NotesThread.run(Unknown Source)
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Чуть ниже, что нибудь типа "caused by ...." не было?! Если нет, то надо искать исключения произошедшие чуть раньше java.lang.NoClassDefFoundError
К сожалению, исходное исключение может съедаться, тогда берутся или декомпилируются исходники, ставится бряк поближе и смотрится что же там падает.
Я правда не знаю, насколько это реализуемо в лотусе
 
H

HelenHelen

Kmet,
ниже привожу полный код ява-агента. Больше никаких исключений в логе у меня нет. До этой строчки 100% все работает, потому что в лог распечатывается выгруженный DXL, т.е. точно все хорошо. Что же может быть не так?..
<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 lotus.domino.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import net.sf.saxon.Configuration;


public class JavaAgent extends AgentBase {

public void NotesMain() {

try {
System.out.println("Java-агент стартовал");
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Agent agent = agentContext.getCurrentAgent();
Database db = agentContext.getCurrentDatabase();
Document doc = db.getDocumentByID(agent.getParameterDocID());
System.out.println(doc.getFirstItem("F").getText());

DxlExporter exporter = session.createDxlExporter();
exporter.setForceNoteFormat(false);
exporter.setConvertNotesBitmapsToGIF(true);
exporter.setOutputDOCTYPE(false);

Stream stream = session.createStream();

String dxl=exporter.exportDxl(doc);
System.out.println("Exported >>>>>" + dxl);

//ТРАНСФОРМАЦИЯ
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.
//получим XSL
View xmlView=db.getView("XML");
Document XSL_1_doc=xmlView.getDocumentByKey("XML_1");
String sourceXSL=XSL_1_doc.getFirstItem("Content").getText();
System.out.println(sourceXSL);

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(dxl.getBytes())), new StreamResult(resultXML));

String out = new String(resultXML.toByteArray(), "UTF-8");
System.out.println(out);

} catch(Exception e) {
e.printStackTrace();
}
}
}[/CODE]
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Код агента тут вряд ли чем то поможет. тут проблема скорее всего в настройках, класслоадеров
если посмотреть исходники и поиграть в Вангу,
то можно предположить что не хватает прав на System.getProperty("java.vendor")
 
K

Kee_Keekkenen

ну, вроде же ошибка указана
19.07.2013 13:54:14 Agent error: java.lang.NoClassDefFoundError: net.sf.saxon.Configuration (initialization failure)

делается
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");

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

ничего не замечаете?

применяете свойство для объекта, который еще не создан.. а потом его создаете..

я, конечно, могу ошибаться, т.к. с этим добром не работал.. но факт что класс еще не загружен, а его уже пользуют..
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
HelenHelen
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
для разных версий saxon классы разные! - надо залезть внутрь jar и посмотреть как называется класс (вместе с вложенными каталогами - кот. и пишут через точки)
сервак нужно передерунуть (после положения либы в jvm/lib/ext
 
H

HelenHelen

Imike,
для разных версий saxon классы разные! - надо залезть внутрь jar и посмотреть как называется класс
Посмотрела, называется net.sf.saxon.TransformerFactoryImpl.class, т.е., видимо, правильно... Я так понимаю, что это ClassPath? В случае с jar его больше нигде не надо прописывать? Сервер перезагружала после того, как подкладывала jar...

Kee_Keekkenen,
на мой взгляд:
1. <!--shcode--><pre><code class='java'>System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");[/CODE]
Эта строчка устанавливает значение системного свойства javax.xml.transform.TransformerFactory в net.sf.saxon.TransformerFactoryImpl, т.е. говорит вместо штатной фабрики использовать саксоновскую.
2. <!--shcode--><pre><code class='java'>TransformerFactory tfactory = TransformerFactory.newInstance();[/CODE]
После того, как мы указали, какой трансформатор нам нужен, мы создаем новый инстанс. Если создадим инстанс до этого, он будет штатный, а не саксоновский.
В принципе можно так:
<!--shcode--><pre><code class='java'>TransformerFactory tfactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);[/CODE], явно указать, что использовать при создании данного инстанса.

Падение происходит именно на второй строчке (после первой поставила принт, он есть в логах). На тематических форумах при такой ошибке предлагается проверить, нет ли в самом теле класса моментов, где при инициализации возникает Runtime Exception. Я попробовала посмотреть - там есть множество ссылок на классы, которые не импортированы в агент. Если импортировать (что-нибудь из net.sf.saxon), то редактор кода пишет, что эти объекты не используются...
В каком направлении смотреть дальше, не знаю, подскажите, плиз...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
471
ваще у разных саксонов разный набор сопутствующих либ и их тоже надо туда засовывать (jvm/lib/ext/)
 
Мы в соцсетях:

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