2016-08-01 5 views
0

Ich verwende den folgenden Code, um ein xml mit xslt zu filtern.java xml xslt Umwandlungsproblem mit großen xsl-Dateien

import java.io.PrintStream; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

public class XMLTransformation { 
private static String TASK = null; 

public static void main(String[] args) { 
    try { 
     if (args.length > 0) { 
      TASK = args[0]; 
      System.out.println("TASK being filtered is " + TASK); 
     } else { 
      System.out.println("TASK NOT supplied..Exiting"); 
      System.exit(2); 
     } 
     String TASK_VAR = TASK.replaceAll("\\.", "_"); 
     String input_file_param = String.valueOf(TASK_VAR) + "_INPUT_FILE"; 
     String output_file_param = String.valueOf(TASK_VAR) + "_OUTPUT_FILE"; 
     String xsl_file_param = String.valueOf(TASK_VAR) + "_XSL_FILE"; 
     StreamSource input = new StreamSource(System.getenv(input_file_param)); 
     StreamSource xsl = new StreamSource(System.getenv(xsl_file_param)); 
     StreamResult output = new StreamResult(System.getenv(output_file_param)); 
     TransformerFactory factory = TransformerFactory.newInstance(); 
     Transformer transformer = factory.newTransformer(xsl); 
     transformer.setOutputProperty("indent", "yes"); 
     transformer.transform(input, output); 
    } 
    catch (TransformerException te) { 
     System.out.println("Transformer exception: " + te.getMessage()); 
    } 
} 
} 

der Code funktioniert für kleinere XML-Dateien in Ordnung, aber führt den Fehler „Transformator Ausnahme: Kann die Translet Klasse laden“ für größere.

Was ist falsch an diesem Code? Kann jemand bitte vorschlagen?

+0

Zum ersten Mal ersetzen Sie 'catch (TransformerException te) {System.out.println (" Transformer-Ausnahme: "+ te.getMessage());}' mit 'catch (Exception e) {e.printStackTrace(); } 'und check und poste den kompletten Stack-Trace. Wenn es sich um ein Speicherproblem handelt, geben Sie der JRE mehr Speicher. Und Sie möchten vielleicht teilen, was "größer" in Megabyte oder Gigabyte bedeutet und welchen Speicher Sie zur Ausführung der Transformation zur Verfügung haben. Da XSLT auf einer In-Memory-Tree-Repräsentation der vollständigen XML-Input-Verarbeitung arbeitet, benötigt große Dateien genügend Speicher. –

Antwort

0

Eine Lösung ist natürlich, einen anderen Prozessor zu versuchen. Sie können zur Xalan-Interpreter-Version wechseln, indem Sie javax.xml.transform.TransformerFactory auf org.apache.xalan.processor.TransformerFactoryImpl oder auf Saxon setzen, indem Sie sie auf net.sf.saxon.TransformerFactoryImpl setzen.

Ehrlich gesagt, wenn Sie in der Java-Welt sind, ist es schwer einzusehen, warum sich jemand heutzutage auf einen XSLT 1.0-Prozessor beschränken möchte, besonders einen, der jahrelang keine aktive Entwicklung hatte. Wechseln Sie zu Saxon.

+0

Danke Michael ... Dies war ein Legacy-Code, den ich reparieren wollte :) – BRATVADDI