Эффективные XSLT конвейерно обрабатывают в Java (или перенаправляющие Результаты к Источникам)

Пример использует отражение Java для создания массива. Выполнение этого обычно не рекомендуется, так как это не безопасно с точки зрения типов. Вместо этого что необходимо сделать, просто использовать внутренний Список и избежать массива вообще.

19
задан Chris Scott 21 August 2009 в 14:47
поделиться

2 ответа

Я нашел это: # 3. Объединение преобразований , в котором показаны два способа использования TransformerFactory для цепочки преобразований, когда результаты одного преобразования подают следующее преобразование и затем, наконец, выводят в систему. Это позволяет избежать промежуточной сериализации в строку, файл и т. Д. Между преобразованиями.

Когда несколько, последовательно преобразования необходимы тот же XML-документ, избегайте ненужные операции парсинга. я часто сталкиваются с кодом, который преобразует строку в другую строку, затем преобразует эту строку в еще другая строка. Мало того, что это медленно, но это может потребовать значительных объем памяти, особенно если промежуточные строки не разрешено собирать мусор.

Большинство преобразований основаны на серия SAX-мероприятий. Парсер SAX обычно анализирует InputStream или другой InputSource в события SAX, который затем можно передать в Трансформатор. Вместо того, чтобы иметь Вывод преобразователя в файл, строку, или другой такой Результат, SAXResult можно использовать вместо этого. SAXResult принимает ContentHandler, который может передать эти события SAX непосредственно в другой Трансформатор и т. д.

Вот один подход, и тот, который я обычно предпочитают, поскольку он дает больше гибкость для различных входов и источники вывода. Это также делает это довольно легко создать трансформацию цепочка динамически и с переменной количество преобразований.

 SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactory.newInstance ();

// Эти объекты шаблонов можно использовать повторно и получить откуда-нибудь.
Шаблоны templates1 = stf.newTemplates (новый StreamSource (
 getClass (). getResourceAsStream ("MyStylesheet1.xslt")));
Шаблоны templates2 = stf.newTemplates (новый StreamSource (
 getClass (). getResourceAsStream ("MyStylesheet1.xslt")));

TransformerHandler th1 = stf.newTransformerHandler (templates1);
TransformerHandler th2 = stf.newTransformerHandler (templates2);

th1.setResult (новый SAXResult (th2));
th2.setResult (новый StreamResult (System.out));

Трансформатор t = stf.newTransformer ();
t.transform (новый StreamSource (System.in), новый SAXResult (th1));

// th1 подает th2, который, в свою очередь, подает System.out.
23
ответ дан 30 November 2019 в 04:20
поделиться

Your best bet is to stick to DOM as you're doing, because an XSLT processor would have to build a tree anyway - streaming is only an option for very limited category of transforms, and few if any processors can figure it out automatically and switch to a streaming-only implementation; otherwise they just read the input and build the tree.

2
ответ дан 30 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: