Мы используем Saxon для создания некоторых файлов экспорта.
Эти преобразования обычно состоят из нескольких преобразований 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
Saxon и XMLFilter: omit-xml-declaration="yes" не имеет никакого эффекта. ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Saxon и XMLFilter: omit-xml-declaration="yes" не имеет никакого эффекта.
Anonymous » » в форуме JAVA - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Saxon и XMLFilter: omit-xml-declaration="yes" не имеет никакого эффекта.
Anonymous » » в форуме JAVA - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Уменьшение типа null не имеет никакого эффекта, это изменится в следующей основной версии.
Anonymous » » в форуме Php - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-