Строка, о которой идет речь, получает источник XML и другой объект (т.е. Result
), в который могут быть записаны результаты преобразования. По сути, второй аргумент - это предоставленная вами корзина, которая позволяет методу transform
разместить результаты. После завершения вызова метода вы извлекаете свое ведро и извлекаете из него результаты.
В вашем конкретном случае:
transformer.transform(source, streamResult);
Объект streamResult
является потоковым писателем, который инкапсулирует StringWriter
. Этот объект streamResult
затем передается методу transform
, который записывает свои результаты в StreamResult
, который, в свою очередь, записывает результаты в StringWriter
. Затем вы можете вызвать метод toString
для StringWriter
, чтобы просмотреть строковые результаты преобразования.
Чтобы ответить на ваш второй вопрос: некоторые методы не возвращают свои результаты из-за эффективности и гибкости. Например, предположим, что выполняется очень большое количество преобразований. Если результаты будут возвращены, для каждого из этих преобразований потребуется создать новый объект. В случае, когда объект результата передается (называемый параметром out ), один и тот же объект результата может многократно использоваться снова и снова. Во-вторых, возврат результата устраняет некоторую гибкость, поскольку он не позволяет пользователю указать как результаты должны быть записаны. В вашем случае вы могли передать StringWriter
, заключенный в StreamResult
, но вы также легко могли передать любой объект, который реализует интерфейс Result
.
Существуют некоторые альтернативы этому типу параметра out, использующие лямбда-выражения и функциональное программирование, но в то время, когда был написан интерфейс преобразования XML, параметры out были обычной практикой (а в некоторых случаях все еще остаются).