mehrere XML Transformationen hintereinander mit saxon6.5

meddins

Grünschnabel
Hallo,

ich arbeite zur Zeit mit XML Transformationen und muss dazu saxon 6.5 einsetzte. Mein Problem besteht darin, dass ich ein SourceXML File habe und dieses nacheinander durch mehrere Transformationen schicken muss. Leider scheitere ich daran den StreamResult einer bereits ausgeführten Transformation der nächsten Transformation zu übergeben. Hab es schon auf verschiedene Arten probiert. Zur Zeit versuche ich es mit PipedInputStreams und PipedOutputStreams aber ich bekomme immer den Fehler "pipe broken". Hättet ihr noch eine alternative Lösung für mich oder hat jemand Zeit sich meinen Source anzusehen?
Hier noch ein wenig von meinem Source:

- Thred Klasse, die die eigentliche Transformation ausführt
Code:
public class Transformation  extends Thread{
	private Source source;
	private Result result;
	private Transformer trans;
	
	@SuppressWarnings("unused")
	private Transformation(){}
	
	public Transformation(Source input, Result output, Transformer transformer){
		this.source = input;
		this.result = output;
		this.trans = transformer;
	}
	
	@Override
	public void run() {
		try {
			System.out.println(this.getName() + " has started");
			trans.transform(source, result);
		} catch (TransformerException e) {
			e.printStackTrace();
		} 	
	}
}

- Hintereinander reihen der Transformationen und starten des Threads mithilfe von pipes
(templateListe ist eine Liste von Templates, die soweit fertig zur Verwendung sind und auf das jeweilige Source File angewendet werden sollen)
Code:
public void transform (StreamSource input, StreamResult output) throws TransformerConfigurationException, IOException{
		PipedInputStream   pis [] = new PipedInputStream [templateList.size()];
		PipedOutputStream  pos [] = new PipedOutputStream [templateList.size()];
		for (int i = 0; i < templateList.size(); i++){
			pis[i] = new PipedInputStream();
			pos[i] = new PipedOutputStream();
		}
		
		for(int i = 0; i < templateList.size(); i++){
			System.out.println("TransformType: Durchlauf Nummer " + i);
			Transformation trans;
			//Only 1 transformation
			if (templateList.size() == 1){
				trans = new Transformation(input, output, templateList.get(i).newTransformer());
			//first transformation
			}else if (i == 0){
				pos[i].connect(pis[i+1]);
				trans = new Transformation(input, new StreamResult((OutputStream)pos[i]), templateList.get(i).newTransformer());
			//last transformation
			}else if (i == templateList.size()-1){
				trans = new Transformation(new StreamSource((InputStream)pis[i], "2"), output, templateList.get(i).newTransformer());
			//other transformations
			}else{
				pos[i].connect(pis[i+1]);
				StreamSource tmpSrc = new StreamSource();
				tmpSrc.setInputStream((InputStream)pis[i]);
				tmpSrc.setSystemId("1");
				StreamResult tmpRes = new StreamResult((OutputStream)pos[i]);
				
				trans = new Transformation( tmpSrc, tmpRes, templateList.get(i).newTransformer());
			}
			trans.start();
		}
	}

eine einzelne Transformation geht mit diesem Quellcode aber eben nicht mehr als eine hintereinander, da in dem Fall die piped Klassen genutzt werden.
Ich hoffe jemand kann mir damit wieter helfen.

meddins
 
Zurück