pentaho/pentaho-kettle · error · KettleXMLException
Unable to load job entry of type 'xslt' from XML node
Error message
Unable to load job entry of type 'xslt' from XML node
What it means
JobEntryXSLT.loadXML rethrows KettleXMLException when the XSLT job entry cannot be deserialized from its XML <entry> node, including failures reading the nested output-property list. The original cause is wrapped.
Solutions
- Inspect the wrapped cause for the exact XMLHandler failure
- Re-save the job from Spoon to regenerate valid XML
- Verify outputproperty sub-nodes have name/value tags
- Validate the .kjb file is well-formed XML
- Check the file was not truncated during transfer
Defensive patterns
Strategy: try-catch
Try / catch
try {
entry.loadXML( entrynode, databases, slaveServers );
} catch ( KettleXMLException e ) {
logError( "xslt entry load failed: " + e.getCause(), e );
throw e;
} Prevention
- Avoid hand-editing .kjb files
- Ensure all outputproperty sub-nodes carry name and value tags
- Standardize PDI versions across environments
- Validate job XML after any external transformation
When it happens
Trigger: Loading a .kjb job whose <entry type='xslt'> node, including its outputproperty sub-nodes, is malformed or unreadable.
Common situations: Corrupted or hand-edited .kjb files; XML written by a different PDI version with a changed schema; truncated job file transfers.
Understand the failure class
Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.
Related errors
- Unable to load job entry of type 'xsdvalidator' from XML…
- JobCopyFiles.Error.Exception.UnableLoadXML
- JobEntryCopyMoveResultFilenames.CanNotLoadFromXML
- JobEntryMSAccessBulkLoad.Meta.UnableLoadXML
- JobEntrySuccess.Meta.UnableToLoadFromXML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/3f5da6d0a9332434.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/xml/core/src/main/java/org/pentaho/di/job/entries/xslt/JobEntryXSLT.java:234
int nrparams = XMLHandler.countNodes( parametersNode, "parameter" );
Node parametersOutputProps = XMLHandler.getSubNode( entrynode, "outputproperties" );
int nroutputprops = XMLHandler.countNodes( parametersOutputProps, "outputproperty" );
allocate( nrparams, nroutputprops );
for ( int i = 0; i < nrparams; i++ ) {
Node anode = XMLHandler.getSubNodeByNr( parametersNode, "parameter", i );
parameterField[i] = XMLHandler.getTagValue( anode, "field" );
parameterName[i] = XMLHandler.getTagValue( anode, "name" );
}
for ( int i = 0; i < nroutputprops; i++ ) {
Node anode = XMLHandler.getSubNodeByNr( parametersOutputProps, "outputproperty", i );
outputPropertyName[i] = XMLHandler.getTagValue( anode, "name" );
outputPropertyValue[i] = XMLHandler.getTagValue( anode, "value" );
}
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( "Unable to load job entry of type 'xslt' from XML node", xe );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
xmlfilename = rep.getJobEntryAttributeString( id_jobentry, "xmlfilename" );
xslfilename = rep.getJobEntryAttributeString( id_jobentry, "xslfilename" );
outputfilename = rep.getJobEntryAttributeString( id_jobentry, "outputfilename" );
iffileexists = (int) rep.getJobEntryAttributeInteger( id_jobentry, "iffileexists" );
addfiletoresult = rep.getJobEntryAttributeBoolean( id_jobentry, "addfiletoresult" );
filenamesfromprevious = rep.getJobEntryAttributeBoolean( id_jobentry, "filenamesfromprevious" );
xsltfactory = rep.getJobEntryAttributeString( id_jobentry, "xsltfactory" );
if ( xsltfactory == null ) {
xsltfactory = FACTORY_JAXP;
}
int nrparams = rep.countNrJobEntryAttributes( id_jobentry, "param_name" );View on GitHub (pinned to f3058517a1)