2012-06-04 2 views
3

Я обычно использую поддержку XSLT в JDK (JDK 7) для преобразований XSLT. Недавно я столкнулся с довольно большим XML-документом, и применение XSLT-преобразований к этому (даже очень базовому) приводит к тому, что большая часть памяти используется.Инкрементные/потоковые преобразования XSLT?

Я старался сделать все свои потоки обработки, но кажется, что движок XSLT в JDK (который, как представляется, модифицированный Xalan) всегда создает DOM в памяти в первую очередь. Очевидно, это не то, что я хочу.

Теперь я узнал, что Xalan, который доступен отдельно (2.7.1 из 2007!), Имеет API для выполнения инкрементных преобразований. Поэтому, хотя это работает, я действительно хочу, чтобы мой код запускался на складе JDK, не сообщая пользователю играть в какую-либо одобренную папку.

Каков наилучший способ сделать инкрементные преобразования XSLT в Java, чтобы мой код был совместим с немодифицированными/запатентованными установками JDK?

обновление: Этот недавно вопрос тесно связан: What is the Most Efficient Java-Based streaming XSLT Processor?

+0

Пробуйте эту ссылку - http://www.devx.com/xml/Article/34677/1954 - см. Раздел «Итерация 2: Преобразование JAXP XSLT в Divide-and-Conquer» – kjp

ответ

2

Во-первых, я настоятельно рекомендую использовать версии Xalan и Xerces Apache, а не версии, входящие в состав JDK, которые являются очень ошибочными. Это особенно верно для Xerces.

Во-вторых, если вы используете Java, то вам действительно нужно перейти на XSLT 2.0, что дает вам значительные улучшения в производительности разработки. На практике это означает саксонское (домашнее издание саксонского бесплатно).

Инкрементное преобразование в Xalan фактически не останавливает его, строя весь исходный документ как дерево в памяти; все, что он делает, - это разрешить построение дерева параллельно с процессом преобразования. Если вы хотите потоковое преобразование, Saxon-EE - ваш единственный практический вариант. (Обратите внимание, что расширение saxon: stream() - это только одна небольшая часть возможностей потоковой передачи, предлагаемая Saxon).

+0

> На практике это означает Саксон - у меня создалось впечатление, что Xalan поддерживает XSLT 2.0, разве это не так? –

+1

@dextermeyers: Мне не известно о реализации Xalt XSLT 2.0. IBM имеет коммерческую реализацию XSLT 2.0 как часть WebSphere. –

+0

Вы (конечно) правы. Виноват. –

2

Вы пробовали расширение saxon:stream() в Saxon?

+0

Спасибо за ответ! Кажется, эта функция доступна только в Saxon-EE, что составляет примерно 8000 фунтов. К сожалению, я не могу заставить нашего менеджера принять такую ​​сумму. –

+0

@dextermeyers: Я удивлен, что Саксон стоит 8000 фунтов. В прошлый раз я проверил, что он находится в диапазоне от 200 до 300 фунтов. Если ваша компания может подождать, в ближайшем будущем будет существовать стандартная потоковая функция XSLT 3.0 и возможные реализации более чем одним поставщиком. –

+0

Я наблюдаю за XSLT 3.0 уже пару лет, но, как и многие инициативы XML, похоже, он умер в 2007/2008 году. Есть ли еще работа, выполняемая кем-то? –

Смежные вопросы