2012-05-18 6 views
2

В основном продолжается с этого вопроса: XSLT: CSV (or Flat File, or Plain Text) to XMLSaxon в Java: XSLT для CSV в XML

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

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

Java -jar saxon9he.jar -xsl: CSV-к-xml.csv -it: главный -o: output.xml

Так что теперь вопрос будет: Как это сделать Я делаю это в своем Java-коде?

Сейчас у меня есть код, который выглядит следующим образом: (. Transformer является экземпляром net.sf.saxon.Controller)

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(); 

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

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

Редактировать: Я нашел s9api, скрытый внутри saxon9he.jar, если кто-то его ищет.

ответ

5

Вы используете API JAXP, который был разработан для 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) более надежный и (б) намного быстрее.

Смежные вопросы