Получение свойств сериализации из саксонского преобразования - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть следующая таблица стилей XSL:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
   <xsl:output encoding="UTF-8" method="xml"/>
   <xsl:template match="/">
      <test/>
   </xsl:template>
</xsl:stylesheet>

Я использую Saxon 9.9 для ее преобразования следующим образом.

public String transform(InputStream input, InputStream stylesheet, OutputStream output){
  Processor p = new Processor(false);
  XsltCompiler c = p.newXsltCompiler();
  XsltExecutable e = c.compile(new StreamSource(stylesheet));
  Xslt30Transformer xf = e.load30();
  Serializer s = p.newSerializer(output);
  xf.transform(new StreamSource(input), s);
  return s.getOutputProperty(Serializer.Property.ENCODING));
}

Я ожидаю, что возвращаемое значение будет "UTF-8msgstr "как указано в таблице стилей, но вместо этого возвращается ноль.(Кажется, что экземпляр сериализатора вообще не имеет свойств.) Почему это так и как правильно получить выходные свойства?

1 Ответ

0 голосов
/ 16 декабря 2018

Интерфейс между механизмом преобразования 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)

...