{"record":{"id":"bdbb3d8e6f644ec3","repo":"pentaho/pentaho-kettle","slug":"xslt-exception-errorxslfile","errorCode":null,"errorMessage":"Xslt.Exception.ErrorXSLFile","messagePattern":"Xslt\\.Exception\\.ErrorXSLFile","errorType":"exception","errorClass":"KettleStepException","httpStatus":null,"severity":"error","filePath":"plugins/xml/core/src/main/java/org/pentaho/di/trans/steps/xslt/Xslt.java","lineNumber":127,"sourceCode":"          throw new KettleStepException( BaseMessages.getString( PKG, \"Xslt.Exception.ErrorXSLFileFieldMissing\" ) );\n        }\n\n        // Try to get Field index\n        data.fielxslfiledposition = getInputRowMeta().indexOfValue( meta.getXSLFileField() );\n\n        // Let's check the Field\n        if ( data.fielxslfiledposition < 0 ) {\n          // The field is unreachable !\n          logError( BaseMessages.getString( PKG, \"Xslt.Log.ErrorXSLFileFieldFinding\" ) + \"[\" + meta.getXSLFileField()\n              + \"]\" );\n          throw new KettleStepException( BaseMessages.getString( PKG, \"Xslt.Exception.ErrorXSLFileFieldFinding\", meta\n              .getXSLFileField() ) );\n        }\n\n      } else {\n        if ( Utils.isEmpty( meta.getXslFilename() ) ) {\n          logError( BaseMessages.getString( PKG, \"Xslt.Log.ErrorXSLFile\" ) );\n          throw new KettleStepException( BaseMessages.getString( PKG, \"Xslt.Exception.ErrorXSLFile\" ) );\n        }\n\n        // Check if XSL File exists!\n        data.xslfilename = environmentSubstitute( meta.getXslFilename() );\n        FileObject file = null;\n        try {\n          file = KettleVFS.getInstance( getTransMeta().getBowl() ).getFileObject( data.xslfilename );\n          if ( !file.exists() ) {\n            logError( BaseMessages.getString( PKG, \"Xslt.Log.ErrorXSLFileNotExists\", data.xslfilename ) );\n            throw new KettleStepException( BaseMessages.getString( PKG, \"Xslt.Exception.ErrorXSLFileNotExists\",\n                data.xslfilename ) );\n          }\n          if ( file.getType() != FileType.FILE ) {\n            logError( BaseMessages.getString( PKG, \"Xslt.Log.ErrorXSLNotAFile\", data.xslfilename ) );\n            throw new KettleStepException( BaseMessages.getString( PKG, \"Xslt.Exception.ErrorXSLNotAFile\",\n                data.xslfilename ) );\n          }\n        } catch ( Exception e ) {","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/xml/core/src/main/java/org/pentaho/di/trans/steps/xslt/Xslt.java#L109-L145","documentation":"Field-resolution failure in Xslt.processRow: XSL-file-in-field mode is active but the configured field name does not exist in the input row (indexOfValue returned a negative index), so the stylesheet location cannot be read per row.","triggerScenarios":"useXSLField() is false and Utils.isEmpty(meta.getXslFilename()) — 'XSL filename' box is blank in field/filename mode.","commonSituations":"Step dialog not fully filled in; variable used for the filename evaluates to empty at runtime after environment substitution; imported transformation lacking the xslfilename attribute.","solutions":["Open the XSLT step dialog and set 'XSL filename' to a valid stylesheet path.","If using variables (e.g. ${XSL_FILE}), confirm the variable is defined in the run environment/kettle.properties.","Or switch 'XSL source' to field mode and supply the path via an incoming field."],"exampleFix":"// before\nXSL filename: (empty)\n// after\nXSL filename: ${Internal.Transformation.Filename.Directory}/transform.xsl","handlingStrategy":"validation","validationCode":"if (!meta.useXSLField() && (meta.getXslFilename() == null || meta.getXslFilename().isEmpty())) { throw new IllegalArgumentException(\"XSL filename mode requires a non-empty filename\"); }","typeGuard":null,"tryCatchPattern":"try { step.startThreads(); } catch (KettleStepException e) { if (e.getMessage().contains(\"ErrorXSLFile\")) { /* set the XSL filename or variable */ } }","preventionTips":["Define any ${XSL_FILE}-style variables in kettle.properties or job 'Set variables'","Prefer anchoring paths with ${Internal.Transformation.Filename.Directory}","Fill the dialog completely before saving the transformation"],"tags":["xslt","configuration","kettle","missing-file"],"backgroundTag":"missing-required-argument","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}