2014-11-03 2 views
0

Я хочу написать шаг кеша в Java, который принимает входные XML и XSLT-файл и возвращает вывод преобразованного XML.Pentaho kettle transforming xml с использованием файла xslt java

Как это сделать? Я понятия не имею, с чего начать, и недостаточно документации для Java и Pentaho в Интернете.

+0

В недавнем прошлом, вы задали несколько общих вопросов, где вы явно указать, что вы «не имеют ни малейшего представления, с чего начать». Если это так, Stackoverflow не подходит для вашего вопроса. Если вы не знаете о Java, XSLT, XML, Pentaho и Kettle, я предлагаю вам начать с чтения книги или учебника. –

+0

Предложите, чтобы вы пересмотрели заголовок для «Pentaho Kettle», преобразуя XML-файл с использованием XSLT, поскольку важный нюанс заключается в том, что этот метод работает против XML-файла, тогда как встроенная поддержка Pentaho XSLT работает только для поля/переменной XML. –

ответ

2

Я нашел код ответа для преобразования XML с помощью XSLT в чайнике Java:

import java.util.*; 
import java.io.FileOutputStream; 

import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 

private int infilenameIndex; 
private int xsltfilenameIndex; 
private int outfilenameIndex; 


public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { 
    Object[] r=getRow(); 
    if (r==null) { 
    setOutputDone(); 
    return false; 
    } 


    if (first == false) { 
    infilenameIndex = getInputRowMeta().indexOfValue(getParameter("infilename")); 
    if (infilenameIndex < 0) { 
     throw new KettleException("Field not found in the input row, check parameter 'infilename'!"); 
    } 
    xsltfilenameIndex = getInputRowMeta().indexOfValue(getParameter("xsltfilename")); 
    if (xsltfilenameIndex < 0) { 
     throw new KettleException("Field not found in the input row, check parameter 'xsltfilename'!"); 
    } 
    outfilenameIndex = getInputRowMeta().indexOfValue(getParameter("outfilename")); 
    if (outfilenameIndex < 0) { 
     throw new KettleException("Field not found in the input row, check parameter 'outfilename'!"); 
    } 

    first=false; 
    } 

    String infilename = get(Fields.In, "infilename").getString(r); 
    String xsltfilename = get(Fields.In, "xsltfilename").getString(r); 
    String outfilename = get(Fields.In, "outfilename").getString(r); 

    Object[] outputRowData = RowDataUtil.resizeArray(r, data.outputRowMeta.size()); 
    int outputIndex = getInputRowMeta().size(); 

    transform(infilename, xsltfilename, outfilename); 


    putRow(data.outputRowMeta, outputRowData); 

    return true; 
} 
public void transform(String infilename, String xsltfilename, String outfilename) throws KettleException { 

    javax.xml.transform.stream.StreamSource inss = null; 
    javax.xml.transform.stream.StreamSource xsltss = null; 
    javax.xml.transform.stream.StreamResult outss = null; 

    logBasic(""); 
    logBasic("Transformerar " + infilename + " med " + xsltfilename + " till " + outfilename); 
    logBasic(""); 

    try { 
     inss = new javax.xml.transform.stream.StreamSource(infilename); 
    }  
    catch (Exception e) { 
     logError("Infil saknas " + infilename); 
     throw new KettleException(e); 
    } 

    try { 
     xsltss = new javax.xml.transform.stream.StreamSource(xsltfilename); 
    }  
    catch (Exception e) { 
     logError("Xsltfil saknas " + xsltfilename); 
     throw new KettleException(e); 
    } 

    try { 
     outss = new javax.xml.transform.stream.StreamResult(outfilename); 
    }  
    catch (Exception e) { 
     logError("Outfil saknas " + outfilename); 
     throw new KettleException(e); 
    } 

    try {  
     TransformerFactory tFactory = TransformerFactory.newInstance(); 

     // Set the TransformerFactory to the SAXON implementation. 
     //tFactory = new net.sf.saxon.TransformerFactoryImpl(); 

     Transformer transformer = tFactory.newTransformer(xsltss); 

     // Do the transfromtation 
     transformer.transform(inss, outss); 
    } 
    catch (Exception e) { 
     throw new KettleException(e); 
    } 
    return; 
} 
+0

Если вы обнаружили, что в Интернете вы должны предоставить ссылку из вежливости. Однако я не понимаю, почему вы не просто используете встроенный шаг XSL Transformation. – Codek

0

Я могу видеть, как это было бы предпочтительнее для больших файлов 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; 
}