Как преобразовать XML с помощью XSL с использованием Java - PullRequest
2 голосов
/ 04 ноября 2010

В настоящее время я использую стандартную библиотеку javax.xml.transform для преобразования моего XML в CSV с использованием XSL.Мой XSL-файл большой - около 950 строк.Мои XML-файлы также могут быть довольно большими.

На стадии прототипа все работало нормально с небольшой долей XSL около 50 строк или около того.Теперь в «окончательной системе» при выполнении преобразования возникает ошибка Смещение цели ветвления слишком велико для коротких .

private String transformXML() {
    String formattedOutput = "";
    try {

        TransformerFactory tFactory = TransformerFactory.newInstance();            
        Transformer transformer =
                tFactory.newTransformer( new StreamSource( xslFilename ) );

        StreamSource xmlSource = new StreamSource(new ByteArrayInputStream( xmlString.getBytes() ) );
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        transformer.transform( xmlSource, new StreamResult( baos ) );

        formattedOutput = baos.toString();

    } catch( Exception e ) {
        e.printStackTrace();
    }

    return formattedOutput;
}

Я обнаружил несколько сообщений об этой ошибкено не слишком уверен, что делать.
Я делаю что-то не так, мудрый код?Есть ли альтернативные сторонние трансформаторы, которые могли бы сделать это?

Спасибо,

Andez

Ответы [ 4 ]

4 голосов
/ 04 ноября 2010

Попробуйте Саксонский вместо.

Ваш код останется прежним. Все, что вам нужно сделать, это установить javax.xml.transform.TransformerFactory в net.sf.saxon.TransformerFactoryImpl в системных свойствах JVM.

3 голосов
/ 04 ноября 2010

Используйте саксонский. offtop: если вы используете одну и ту же таблицу стилей для преобразования многих файлов XML, вы можете рассмотреть шаблоны (предварительно скомпилированные таблицы стилей):

javax.xml.transform.Templates style = tFactory.newTemplates(xslSource);
style.newTransformer().transform(...);
2 голосов
/ 08 ноября 2010

Я наткнулся на пост в сети, в котором упоминается apache XALAN. Поэтому я добавил банки в свой проект. Все начало работать с тех пор, хотя я не ссылаюсь на какие-либо классы XALAN в своем коде. Насколько я могу судить, все же следует использовать классы jaxax.xml.

Не слишком уверен, что там происходит. Но это работает.

0 голосов
/ 08 июня 2013

В качестве альтернативы Saxon вы можете разбить свой большой шаблон на меньшие шаблоны.

Определения шаблонов, содержащиеся в таблицах стилей XSLT, компилируются SAP XSLT-компилятор JVM "Xalan" в методы Java для более быстрого выполнения преобразования. Инструкции ветви байт-кода Java, содержащиеся в этих Методы Java ограничены смещением 32K. Большие определения шаблонов теперь может привести к очень большим Java-методам, где смещение ветви будет должен быть больше 32К. Поэтому эти таблицы стилей не могут быть компилируется в методы Java и поэтому не может использоваться для преобразования.

Решение

Поскольку каждое определение шаблона таблицы стилей XSLT компилируется в можно использовать отдельный метод Java, используя несколько небольших шаблонов как решение. Очень большой шаблон можно разбить на несколько меньших шаблоны с использованием элемента " call-template ".

Подробно описано в этой статье Ограничение размера для таблиц стилей XSLT .

Sidenote: Я бы рекомендовал это как в крайнем случае , если саксон недоступен, так как для этого требуется немало изменений в вашем файле xsl.

...