Мы используем 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
Saxon и XMLFilter: omit-xml-declaration="yes" не имеет никакого эффекта. ⇐ JAVA
Программисты JAVA общаются здесь
1729794493
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()));
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79122700/saxon-and-xmlfilter-omit-xml-declaration-yes-has-no-effect[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия