У меня есть большое количество XML-документов, которые выглядят так:
<root xmlns="urn:foo" xmlns:bar="urn:bar">
<Entity>
<bar:field>Data</bar:field>
<bar:other>Other data</bar:other>
<bar:more>More data</bar:more>
</Entity>
<Entity>
<bar:field>Data</bar:field>
<bar:other>Other data</bar:other>
<bar:more>More data</bar:more>
</Entity>
</root>
До 1000 узлов Entity под каждым корневым узлом. Я хотел бы разбить каждый из них на свой собственный документ, не записывая на диск, если это возможно.
Я знаком с XSLT 2.0 и знаю, что могу выполнить это с помощью Saxon, используя xsl: result-document, но который записывает на диск во всех случаях, не так ли? Есть ли способ перехватить вывод как строку? Я работаю на Java, и исходные данные являются результатом вызова REST, поэтому он входит в качестве InputStream, который я сейчас пишу в String.
Saxon 9 позволяет вам предоставить http://saxonica.com/documentation/index.html#!javadoc/net.sf.saxon.lib/OutputURIResolver файл http://saxonica.com/documentation/index.html#! javadoc/net.sf.saxon/Controller@setOutputURIResolver, который может обрабатывать любой result-document
по-своему, например, путем записи в StringWriter в памяти, а не в файл на диске.
Как разобрать его в документе, запуская на нем выражение /root/Entity
Xpath, перейдя по узлу NodeSet и приняв каждый узел в новый пустой документ?
Вы можете написать простую трансформацию XSLT 2.0 и запустить этот раз в разы по сравнению с исходным файлом из Java-программы и получить стандартный вывод Saxon в программе Java.
Как вызвать другую программу из Java: используйте ProcessBuilder и запустите Process. Детали доступны по запросу.
Другой вариант - использовать JAXB для создания дерева объектов, извлечения элементов Entity, создания небольшого дерева объектов и сортировки строки. Это было бы намного быстрее.
xsl:result-document
.