Интерфейс между механизмом преобразования XSLT и сериализатором, к сожалению, очень грязный.Это грязно в спецификации XSLT, грязно в JAXP и грязно в саксонской.За прошедшие годы я сделал несколько попыток улучшить его, но он все еще грязный.В Saxon 9.9 были внесены некоторые изменения, необходимые благодаря новому и невинно-кажущемуся (и в XSLT, почти бесполезному) атрибуту item-separator
, который приводит к тому, что при объединении отдельных элементов в дерево документа (если оно вообще происходит)произойдет на стороне сериализации границы, а не на стороне преобразования.
Ситуация в интерфейсе Saxon 9.9 s9api состоит в том, что (в общем) объект Serializer ничего не знает о свойствах сериализации, определенных в таблице стилей,он знает только о тех, которые поставляются непосредственно через Serializer API.Только когда Transformer вызывает Serializer для выполнения сериализации, два набора свойств сериализации объединяются.
Исключением является случай, когда вы используете Xslt30Transformer.newSerializer()
для создания сериализатора.В этом случае сериализатор инициализируется со свойствами, определенными в безымянных объявлениях xsl:output
в таблице стилей, как если бы они были установлены явно с использованием serializer.setOutputProperty()
.
Доступны свойства сериализации, определенные в таблице стилей (хотя и неочень прямо) как свойства s9api XsltExecutable
.У него есть метод getUnderlyingCompiledStylesheet()
, который возвращает объект PreparedStylesheet
, и метод getDeclaredSerializationProperties()
, который возвращает свойства, определенные в объявлениях по умолчанию (без имени) xsl:output
.Существует также метод getOutputProperties(name)
, который возвращает свойства для именованного выходного формата (как используется в xsl:result-document
)