# XML via XSLT nach RTF generieren



## lubu (4. Dezember 2006)

Hi,

ich bin mit dem Thema XML via XSLT nach RTF generieren zurzeit beschäftigt. Dazu habe ich jetzt eine kostenlose Schnittstelle von Altova ausgegraben. Dazu meine Fragen:

erste Frage: Ich generiere mittels XSLT RTF-Dokumente auf Basis eines Altova Stylevision-Stylesheets von XML nach RTF. Gibt es hier Alternativen zur XSLT-Erzeugung von RTF?

zweite Frage: Für den Aufruf gibt es von Altova einen kostenloses Programm (AltovaXML.exe, es handelt sich um einen COM-Server, der natürlich nur unter Windows läuft), das auch eine Java-Implementierung besitzt. Bei den Java-Klassen wird letztendlich allerdings auch nur der COM-Server aufgerufen. 

Mangels Alternativen habe ich jetzt folgendes Implementiert:

try {
     IAltovaXMLFactory objXmlApp = AltovaXMLFactory.getInstance();
     if (objXmlApp != null){
        IXSLT ixslt = objXmlApp.getXSLT2Instance();

        ixslt.setInputXMLFileName(strWorkDataFileOut);
        ixslt.setXSLTFileName(strRtfStylesheet);

        String resultString = ixslt.executeAndGetResultAsString();

         // Instanzzeiger wieder freigeben
         ixslt.releaseInstance();
         objXmlApp.releaseInstance();

         if (resultString == null ) {
            log.error("XSLT Fehler : " + ixslt.getLastErrorMessage());
         }
         else{
               PrintWriter output =
                    new PrintWriter(
                     new OutputStreamWriter(
                      new FileOutputStream(strResultTransformFileRtfOut),
                                                "UTF-8"));
               output.write(resultString);
               output.close();
          }
    }
    else
        log.error("Fehler: AltovaXML-COM-Server konnte nicht instanziert werden.");
    } 
    catch (Exception e  ) {
    log.error("Fehler : " + e.getMessage());
}

Das funktioniert auch, allerdings genau einmal. Wird die Routine ein weiteres mal aufgerufen, gibt es eine Fehlermeldung, dass der COM-Server nicht instanziert werden kann. (Im Task-Manager gibt es dann auch tatsächlich noch eine AltovaXML.exe als Prozess). Anscheinend funktionieren die Aufrufe .releaseInstance() nicht sauber. Hat da einer eine Idee? (Alternativ habe ich schon den den AltovaXML.exe-Aufruf als cmd-call mit entsprechenden Ein- und Ausgabeparametern umgesetzt. Das funktioniert dann. Allerdings würde ich lieber die Java-Klassen verwenden.)

dritte Frage: Sind mit Altova Stylesheet erzeugten XSLT-RTF-Transformationsdateien proprietär oder können auch andere Parser, wie SAX, diese Dateien ausführen und damit die entsprechenden RTF-Ausgaben erzeugen.

Danke Lutz


----------



## lubu (4. Dezember 2006)

Wichtiger Zusatz:

Ich bin auch an Alternativen interessiert, da das Programm in der form nur unter Windows und nicht z.B. Linux eingesetzt werden kann.

Tschau Lutz


----------



## lubu (4. Dezember 2006)

wenn ich eine "normale" Transformation mit Sax durchführe, erhalte ich die folgende Exception:

javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: Funktion nicht gefunden: string-join

hier der Code meiner "normalen" Transformation:

```
StreamSource stylesheet = new StreamSource(new BufferedInputStream(new FileInputStream(this.strStylesheetFile)));

StreamSource src = new StreamSource(new BufferedInputStream(new FileInputStream(this.strInFile)));

StreamResult result = new StreamResult(new File(this.strOutFile));

TransformerFactory factory = TransformerFactory.newInstance();
    
Transformer t = factory.newTransformer(stylesheet);
            
t.transform(src, result);
```

Kenn jemand die string-join-Methode oder ist das Altova-proprietär?


----------

