Я могу видеть, как это было бы предпочтительнее для больших файлов XML, поскольку он позволяет файл/поток на основе обработки XML вместо того, чтобы хранить весь XML в переменной Pentaho. Я максимизировал свою кучу JVM из-за большого генерируемого набора данных XML, поэтому я надеюсь, что этот код - или вариант - может позволить мне не хранить полный XML в памяти ... будет отчитываться!
Вот мой рефакторинга/упрочение пример кода:
import java.util.*;
import java.io.FileOutputStream;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.*;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
Object[] row = getRow();
if (row == null) {
setOutputDone();
return false;
}
String infilename = getStringField(row, "infilename");
String xsltfilename = getStringField(row, "xsltfilename");
String outfilename = getStringField(row, "outfilename");
Object[] outputRowData = RowDataUtil.resizeArray(row, data.outputRowMeta.size());
doXSLT(infilename, xsltfilename, outfilename);
putRow(data.outputRowMeta, outputRowData);
return true;
}
private String getStringField(Object[] row, String paramName) throws KettleException {
String value = get(Fields.In, paramName).getString(row);
if(value == null || "".equals(value)) {
throw new KettleException("XSLT setting '" + paramName + "' not found in input row");
} else {
return value;
}
}
public void doXSLT(String infilename, String xsltfilename, String outfilename) throws KettleException {
logBasic("");
logBasic("Transforming XML file '" + infilename + "' with XSLT '" + xsltfilename + "' and target file '" + outfilename + "'");
logBasic("");
try {
StreamSource inss = new StreamSource("file:///"+infilename);
StreamSource xsltss = new StreamSource("file:///"+xsltfilename);
StreamResult outss = new StreamResult("file:///"+outfilename);
TransformerFactory tFactory = TransformerFactory.newInstance();
// Set the TransformerFactory to the SAXON implementation.
//tFactory = new net.sf.saxon.TransformerFactoryImpl();
Transformer transformer = tFactory.newTransformer(xsltss);
transformer.transform(inss, outss);
} catch (Exception e) {
logError("Error attempting XSLT: " + e);
throw new KettleException(e);
}
return;
}
В недавнем прошлом, вы задали несколько общих вопросов, где вы явно указать, что вы «не имеют ни малейшего представления, с чего начать». Если это так, Stackoverflow не подходит для вашего вопроса. Если вы не знаете о Java, XSLT, XML, Pentaho и Kettle, я предлагаю вам начать с чтения книги или учебника. –
Предложите, чтобы вы пересмотрели заголовок для «Pentaho Kettle», преобразуя XML-файл с использованием XSLT, поскольку важный нюанс заключается в том, что этот метод работает против XML-файла, тогда как встроенная поддержка Pentaho XSLT работает только для поля/переменной XML. –