#java #xml #xslt #executable-jar #saxon
#java #xml #xslt #исполняемый файл-jar #saxon
Вопрос:
Я могу легко запустить следующее в командной строке для преобразования XML-файла:
java -jar saxon9he.jar -o:outputfile.xml data.xml transform.xslt
Я хотел бы получить точно такие же результаты из файла Java, чтобы я мог использовать его в части программы, которую я создаю.
Я поместил saxon9he.jar в пути сборки, но как я могу вызвать ту же команду вне командной строки?
Комментарии:
1. Убедитесь, что saxon9he.jar находится в вашем classpath, затем вызовите
new net.sf.saxon.TransformerFactoryImpl()
, чтобы убедиться, что создается экземпляр XSLT-преобразователя Saxon; в противном случае вы находитесь во власти механизма поиска по пути к классу Java.2. Класс есть,
net.sf.saxon.Transform
и егоmain
метод вызываются с аргументами, поэтому вам нужно заполнитьString[]
с помощью-o:outputfile.xml
,data.xml
иtransform.xslt
и вызвать этот метод, если вы хотите напрямую использовать этот подход. Но внутри Java-приложения есть более эффективные способы использования Saxon, см. saxonica.com/html/documentation/using-xsl/embedding
Ответ №1:
Документация находится здесь:http://www.saxonica.com/documentation/index.html #!используя-xsl/embedding
Saxon предлагает два API для запуска преобразований XSLT из Java-приложения: JAXP API и s9api API. JAXP — это стандартный интерфейс, предлагаемый почти всеми процессорами Java XSLT, поэтому вы захотите использовать этот, если хотите, чтобы ваше приложение было переносимым; его недостатком является то, что (а) он очень ориентирован на XSLT 1.0, и это затрудняет использование преимуществ новых возможностей в XSLT 2.0 и XSLT 3.0, и (б) он не особенно хорошо интегрируется с API для связанных задач, таких как обработка схемы и оценка XPath.
API s9api гораздо более точно соответствует возможностям Saxon в различных задачах, включая проверку XSLT, XQuery, XPath и XSD, но не является переносимым.
Это ваш выбор.
Ответ №2:
Лучше всего работать со стандартными Java API для обработки XML и XSLT: java.xml.transform
Первый класс, к которому вам нужно получить доступ, — это javax.xml.transform.TransformerFactory, который используется для создания объекта Transformer, который затем используется для запуска вашего преобразования XSLT. В качестве альтернативы вы можете использовать TransformerFactory для создания объекта Templates (который заставит Saxon предварительно обработать / скомпилировать / etc вашу таблицу стилей XSLT), а затем повторно использовать объект Templates для создания объектов Transformer для ваших преобразований XSLT.
Для того, чтобы убедиться, что javax.xml.transform.Класс TransformerFactory соответствует реализации Saxon, вы можете либо изменить путь к загрузочному классу, используя параметры командной строки, либо использовать код, чтобы сделать то же самое:
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
Как только это будет сделано, любые вызовы TransformerFactory.newInstance() волшебным образом создадут реализации Saxon TransformerFactory. Вам гораздо лучше использовать этот метод, поскольку вы получите преимущества стандартных Java API, и у вас будет свобода перехода на другие процессоры XSLT позже. Возможно, вы захотите изучить возможность использования XSLTC, который является частью Apache Xalan, поскольку он быстрее для определенных типов таблиц стилей XSLT.
Ответ №3:
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("java -jar saxon9he.jar -o:outputfile.xml data.xml transform.xslt");
Обратитесь к javadoc здесь.
Комментарии:
1. Похоже, это не работает. Когда я запускаю его, ничего не происходит. нет ошибки или преобразования
2. Это может помочь javaworld.com/article/2071275/core-java /…
Ответ №4:
Используя то, что сказал @Martin Honnen, я получил:
import net.sf.saxon.Transform;
class XSLTransform{
public static void main(String args[]) throws Exception {
String[] arglist = {"-o:outputfile.xml","data.xml", "transform.xslt"};
Transform.main(arglist);
}
}
Кажется, работает отлично. Спасибо за помощь
Комментарии:
1. Это действительно не лучший способ. Рано или поздно вам захочется выйти за рамки однократного преобразования, при котором таблица стилей и исходный документ находятся в filestore, а результирующий документ оказывается в filestore. Например, вы можете захотеть запустить одну и ту же таблицу стилей для нескольких исходных документов, не перекомпилируя ее для каждого приложения.; или вы можете захотеть выполнить второе преобразование для результата первого. Java API Saxon намного более гибкие, чем доступные параметры командной строки.