Использование Saxon и XSLT для преобразования XML-документов JDOM - PullRequest
0 голосов
/ 01 апреля 2011

Я пытаюсь преобразовать некоторый XML, чтобы вместо символов появлялись строки сущности iso8879. Например, строка 1234-5678 станет 1234‐5678. Я сделал это, используя карты персонажей и таблицы стилей, найденные в http://www.w3.org/2003/entities/iso8879doc/overview.html.

Первая часть моего xslt выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:import href="iso8879map.xsl"/>  
    <xsl:output omit-xml-declaration = "yes" use-character-maps="iso8879"/>

Когда я запускаю эту таблицу стилей в Eclipse с движком Saxon XSLT, она работает нормально и выводит XML-файл со строкой разрешения дефиса вместо символа дефиса. Однако мне нужно автоматизировать этот процесс, поэтому я использую пакет JDOM. К сожалению, персонажи не заменяются во время трансформации. Код, который выполняет преобразование, выглядит примерно так:

System.setProperty("javax.xml.transform.TransformerFactory",
    "net.sf.saxon.TransformerFactoryImpl");  // use saxon for xslt 2.0 support


SAXBuilder builder = new SAXBuilder();
builder.setExpandEntities(false);       
XSLTransformer transformer = new XSLTransformer(styleSheet);

Document toTransform = builder.build(Fileref); // transform
Document transformed = transformer.transform(toTransform);

Затем я записываю документ в файл, используя следующий метод:

public static void writeXMLDoc(File xmlDoc, Document jdomDoc){

    try {
        Format format = Format.getPrettyFormat();
        format.setOmitDeclaration(true);
        format.setEncoding("ISO-8859-1");
        XMLOutputter outputter = new XMLOutputter(format);
        //outputter.output((org.jdom.Document) allChapters, System.out);
        FileWriter writer = new FileWriter(xmlDoc.getAbsolutePath());
        outputter.output((org.jdom.Document) jdomDoc, writer);
        writer.close();
    } 
    catch (java.io.IOException exp) {
        exp.printStackTrace();
    }
}

Я начал отладку в Eclipse, и похоже, что символ дефиса не заменяется во время преобразования xslt. Я протестировал это с помощью механизма Saxon xslt сам по себе, и он работает, так что, скорее всего, это связано с использованием Java и Jdom. Кто-нибудь может помочь?

Большое спасибо.

Jim

1 Ответ

2 голосов
/ 03 мая 2011

Проблема оказалась в том, что не использовался класс-оболочка JDOM, предоставляемый Saxon. Вот рабочий код для справки, который показывает, что документ JDOM преобразуется и возвращается как новый документ JDOM:

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");  // use saxon for xslt 2.0 support
File styleSheet = new File("filePath");

// Get a TransformerFactory
System.setProperty("javax.xml.transform.TransformerFactory",
                   "com.saxonica.config.ProfessionalTransformerFactory");
TransformerFactory tfactory = TransformerFactory.newInstance();
ProfessionalConfiguration config = (ProfessionalConfiguration)((TransformerFactoryImpl)tfactory).getConfiguration();

// Get a SAXBuilder 
SAXBuilder builder = new SAXBuilder(); 

//Build JDOM Document
Document toTransform = builder.build(inputFileHandle); 

//Give it a Saxon wrapper
DocumentWrapper docw = new DocumentWrapper(toTransform,  inputHandle.getAbsolutePath(), config);

// Compile the stylesheet
Templates templates = tfactory.newTemplates(new StreamSource(styleSheet));
Transformer transformer = templates.newTransformer();

// Now do a transformation
ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);                  
transformer.transform(docw, new StreamResult(outStream));

ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
Document transformed = builder.build(inStream);
...