Saxon и XMLFilter: omit-xml-declaration="yes" не имеет никакого эффекта.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Saxon и XMLFilter: omit-xml-declaration="yes" не имеет никакого эффекта.

Сообщение Anonymous »

Мы используем Saxon 12.5 для создания некоторых файлов экспорта.
Эти преобразования обычно состоят из нескольких преобразований XSLT, применяемых одно за другим.
Чтобы повысить производительность, я представил код, использующий XMLFilters чтобы предотвратить сериализацию результатов в строки и снова проанализировать эти строки для следующего преобразования.
Кодирование работает, а также демонстрирует значительный прирост производительности.
Однако , некоторые экспорты выполняются не в формате XML, а на основе текста.
И я не могу избавиться от объявления XML, хотя в последнем XSLT установлено значение omit-xml-declaration="yes".
Старая реализация, которая также использует Saxon, выдает тот же результат без объявления XML, хотя и медленнее.
Я максимально упростил обе реализации и создал юнит-тест, надеясь увидеть, какая разница приведет к такому эффекту. Но пока безуспешно.
Что мне не хватает?
Настоящие преобразования выполняются в saxonWithDestinations() и saxonWithXMLFilters()
import net.sf.saxon.lib.Feature;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import org.junit.Assert;
import org.junit.Test;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLFilter;
import org.xml.sax.XMLReader;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Templates;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;

public class SaxonXMLFilterTest {
@Test
public void compareTransformationResultsForXml() throws Exception {
compareTransformations("nop", false);
}

@Test
public void compareTransformationResultsForText() throws Exception {
compareTransformations("text", false);
}

@Test
public void compareTransformationResultsForTextWithHackEnabled() throws Exception {
compareTransformations("text", true);
}

private void compareTransformations(String styleSheetName, boolean cutOffXmlDeclaration) throws ParserConfigurationException, TransformerException, SAXException, SaxonApiException, IOException {
String resultStringWithDestination = saxonWithDestinations(getXMLData(), getStylesheetSource(styleSheetName));
String resultStringWithXMLFilters = saxonWithXMLFilters(getXMLData(), getStylesheetSource(styleSheetName));

// This hack removes the XML declaration before comparing the results
if (cutOffXmlDeclaration == true) {
resultStringWithXMLFilters = resultStringWithDestination.replace("", "");
}

Assert.assertEquals(resultStringWithDestination, resultStringWithXMLFilters);
}

public String saxonWithDestinations(InputStream dataStream, StreamSource stylesheetSource) throws SaxonApiException {
ByteArrayOutputStream out = new ByteArrayOutputStream();

Processor processor = buildProcessor();
Serializer destination = processor.newSerializer(out);

net.sf.saxon.s9api.XsltTransformer transformer = processor.newXsltCompiler().compile(stylesheetSource).load();
transformer.setSource(new StreamSource(dataStream));
transformer.setDestination(destination);
transformer.transform();

return out.toString();
}

private String saxonWithXMLFilters(InputStream dataStream, StreamSource stylesheetSource) throws ParserConfigurationException, SAXException, TransformerException {
String implementationClassName = "net.sf.saxon.TransformerFactoryImpl"; // Force the usage of Saxon-HE
SAXTransformerFactory transformerFactory = (SAXTransformerFactory) TransformerFactory.newInstance(implementationClassName, null);

XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();

// Build Filter and use reader as first parent
Templates template = transformerFactory.newTemplates(stylesheetSource);
XMLFilter filter = transformerFactory.newXMLFilter(template);
filter.setParent(reader);

//
// More filters to be added here
//

XMLFilter lastFilter = filter;

// Push data through filter chain into ByteArrayOutputStream
ByteArrayOutputStream out = new ByteArrayOutputStream();
transformerFactory.newTransformer().transform(new SAXSource(lastFilter, new InputSource(dataStream)), new StreamResult(out));

return out.toString();
}

public static Processor buildProcessor() {
Processor processor = new Processor(false);
processor.setConfigurationProperty(Feature.TIMING, false);
processor.setConfigurationProperty(Feature.COMPILE_WITH_TRACING, false);

return processor;
}

private static StreamSource getStylesheetSource(String styleSheetName) throws IOException {

switch (styleSheetName) {
case "nop":
return stringToStreamSource(
"""









"""
);

case "text":
return stringToStreamSource(
"""









|
|











;




"""
);

default:
throw new IllegalArgumentException("Unknown stylesheet '" + styleSheetName + "'");
}
}

private InputStream getXMLData() {
return stringToInputStream(
"""




60.00
50.00
-40.00
mm


3.00
0.00
-3.00
kN


0.00
0.00
0.00
ms




260.00
250.00
160.00
mm


203.00
200.00
197.00
kN


600000.00
400000.00
200000.00
ms




"""
);
}

private static StreamSource stringToStreamSource(String s) {
return new StreamSource(stringToInputStream(s));
}

private static InputStream stringToInputStream(String s) {
return new ByteArrayInputStream(s.getBytes(Charset.defaultCharset()));
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... -no-effect
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Saxon и XMLFilter: omit-xml-declaration="yes" не имеет никакого эффекта.
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Saxon и XMLFilter: omit-xml-declaration="yes" не имеет никакого эффекта.
    Anonymous » » в форуме JAVA
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Android: textFontWeight не имеет никакого эффекта
    Гость » » в форуме Android
    0 Ответы
    65 Просмотры
    Последнее сообщение Гость
  • Установка Keras Transfer-Learning для Layers.trainable значения True не имеет никакого эффекта.
    Гость » » в форуме Python
    0 Ответы
    76 Просмотры
    Последнее сообщение Гость
  • Уменьшение типа null не имеет никакого эффекта, это изменится в следующей основной версии.
    Anonymous » » в форуме Php
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»