pentaho/pentaho-kettle · error · KettleStepException

Xslt.Exception.ParameterFieldMissing

Error message

Xslt.Exception.ParameterFieldMissing

What it means

Thrown by the XSLT step in processRow when a configured XSLT parameter has no source field: meta.getParameterField()[i] is empty/null after environment substitution. Each parameter must map both a parameter name and an incoming row field whose value is passed into the transformation. The message includes the parameter name and its zero-based index.

Solutions

  1. Open the XSLT step dialog and set the Field column for every parameter row
  2. If using variables in the Field column, ensure they resolve to a non-empty field name at runtime
  3. Remove parameter rows that are no longer needed instead of leaving the field blank

Example fix

// before
Parameters: [{ name: "custId", field: "" }]
// after
Parameters: [{ name: "custId", field: "customer_id" }]
Defensive patterns

Strategy: validation

Validate before calling

// Before executing, verify each parameter row has a field
for (int i = 0; i < parameterName.length; i++) {
    if (parameterField[i] == null || parameterField[i].trim().isEmpty()) {
        throw new IllegalArgumentException("Parameter '" + parameterName[i] + "' has no source field");
    }
}

Try / catch

try {
    transformation.execute(...);
} catch (KettleStepException e) {
    if (e.getMessage().contains("ParameterFieldMissing")) {
        // fix step parameter mapping and retry
    }
}

Prevention

When it happens

Trigger: In the XSLT step's Parameters table, a row has a Parameter name but the Field column left blank (or resolves to empty after variable substitution).

Common situations: Adding a parameter name but forgetting to select the input field; a variable used in the Field column evaluates to empty; a partially configured step saved from an older transformation version.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/6b90fd6bf734de12. Report an issue: GitHub.

Appendix: source

Thrown at plugins/xml/core/src/main/java/org/pentaho/di/trans/steps/xslt/Xslt.java:177

      if ( nrOutputProps > 0 ) {
        data.outputProperties = new Properties();
        for ( int i = 0; i < nrOutputProps; i++ ) {
          data.outputProperties.put( meta.getOutputPropertyName()[i], environmentSubstitute( meta
              .getOutputPropertyValue()[i] ) );
        }
        data.setOutputProperties = true;
      }

      // Check parameters
      data.nrParams = meta.getParameterField() == null ? 0 : meta.getParameterField().length;
      if ( data.nrParams > 0 ) {
        data.indexOfParams = new int[data.nrParams];
        data.nameOfParams = new String[data.nrParams];
        for ( int i = 0; i < data.nrParams; i++ ) {
          String name = environmentSubstitute( meta.getParameterName()[i] );
          String field = environmentSubstitute( meta.getParameterField()[i] );
          if ( Utils.isEmpty( field ) ) {
            throw new KettleStepException( BaseMessages
                .getString( PKG, "Xslt.Exception.ParameterFieldMissing", name, i ) );
          }
          data.indexOfParams[i] = getInputRowMeta().indexOfValue( field );
          if ( data.indexOfParams[i] < 0 ) {
            throw new KettleStepException( BaseMessages.getString( PKG, "Xslt.Exception.ParameterFieldNotFound", name ) );
          }
          data.nameOfParams[i] = name;
        }
        data.useParameters = true;
      }

      data.factory = TransformerFactory.newInstance();

      if ( meta.getXSLFactory().equals( "SAXON" ) ) {
        // Set the TransformerFactory to the SAXON implementation.
        data.factory = new net.sf.saxon.TransformerFactoryImpl();
      }
    } // end if first

View on GitHub (pinned to f3058517a1)