Пример использует отражение Java для создания массива. Выполнение этого обычно не рекомендуется, так как это не безопасно с точки зрения типов. Вместо этого что необходимо сделать, просто использовать внутренний Список и избежать массива вообще.
Я нашел это: # 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.
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.