Вопрос по java, xml – Саксонский в Java: XSLT для CSV в XML

2

В основном продолжение этого вопроса: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   ответ
5

Вы используете 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) намного быстрее.

Похожие вопросы