Саксонский в Java: XSLT для CSV в XML

В основном продолжение этого вопроса:XSLT: CSV (или простой файл, или обычный текст) в XML

Итак, у меня есть XSLT отсюда:http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html

И он преобразует файл CSV в документ XML. Это делается при использовании следующей команды в командной строке:

java -jar saxon9he.jar -xsl:csv-to-xml.csv -it:main -o:output.xml

Итак, теперь возникает вопрос:How do I do I do this in my Java code?

Прямо сейчас у меня есть код, который выглядит так:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
StreamSource xsltSource = new StreamSource(new File("location/of/csv-to-xml.xsl"));
Transformer transformer = transformerFactory.newTransformer(xsltSource);
StringWriter stringWriter = new StringWriter();
transformer.transform(documentSource, new StreamResult(stringWriter));
String transformedDocument = stringWriter.toString().trim();

(TheTransformer является примеромnet.sf.saxon.Controller.)

Хитрость в командной строке состоит в том, чтобы указать & quot; -it: main & quot; чтобы указать прямо на названный шаблон в XSLT. Это означает, что вам не нужно указывать исходный файл с ключом -s. флаг.

Проблема начинается снова на стороне Java. Где / как я могу указать этот & quot; -it: main & quot ;? Не нарушит ли это другие XSLT, которые не нуждаются в указанном? Должен ли я называть каждый шаблон в каждом XSLT-файле «основным»? Учитывая метод подписи Transformer.transform (), яhave чтобы указать исходный файл, чтобы он не опровергал весь прогресс, который я сделал в выяснении этой вещи?

Edit: Я нашел s9api, спрятанный в saxon9he.jar, если кто-то ищет его.

Ответы на вопрос(1)

Решение Вопроса

Вы используете JAXP API, который был разработан для XSLT 1.0. Если вы хотите использовать функции XSLT 2.0, такие как возможность запуска преобразования для именованного шаблона, я бы порекомендовал использовать вместо этого интерфейс s9api, который гораздо лучше разработан для этой цели.

Однако, если у вас много существующего кода JAXP и вы не хотите его перезаписывать, вы обычно можете достичь желаемого, понижая объекты JAXP до базовых классов реализации Saxon. Например, вы можете привести JAXP Transformer как net.sf.saxon.Controller, и это даст вам доступ к controller.setInitialTemplate (); когда дело доходит до вызова метода transform (), просто укажите null в качестве параметра Source.

Между прочим, если вы пишете код, который требует процессор 2.0, тогда я не буду использовать TransformerFactory.newInstance (), который даст вам любой старый XSLT-процессор, который он найдет в пути к классам. Вместо этого используйте новый net.sf.saxon.TransformerFactoryImpl (), который (a) является более надежным и (b) намного быстрее.

Ваш ответ на вопрос