2015-07-21 4 views
0

Мой случай использования:Read результат трансформации XSL с StAX в потоковом режиме

  • XML File в качестве входных данных
  • должно быть трансформированы с помощью XSLT (с помощью Java 8 встроенный процессор XSLT)
  • Обработать Result с (реализации с использованием Java 8 встроенный в StAX) в XMLStreamReader

Я хочу сделать это в «потоковом режиме» (так не запись вывода XSL-преобразования в файл и его анализ XMLStreamReader).

Возможно ли это? Если да, то как? Я могу найти только примеры на основе SAX.

ответ

2

Возможно, это невозможно. Большинство движков XSLT записывают результат «tree» в режиме push, поэтому вы можете пропустить создание физического дерева, приняв события по мере их возникновения, но если вы хотите получить результат в режиме pull, вам понадобится запустить преобразование в одном потоке и чтение результатов в другом потоке, используя что-то вроде BlockingQueue для передачи событий из потока в другой. У Saxon есть внутренние механизмы для обработки push-pull конфликтов с использованием нескольких потоков таким образом, но только на уровне позиции, а не на уровне событий, и это не очень полезно для вас, потому что все дерево результатов - это один элемент. Итак, основной ответ заключается в том, что единственный способ сделать то, что вы хотите, - написать многопоточный конвертер SAX-to-StAX, который представляет собой сложную битку Java-кодирования.

+0

Хорошая информация, плюс одна. –

1

При выполнении преобразования XSLT-процессор должен построить свой результат в вызове преобразования.

Легко видеть, что двигатель может записать результат в потока, или построить DOM (или любой другой в структуре памяти), или вызвать SAXHandler.

Но как должен принимать двигатель непосредственно и вызывать XMLStreamReader, который имеет другую модель программирования, чем обработчик SAX, ориентированный на обратный вызов?

Но вы можете создать дерево DOM в результате преобразования. С учетом DOM можно создать DOMXmlStreamReader, который выполняет итерацию по DOM и выдает токены Stax. Но я не знаю, существует ли такая реализация.

+0

Я понимаю, что процессор XSLT не может напрямую позвонить читателю (нажмите <-> pull). Создание промежуточного дерева DOM не кажется эффективным для меня (по крайней мере, не более эффективным, чем использование Файлового или байтового буфера). Тем не менее, я больше думал о SAX2StaxStream. Но да, это кажется невозможным. Итак, короткий ответ: «Это невозможно»? – rmuller

+0

Создание промежуточного представления в памяти, такого как DOM, позволяет пропустить шаг синтаксического анализа, поэтому он может быть более эффективным, чем запись результата преобразования в файл/буфер и анализ файла/буфера. С другой стороны, это также зависит от размера DOM и объема доступной памяти. В любом случае, промежуточный DOM больше не является чистым потоковым решением. Итак, да, имхо это невозможно. – wero

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