Можно ли создать TransformerOutputStream, который расширяет стандарт java.io.OutputStream
, оборачивает предоставленный выходной поток и применяет XSL-преобразование?Я не могу найти какую-либо комбинацию API, которая бы позволяла мне это делать.
Ключевым моментом является то, что после создания TransformerOutputStream
может быть передано другим API, которые принимают стандарт java.io.OutputStream
.
Минимальное использование будет примерно таким:
java.io.InputStream in = getXmlInput();
java.io.OutputStream out = getTargetOutput();
javax.xml.transform.Templates templates = createReusableTemplates(); // could also use S9API
TransformerOutputStream tos = new TransformerOutputStream(out, templates); // extends OutputStream
com.google.common.io.ByteStreams.copy(in, tos);
// possibly flush/close tos if required by implementation
Это пример JAXP, но, поскольку я сейчас использую Saxon, решение S9API тоже подойдет.
ОсновноеПроспект, который я убедил, выглядит следующим образом:
- класс, который расширяет
java.io.OutputStream
и реализует org.xml.sax.ContentHandler
- XSL-трансформатор на основе
org.xml.sax.ContentHandler
Но я не могу найти реализации ни того, ни другого, что, по-видимому, говорит о том, что либо никто никогда не пытался это сделать, есть какая-то проблема, которая делает это непрактичным, или мои навыки поиска просто неэто хорошо.
Я могу понять, что с некоторыми шаблонами преобразователю XML может потребоваться доступ ко всему документу, и поэтому обработчик содержимого SAX может не дать никаких преимуществ, но должны быть и простые преобразования, которые могли быбыть применен к потоку, как он прошел?Этот тип интерфейса оставил бы это решение до реализации преобразователя.
Я написал и в настоящее время использую класс, который предоставляет этот интерфейс, но он просто собирает выходные данные во внутренний буфер, а затем использует стандартныйJAXP StreamSource
, чтобы прочитать это при сбросе или закрытии, поэтому заканчивается буферизация всего документа.