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

  1. Inspect the wrapped cause for the exact XMLHandler failure
  2. Re-save the job from Spoon to regenerate valid XML
  3. Verify outputproperty sub-nodes have name/value tags
  4. Validate the .kjb file is well-formed XML
  5. 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

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


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)