Transformerfactory для Xslt

  • Автор темы Dimly
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

Dimly

Гость
#1
Доброго.

Возникла проблема в XSLT преобразовании данных с обработкой (форматированием) в процессе.
К примеру задача - поменять разделители "точка с запятой" на пробел. (о том чтобы заменить на тег <BR> - я уже молчу)

Имеем DATA.XML
Код:
<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="FILE.XSL"?>
.................................................................
<OfficePhone title="Office phone" value="1123 123;123;22" />
.................................................................
Имеем FILE.XSL
Код:
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xslt="urn:schemas-microsoft-com:xslt"
xmlns:ext="urn:extension-functions"
exclude-result-prefixes="xslt ext">
<xslt:script language="JavaScript" implements-prefix="ext">
function arrau(st) {
var mArr = st.split(";")
var st2 = mArr.join(" ");
return st2;
}
</xslt:script>
<xsl:output encoding="Windows-1251" method='html' indent='yes'/>
<xsl:template match="/">
.................................................................
<TD class="reportCell"><xsl:value-of select="ext:arrau2(string(OfficePhone/@value))" /></TD>
.................................................................
Если такой ХМЛ открыть в IE - то все великолепно. Значение заменяет точку с запятой на пробел.
Но если (удалив из ХМЛ вторую строку) закинуть все в Java

Код:
TransformerFactory tFactory = TransformerFactory.newInstance(); 
InputStreamReader XSLInput = new InputStreamReader(new FileInputStream("FILE.xsl"), "Cp1251"); 	
InputStreamReader XMLInput = new InputStreamReader(new FileInputStream("DATA.xml"), "CP1251"); 
Transformer transformer = tFactory.newTransformer(new StreamSource(XSLInput) );
transformer.transform(new StreamSource(XMLInput), new StreamResult(XMLOutput)); 

return XMLOutput.toString()
то XMLOutput.toString() - возвращает HTML точно до первого вызова скрипта, и после него просто корректно закрывает все теги, не обрабатывая информаци., оставляя даже это поле пустым.

Кстати если сделать вот так (на ва скриптах) , то тоже работает
Код:
source = new ActiveXObject("Microsoft.XMLDOM");
source.async = false;
style = new ActiveXObject("Microsoft.XMLDOM");
style.async = false;

source.load("DATA.XML");
style.load("FILE.xsl");

fff = source.transformNode(style);

f = new ActiveXObject("Scripting.FileSystemObject");
t = f.CreateTextFile("out.html", true);
t.Write(fff);
Переменная fff содержит корретный отработанный HTML.

Догадываюсь что это потому что само использование javaScript в XSL - фича MS... или же опять курил не те мануалы по яве.
(вместо xslt пробовал и msxslt - результат то же, да еще и явное использование фич MS)
 
D

Dimly

Гость
#2
Сорри за дубликат темы в JAVA разделе,

Проблему моментально помог решить 'turumbay'

а где собсно вопрос? утверждение: "Notesxsltransformer для Xslt, не понимает xslt:script language="JavaScript"" абсолютно верно.
спецификация xslt от w3c не включает подобные расширения. лотусовый парсер работает согласно спецификации. Если хочеца использовать MS расширения - нужно юзать MS-парсер.
Если хочеца юзать стандарты, то можно поискать тут: http://www.dpawson.co.uk/xsl/sect2/replace.html
А вообще, в вашем конкретном случае, корень проблемы в кривом XML, который кроме данных содержит их представление( разметку ). Правильный путь - изменить ( если возможно ) <OfficePhone title="Office phone" value="1123 123;123;22" /> на что-то типа
<OfficePhone title="Office phone">
<value>111</value>
<value>222</value>
<value>333</value>
</OfficePhone>
тогда и пробелы, и <br/> и все что хочешь можно добавлять.
Указанная ссылка позволяет данный вопрос решить только средствами XSL.
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#3
Догадываюсь что это потому что само использование javaScript в XSL - фича MS...
не совсем так, механизм расширений с использованием скриптовых языков реализован далеко не только MSXML. Проблема в том, что, чаще всего, эти расширения непереносимы. Поэтому надо смотреть документации по конкретной, используемой XSLT реализации.
 
Статус
Закрыто для дальнейших ответов.