Transformerfactory для Xslt

Тема в разделе "Java", создана пользователем Dimly, 2 авг 2010.

Статус темы:
Закрыта.
  1. Dimly

    Dimly Гость

    Доброго.

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

    Имеем DATA.XML
    Код (Text):
    <?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
    Код (Text):
    <?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

    Код (Text):
    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 точно до первого вызова скрипта, и после него просто корректно закрывает все теги, не обрабатывая информаци., оставляя даже это поле пустым.

    Кстати если сделать вот так (на ва скриптах) , то тоже работает
    Код (Text):
    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)
     
  2. Dimly

    Dimly Гость

    Сорри за дубликат темы в JAVA разделе,

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

    Указанная ссылка позволяет данный вопрос решить только средствами XSL.
     
  3. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    не совсем так, механизм расширений с использованием скриптовых языков реализован далеко не только MSXML. Проблема в том, что, чаще всего, эти расширения непереносимы. Поэтому надо смотреть документации по конкретной, используемой XSLT реализации.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей