This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 63f6cabd205 CAMEL-21859: camel-xslt - add source option (#17763)
63f6cabd205 is described below

commit 63f6cabd20507de8c2aedaeefb2b5d5437354c8a
Author: Anirudh Prakash <100948748+anirudh...@users.noreply.github.com>
AuthorDate: Wed Apr 16 10:55:25 2025 +0530

    CAMEL-21859: camel-xslt - add source option (#17763)
---
 .../org/apache/camel/catalog/components/xj.json    |  29 ++---
 .../camel/catalog/components/xslt-saxon.json       |  27 ++---
 .../org/apache/camel/catalog/components/xslt.json  |  21 ++--
 .../camel/component/xj/XJEndpointUriFactory.java   |   3 +-
 .../META-INF/org/apache/camel/component/xj/xj.json |  29 ++---
 .../component/xj/JsonSourceHandlerFactoryImpl.java |   5 +-
 .../camel/component/xj/J2XInputStreamTest.java     |  57 +++++++++
 .../camel/component/xj/J2XOutputBytesTest.java     |  51 ++++++++
 .../camel/component/xj/J2XOutputFileTest.java      |  54 +++++++++
 .../camel/component/xj/J2XOutputIdentityTest.java  |  60 ++++++++++
 .../camel/component/xj/J2XOutputStringTest.java    |  51 ++++++++
 .../camel/component/xj/X2JInputStreamTest.java     |  57 +++++++++
 .../camel/component/xj/X2JOutputBytesTest.java     |  51 ++++++++
 .../camel/component/xj/X2JOutputFileTest.java      |  54 +++++++++
 .../camel/component/xj/X2JOutputIdentityTest.java  |  51 ++++++++
 .../camel/component/xj/X2JOutputStringTest.java    |  51 ++++++++
 .../xslt/saxon/XsltSaxonEndpointUriFactory.java    |   3 +-
 .../camel/component/xslt/saxon/xslt-saxon.json     |  27 ++---
 .../component/xslt/saxon/XsltSaxonEndpoint.java    |   2 +
 .../camel/component/xslt/saxon/XsltSaxonTest.java  | 130 +++++++++++++++++++++
 .../component/xslt/XsltEndpointConfigurer.java     |   3 +
 .../component/xslt/XsltEndpointUriFactory.java     |   3 +-
 .../org/apache/camel/component/xslt/xslt.json      |  21 ++--
 .../xslt/XmlSourceHandlerFactoryImpl.java          |   5 +-
 .../apache/camel/component/xslt/XsltBuilder.java   |  12 +-
 .../apache/camel/component/xslt/XsltEndpoint.java  |  17 +++
 .../endpoint/dsl/XJEndpointBuilderFactory.java     |  17 +++
 .../endpoint/dsl/XsltEndpointBuilderFactory.java   |  17 +++
 .../dsl/XsltSaxonEndpointBuilderFactory.java       |  17 +++
 29 files changed, 843 insertions(+), 82 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xj.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xj.json
index 6c2a1f09e88..f7eef9d266e 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xj.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xj.json
@@ -50,19 +50,20 @@
     "deleteOutputFile": { "index": 4, "kind": "parameter", "displayName": 
"Delete Output File", "group": "producer", "label": "", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If you have 
output=file then this option dictates whether or not the output file should be 
deleted when the Exchange is done processing. For example suppose the output 
file is a temporary file, then it ca [...]
     "failOnNullBody": { "index": 5, "kind": "parameter", "displayName": "Fail 
On Null Body", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "description": "Whether or not to throw 
an exception if the input body is null." },
     "output": { "index": 6, "kind": "parameter", "displayName": "Output", 
"group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "org.apache.camel.component.xslt.XsltOutput", "enum": [ "string", 
"bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "string", "description": "Option to specify which output 
type to use. Possible values are: string, bytes, DOM, file. The first three 
options are all in memory based, whe [...]
-    "transformDirection": { "index": 7, "kind": "parameter", "displayName": 
"Transform Direction", "group": "producer", "label": "", "required": true, 
"type": "object", "javaType": 
"org.apache.camel.component.xj.TransformDirection", "enum": [ "XML2JSON", 
"JSON2XML" ], "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Transform direction. Either XML2JSON or 
JSON2XML" },
-    "transformerCacheSize": { "index": 8, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
-    "lazyStartProducer": { "index": 9, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
-    "entityResolver": { "index": 10, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
-    "errorListener": { "index": 11, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
-    "resultHandlerFactory": { "index": 12, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
-    "saxonConfiguration": { "index": 13, "kind": "parameter", "displayName": 
"Saxon Configuration", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "net.sf.saxon.Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom Saxon configuration" },
-    "saxonExtensionFunctions": { "index": 14, "kind": "parameter", 
"displayName": "Saxon Extension Functions", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Allows you to use a custom 
net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon 
to the classpath. The function is looked up in the registry, where you can 
comma to separ [...]
-    "secureProcessing": { "index": 15, "kind": "parameter", "displayName": 
"Secure Processing", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Feature for XML secure processing (see javax.xml.XMLConstants). This is 
enabled by default. However, when using Saxon Professional you may need to turn 
this off to allow Saxon to be able to use Jav [...]
-    "transformerFactory": { "index": 16, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
-    "transformerFactoryClass": { "index": 17, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
-    "transformerFactoryConfigurationStrategy": { "index": 18, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
-    "uriResolver": { "index": 19, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
-    "xsltMessageLogger": { "index": 20, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
+    "source": { "index": 7, "kind": "parameter", "displayName": "Source", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Source to use, instead of message body. You 
can prefix with variable:, header:, or property: to specify kind of source. 
Otherwise, the source is assumed to be a variable. Use empty or null to use 
default source, which is the message body." },
+    "transformDirection": { "index": 8, "kind": "parameter", "displayName": 
"Transform Direction", "group": "producer", "label": "", "required": true, 
"type": "object", "javaType": 
"org.apache.camel.component.xj.TransformDirection", "enum": [ "XML2JSON", 
"JSON2XML" ], "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Transform direction. Either XML2JSON or 
JSON2XML" },
+    "transformerCacheSize": { "index": 9, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
+    "lazyStartProducer": { "index": 10, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
+    "entityResolver": { "index": 11, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
+    "errorListener": { "index": 12, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
+    "resultHandlerFactory": { "index": 13, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
+    "saxonConfiguration": { "index": 14, "kind": "parameter", "displayName": 
"Saxon Configuration", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "net.sf.saxon.Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom Saxon configuration" },
+    "saxonExtensionFunctions": { "index": 15, "kind": "parameter", 
"displayName": "Saxon Extension Functions", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Allows you to use a custom 
net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon 
to the classpath. The function is looked up in the registry, where you can 
comma to separ [...]
+    "secureProcessing": { "index": 16, "kind": "parameter", "displayName": 
"Secure Processing", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Feature for XML secure processing (see javax.xml.XMLConstants). This is 
enabled by default. However, when using Saxon Professional you may need to turn 
this off to allow Saxon to be able to use Jav [...]
+    "transformerFactory": { "index": 17, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
+    "transformerFactoryClass": { "index": 18, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
+    "transformerFactoryConfigurationStrategy": { "index": 19, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
+    "uriResolver": { "index": 20, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
+    "xsltMessageLogger": { "index": 21, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
   }
 }
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt-saxon.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt-saxon.json
index 0f7a705f1a4..cf5f7c8bf64 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt-saxon.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt-saxon.json
@@ -50,18 +50,19 @@
     "deleteOutputFile": { "index": 4, "kind": "parameter", "displayName": 
"Delete Output File", "group": "producer", "label": "", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If you have 
output=file then this option dictates whether or not the output file should be 
deleted when the Exchange is done processing. For example suppose the output 
file is a temporary file, then it ca [...]
     "failOnNullBody": { "index": 5, "kind": "parameter", "displayName": "Fail 
On Null Body", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "description": "Whether or not to throw 
an exception if the input body is null." },
     "output": { "index": 6, "kind": "parameter", "displayName": "Output", 
"group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "org.apache.camel.component.xslt.XsltOutput", "enum": [ "string", 
"bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "string", "description": "Option to specify which output 
type to use. Possible values are: string, bytes, DOM, file. The first three 
options are all in memory based, whe [...]
-    "transformerCacheSize": { "index": 7, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
-    "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
-    "entityResolver": { "index": 9, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
-    "errorListener": { "index": 10, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
-    "resultHandlerFactory": { "index": 11, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
-    "saxonConfiguration": { "index": 12, "kind": "parameter", "displayName": 
"Saxon Configuration", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "net.sf.saxon.Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom Saxon configuration" },
-    "saxonExtensionFunctions": { "index": 13, "kind": "parameter", 
"displayName": "Saxon Extension Functions", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Allows you to use a custom 
net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon 
to the classpath. The function is looked up in the registry, where you can 
comma to separ [...]
-    "secureProcessing": { "index": 14, "kind": "parameter", "displayName": 
"Secure Processing", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Feature for XML secure processing (see javax.xml.XMLConstants). This is 
enabled by default. However, when using Saxon Professional you may need to turn 
this off to allow Saxon to be able to use Jav [...]
-    "transformerFactory": { "index": 15, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
-    "transformerFactoryClass": { "index": 16, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
-    "transformerFactoryConfigurationStrategy": { "index": 17, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
-    "uriResolver": { "index": 18, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
-    "xsltMessageLogger": { "index": 19, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
+    "source": { "index": 7, "kind": "parameter", "displayName": "Source", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Source to use, instead of message body. You 
can prefix with variable:, header:, or property: to specify kind of source. 
Otherwise, the source is assumed to be a variable. Use empty or null to use 
default source, which is the message body." },
+    "transformerCacheSize": { "index": 8, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
+    "lazyStartProducer": { "index": 9, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
+    "entityResolver": { "index": 10, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
+    "errorListener": { "index": 11, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
+    "resultHandlerFactory": { "index": 12, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
+    "saxonConfiguration": { "index": 13, "kind": "parameter", "displayName": 
"Saxon Configuration", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "net.sf.saxon.Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom Saxon configuration" },
+    "saxonExtensionFunctions": { "index": 14, "kind": "parameter", 
"displayName": "Saxon Extension Functions", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Allows you to use a custom 
net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon 
to the classpath. The function is looked up in the registry, where you can 
comma to separ [...]
+    "secureProcessing": { "index": 15, "kind": "parameter", "displayName": 
"Secure Processing", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Feature for XML secure processing (see javax.xml.XMLConstants). This is 
enabled by default. However, when using Saxon Professional you may need to turn 
this off to allow Saxon to be able to use Jav [...]
+    "transformerFactory": { "index": 16, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
+    "transformerFactoryClass": { "index": 17, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
+    "transformerFactoryConfigurationStrategy": { "index": 18, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
+    "uriResolver": { "index": 19, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
+    "xsltMessageLogger": { "index": 20, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
   }
 }
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt.json
index f9740e43686..e5e09f23ebe 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/xslt.json
@@ -45,15 +45,16 @@
     "deleteOutputFile": { "index": 3, "kind": "parameter", "displayName": 
"Delete Output File", "group": "producer", "label": "", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If you have 
output=file then this option dictates whether or not the output file should be 
deleted when the Exchange is done processing. For example suppose the output 
file is a temporary file, then it ca [...]
     "failOnNullBody": { "index": 4, "kind": "parameter", "displayName": "Fail 
On Null Body", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "description": "Whether or not to throw 
an exception if the input body is null." },
     "output": { "index": 5, "kind": "parameter", "displayName": "Output", 
"group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "org.apache.camel.component.xslt.XsltOutput", "enum": [ "string", 
"bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "string", "description": "Option to specify which output 
type to use. Possible values are: string, bytes, DOM, file. The first three 
options are all in memory based, whe [...]
-    "transformerCacheSize": { "index": 6, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
-    "lazyStartProducer": { "index": 7, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
-    "entityResolver": { "index": 8, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
-    "errorListener": { "index": 9, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exch [...]
-    "resultHandlerFactory": { "index": 10, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
-    "transformerFactory": { "index": 11, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
-    "transformerFactoryClass": { "index": 12, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
-    "transformerFactoryConfigurationStrategy": { "index": 13, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
-    "uriResolver": { "index": 14, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
-    "xsltMessageLogger": { "index": 15, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
+    "source": { "index": 6, "kind": "parameter", "displayName": "Source", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Source to use, instead of message body. You 
can prefix with variable:, header:, or property: to specify kind of source. 
Otherwise, the source is assumed to be a variable. Use empty or null to use 
default source, which is the message body." },
+    "transformerCacheSize": { "index": 7, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
+    "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
+    "entityResolver": { "index": 9, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
+    "errorListener": { "index": 10, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
+    "resultHandlerFactory": { "index": 11, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
+    "transformerFactory": { "index": 12, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
+    "transformerFactoryClass": { "index": 13, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
+    "transformerFactoryConfigurationStrategy": { "index": 14, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
+    "uriResolver": { "index": 15, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
+    "xsltMessageLogger": { "index": 16, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
   }
 }
diff --git 
a/components/camel-xj/src/generated/java/org/apache/camel/component/xj/XJEndpointUriFactory.java
 
b/components/camel-xj/src/generated/java/org/apache/camel/component/xj/XJEndpointUriFactory.java
index aafdfc40586..48de05f4484 100644
--- 
a/components/camel-xj/src/generated/java/org/apache/camel/component/xj/XJEndpointUriFactory.java
+++ 
b/components/camel-xj/src/generated/java/org/apache/camel/component/xj/XJEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class XJEndpointUriFactory extends 
org.apache.camel.support.component.End
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(21);
+        Set<String> props = new HashSet<>(22);
         props.add("allowStAX");
         props.add("allowTemplateFromHeader");
         props.add("contentCache");
@@ -38,6 +38,7 @@ public class XJEndpointUriFactory extends 
org.apache.camel.support.component.End
         props.add("saxonConfiguration");
         props.add("saxonExtensionFunctions");
         props.add("secureProcessing");
+        props.add("source");
         props.add("transformDirection");
         props.add("transformerCacheSize");
         props.add("transformerFactory");
diff --git 
a/components/camel-xj/src/generated/resources/META-INF/org/apache/camel/component/xj/xj.json
 
b/components/camel-xj/src/generated/resources/META-INF/org/apache/camel/component/xj/xj.json
index 6c2a1f09e88..f7eef9d266e 100644
--- 
a/components/camel-xj/src/generated/resources/META-INF/org/apache/camel/component/xj/xj.json
+++ 
b/components/camel-xj/src/generated/resources/META-INF/org/apache/camel/component/xj/xj.json
@@ -50,19 +50,20 @@
     "deleteOutputFile": { "index": 4, "kind": "parameter", "displayName": 
"Delete Output File", "group": "producer", "label": "", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If you have 
output=file then this option dictates whether or not the output file should be 
deleted when the Exchange is done processing. For example suppose the output 
file is a temporary file, then it ca [...]
     "failOnNullBody": { "index": 5, "kind": "parameter", "displayName": "Fail 
On Null Body", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "description": "Whether or not to throw 
an exception if the input body is null." },
     "output": { "index": 6, "kind": "parameter", "displayName": "Output", 
"group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "org.apache.camel.component.xslt.XsltOutput", "enum": [ "string", 
"bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "string", "description": "Option to specify which output 
type to use. Possible values are: string, bytes, DOM, file. The first three 
options are all in memory based, whe [...]
-    "transformDirection": { "index": 7, "kind": "parameter", "displayName": 
"Transform Direction", "group": "producer", "label": "", "required": true, 
"type": "object", "javaType": 
"org.apache.camel.component.xj.TransformDirection", "enum": [ "XML2JSON", 
"JSON2XML" ], "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Transform direction. Either XML2JSON or 
JSON2XML" },
-    "transformerCacheSize": { "index": 8, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
-    "lazyStartProducer": { "index": 9, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
-    "entityResolver": { "index": 10, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
-    "errorListener": { "index": 11, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
-    "resultHandlerFactory": { "index": 12, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
-    "saxonConfiguration": { "index": 13, "kind": "parameter", "displayName": 
"Saxon Configuration", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "net.sf.saxon.Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom Saxon configuration" },
-    "saxonExtensionFunctions": { "index": 14, "kind": "parameter", 
"displayName": "Saxon Extension Functions", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Allows you to use a custom 
net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon 
to the classpath. The function is looked up in the registry, where you can 
comma to separ [...]
-    "secureProcessing": { "index": 15, "kind": "parameter", "displayName": 
"Secure Processing", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Feature for XML secure processing (see javax.xml.XMLConstants). This is 
enabled by default. However, when using Saxon Professional you may need to turn 
this off to allow Saxon to be able to use Jav [...]
-    "transformerFactory": { "index": 16, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
-    "transformerFactoryClass": { "index": 17, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
-    "transformerFactoryConfigurationStrategy": { "index": 18, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
-    "uriResolver": { "index": 19, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
-    "xsltMessageLogger": { "index": 20, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
+    "source": { "index": 7, "kind": "parameter", "displayName": "Source", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Source to use, instead of message body. You 
can prefix with variable:, header:, or property: to specify kind of source. 
Otherwise, the source is assumed to be a variable. Use empty or null to use 
default source, which is the message body." },
+    "transformDirection": { "index": 8, "kind": "parameter", "displayName": 
"Transform Direction", "group": "producer", "label": "", "required": true, 
"type": "object", "javaType": 
"org.apache.camel.component.xj.TransformDirection", "enum": [ "XML2JSON", 
"JSON2XML" ], "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Transform direction. Either XML2JSON or 
JSON2XML" },
+    "transformerCacheSize": { "index": 9, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
+    "lazyStartProducer": { "index": 10, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
+    "entityResolver": { "index": 11, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
+    "errorListener": { "index": 12, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
+    "resultHandlerFactory": { "index": 13, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
+    "saxonConfiguration": { "index": 14, "kind": "parameter", "displayName": 
"Saxon Configuration", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "net.sf.saxon.Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom Saxon configuration" },
+    "saxonExtensionFunctions": { "index": 15, "kind": "parameter", 
"displayName": "Saxon Extension Functions", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Allows you to use a custom 
net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon 
to the classpath. The function is looked up in the registry, where you can 
comma to separ [...]
+    "secureProcessing": { "index": 16, "kind": "parameter", "displayName": 
"Secure Processing", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Feature for XML secure processing (see javax.xml.XMLConstants). This is 
enabled by default. However, when using Saxon Professional you may need to turn 
this off to allow Saxon to be able to use Jav [...]
+    "transformerFactory": { "index": 17, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
+    "transformerFactoryClass": { "index": 18, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
+    "transformerFactoryConfigurationStrategy": { "index": 19, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
+    "uriResolver": { "index": 20, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
+    "xsltMessageLogger": { "index": 21, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
   }
 }
diff --git 
a/components/camel-xj/src/main/java/org/apache/camel/component/xj/JsonSourceHandlerFactoryImpl.java
 
b/components/camel-xj/src/main/java/org/apache/camel/component/xj/JsonSourceHandlerFactoryImpl.java
index 07c03053b7b..2a8e3305e5c 100644
--- 
a/components/camel-xj/src/main/java/org/apache/camel/component/xj/JsonSourceHandlerFactoryImpl.java
+++ 
b/components/camel-xj/src/main/java/org/apache/camel/component/xj/JsonSourceHandlerFactoryImpl.java
@@ -28,6 +28,7 @@ import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonParser;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExpectedBodyTypeException;
+import org.apache.camel.Expression;
 import org.apache.camel.component.xslt.SourceHandlerFactory;
 
 /**
@@ -65,8 +66,8 @@ public class JsonSourceHandlerFactoryImpl implements 
SourceHandlerFactory {
      * {@inheritDoc}
      */
     @Override
-    public Source getSource(Exchange exchange) throws Exception {
-        Object body = exchange.getIn().getBody();
+    public Source getSource(Exchange exchange, Expression source) throws 
Exception {
+        Object body = source != null ? source.evaluate(exchange, Object.class) 
: exchange.getMessage().getBody();
 
         JsonParser jsonParser = null;
         if (body instanceof File) {
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XInputStreamTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XInputStreamTest.java
index 7fee701f818..c388fe5c980 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XInputStreamTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XInputStreamTest.java
@@ -38,6 +38,51 @@ public class J2XInputStreamTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        ByteArrayInputStream body = new ByteArrayInputStream("{\"hello\": 
\"world!\"}".getBytes(StandardCharsets.UTF_8));
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        ByteArrayInputStream body = new ByteArrayInputStream("{\"hello\": 
\"world!\"}".getBytes(StandardCharsets.UTF_8));
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        ByteArrayInputStream body = new ByteArrayInputStream("{\"hello\": 
\"world!\"}".getBytes(StandardCharsets.UTF_8));
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -46,6 +91,18 @@ public class J2XInputStreamTest extends CamelTestSupport {
                 from("direct:start")
                         .to("xj:hellojson2xml.xsl?transformDirection=JSON2XML")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:hellojson2xml.xsl?source=header:xmlSource&transformDirection=JSON2XML")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:hellojson2xml.xsl?source=variable:xmlSource&transformDirection=JSON2XML")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:hellojson2xml.xsl?source=property:xmlSource&transformDirection=JSON2XML")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputBytesTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputBytesTest.java
index b2150b9d5de..0d5dc330f37 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputBytesTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputBytesTest.java
@@ -35,6 +35,45 @@ public class J2XOutputBytesTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -43,6 +82,18 @@ public class J2XOutputBytesTest extends CamelTestSupport {
                 from("direct:start")
                         
.to("xj:hellojson2xml.xsl?transformDirection=JSON2XML&output=bytes")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:hellojson2xml.xsl?source=header:xmlSource&transformDirection=JSON2XML&output=bytes")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:hellojson2xml.xsl?source=variable:xmlSource&transformDirection=JSON2XML&output=bytes")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:hellojson2xml.xsl?source=property:xmlSource&transformDirection=JSON2XML&output=bytes")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputFileTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputFileTest.java
index 5e1706f13f4..171e1450bbd 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputFileTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputFileTest.java
@@ -39,6 +39,48 @@ public class J2XOutputFileTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(File.class);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", "{\"hello\": \"world!\"}");
+            exchange.getIn().setHeader(Exchange.XSLT_FILE_NAME, 
"target/J2XOutputFileTest.xml");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(File.class);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", "{\"hello\": \"world!\"}");
+            exchange.getIn().setHeader(Exchange.XSLT_FILE_NAME, 
"target/J2XOutputFileTest.xml");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(File.class);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", "{\"hello\": \"world!\"}");
+            exchange.getIn().setHeader(Exchange.XSLT_FILE_NAME, 
"target/J2XOutputFileTest.xml");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -47,6 +89,18 @@ public class J2XOutputFileTest extends CamelTestSupport {
                 from("direct:start")
                         
.to("xj:hellojson2xml.xsl?transformDirection=JSON2XML&output=file")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:hellojson2xml.xsl?source=header:xmlSource&transformDirection=JSON2XML&output=file")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:hellojson2xml.xsl?source=variable:xmlSource&transformDirection=JSON2XML&output=file")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:hellojson2xml.xsl?source=property:xmlSource&transformDirection=JSON2XML&output=file")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputIdentityTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputIdentityTest.java
index b00b93ed9f4..e21e5177737 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputIdentityTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputIdentityTest.java
@@ -38,6 +38,54 @@ public class J2XOutputIdentityTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>"
+                                    + "<object 
xmlns:xj=\"http://camel.apache.org/component/xj\"; xj:type=\"object\">"
+                                    + "<object xj:name=\"hello\" 
xj:type=\"string\">world!</object>"
+                                    + "</object>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>"
+                                    + "<object 
xmlns:xj=\"http://camel.apache.org/component/xj\"; xj:type=\"object\">"
+                                    + "<object xj:name=\"hello\" 
xj:type=\"string\">world!</object>"
+                                    + "</object>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>"
+                                    + "<object 
xmlns:xj=\"http://camel.apache.org/component/xj\"; xj:type=\"object\">"
+                                    + "<object xj:name=\"hello\" 
xj:type=\"string\">world!</object>"
+                                    + "</object>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -46,6 +94,18 @@ public class J2XOutputIdentityTest extends CamelTestSupport {
                 from("direct:start")
                         .to("xj:identity?transformDirection=JSON2XML")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:identity?source=header:xmlSource&transformDirection=JSON2XML")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:identity?source=variable:xmlSource&transformDirection=JSON2XML")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:identity?source=property:xmlSource&transformDirection=JSON2XML")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputStringTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputStringTest.java
index 2d36063ed0d..28242d9747f 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputStringTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/J2XOutputStringTest.java
@@ -35,6 +35,45 @@ public class J2XOutputStringTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?><hello>world!</hello>");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", "{\"hello\": \"world!\"}");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -43,6 +82,18 @@ public class J2XOutputStringTest extends CamelTestSupport {
                 from("direct:start")
                         
.to("xj:hellojson2xml.xsl?transformDirection=JSON2XML&output=string")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:hellojson2xml.xsl?source=header:xmlSource&transformDirection=JSON2XML&output=string")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:hellojson2xml.xsl?source=variable:xmlSource&transformDirection=JSON2XML&output=string")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:hellojson2xml.xsl?source=property:xmlSource&transformDirection=JSON2XML&output=string")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JInputStreamTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JInputStreamTest.java
index e7234ef481f..4667d93dcd0 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JInputStreamTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JInputStreamTest.java
@@ -38,6 +38,51 @@ public class X2JInputStreamTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        ByteArrayInputStream body = new 
ByteArrayInputStream("<hello>world!</hello>".getBytes(StandardCharsets.UTF_8));
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        ByteArrayInputStream body = new 
ByteArrayInputStream("<hello>world!</hello>".getBytes(StandardCharsets.UTF_8));
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        ByteArrayInputStream body = new 
ByteArrayInputStream("<hello>world!</hello>".getBytes(StandardCharsets.UTF_8));
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -46,6 +91,18 @@ public class X2JInputStreamTest extends CamelTestSupport {
                 from("direct:start")
                         .to("xj:helloxml2json.xsl?transformDirection=XML2JSON")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:helloxml2json.xsl?source=header:xmlSource&transformDirection=XML2JSON")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:helloxml2json.xsl?source=variable:xmlSource&transformDirection=XML2JSON")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:helloxml2json.xsl?source=property:xmlSource&transformDirection=XML2JSON")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputBytesTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputBytesTest.java
index 19afc7f08f6..aff6d801a11 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputBytesTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputBytesTest.java
@@ -35,6 +35,45 @@ public class X2JOutputBytesTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -43,6 +82,18 @@ public class X2JOutputBytesTest extends CamelTestSupport {
                 from("direct:start")
                         
.to("xj:helloxml2json.xsl?transformDirection=XML2JSON&output=bytes")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:helloxml2json.xsl?source=header:xmlSource&transformDirection=XML2JSON&output=bytes")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:helloxml2json.xsl?source=variable:xmlSource&transformDirection=XML2JSON&output=bytes")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:helloxml2json.xsl?source=property:xmlSource&transformDirection=XML2JSON&output=bytes")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputFileTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputFileTest.java
index bac25492290..58f1b49949c 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputFileTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputFileTest.java
@@ -39,6 +39,48 @@ public class X2JOutputFileTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(File.class);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", "<hello>world!</hello>");
+            exchange.getIn().setHeader(Exchange.XSLT_FILE_NAME, 
"target/X2JOutputFileTest.json");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(File.class);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", "<hello>world!</hello>");
+            exchange.getIn().setHeader(Exchange.XSLT_FILE_NAME, 
"target/X2JOutputFileTest.json");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(File.class);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", "<hello>world!</hello>");
+            exchange.getIn().setHeader(Exchange.XSLT_FILE_NAME, 
"target/X2JOutputFileTest.json");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -47,6 +89,18 @@ public class X2JOutputFileTest extends CamelTestSupport {
                 from("direct:start")
                         
.to("xj:helloxml2json.xsl?transformDirection=XML2JSON&output=file")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:helloxml2json.xsl?source=header:xmlSource&transformDirection=XML2JSON&output=file")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:helloxml2json.xsl?source=variable:xmlSource&transformDirection=XML2JSON&output=file")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:helloxml2json.xsl?source=property:xmlSource&transformDirection=XML2JSON&output=file")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputIdentityTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputIdentityTest.java
index d97489c7836..5ea315b6173 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputIdentityTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputIdentityTest.java
@@ -35,6 +35,45 @@ public class X2JOutputIdentityTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("{\"#text\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("{\"#text\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("{\"#text\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -43,6 +82,18 @@ public class X2JOutputIdentityTest extends CamelTestSupport {
                 from("direct:start")
                         .to("xj:identity?transformDirection=XML2JSON")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:identity?source=header:xmlSource&transformDirection=XML2JSON")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:identity?source=variable:xmlSource&transformDirection=XML2JSON")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:identity?source=property:xmlSource&transformDirection=XML2JSON")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputStringTest.java
 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputStringTest.java
index 6a99964c25d..9eb8b6a5425 100644
--- 
a/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputStringTest.java
+++ 
b/components/camel-xj/src/test/java/org/apache/camel/component/xj/X2JOutputStringTest.java
@@ -35,6 +35,45 @@ public class X2JOutputStringTest extends CamelTestSupport {
         MockEndpoint.assertIsSatisfied(context);
     }
 
+    @Test
+    public void testOutputSourceHeader() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceHeader");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceVariable() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceVariable");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Test
+    public void testOutputSourceProperty() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:sourceProperty");
+        mock.expectedBodiesReceived("{\"hello\":\"world!\"}");
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", "<hello>world!</hello>");
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -43,6 +82,18 @@ public class X2JOutputStringTest extends CamelTestSupport {
                 from("direct:start")
                         
.to("xj:helloxml2json.xsl?transformDirection=XML2JSON&output=string")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xj:helloxml2json.xsl?source=header:xmlSource&transformDirection=XML2JSON&output=string")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xj:helloxml2json.xsl?source=variable:xmlSource&transformDirection=XML2JSON&output=string")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xj:helloxml2json.xsl?source=property:xmlSource&transformDirection=XML2JSON&output=string")
+                        .to("mock:sourceProperty");
             }
         };
     }
diff --git 
a/components/camel-xslt-saxon/src/generated/java/org/apache/camel/component/xslt/saxon/XsltSaxonEndpointUriFactory.java
 
b/components/camel-xslt-saxon/src/generated/java/org/apache/camel/component/xslt/saxon/XsltSaxonEndpointUriFactory.java
index 836f438dd65..a6c2fa90d6b 100644
--- 
a/components/camel-xslt-saxon/src/generated/java/org/apache/camel/component/xslt/saxon/XsltSaxonEndpointUriFactory.java
+++ 
b/components/camel-xslt-saxon/src/generated/java/org/apache/camel/component/xslt/saxon/XsltSaxonEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class XsltSaxonEndpointUriFactory extends 
org.apache.camel.support.compon
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(20);
+        Set<String> props = new HashSet<>(21);
         props.add("allowStAX");
         props.add("allowTemplateFromHeader");
         props.add("contentCache");
@@ -38,6 +38,7 @@ public class XsltSaxonEndpointUriFactory extends 
org.apache.camel.support.compon
         props.add("saxonConfiguration");
         props.add("saxonExtensionFunctions");
         props.add("secureProcessing");
+        props.add("source");
         props.add("transformerCacheSize");
         props.add("transformerFactory");
         props.add("transformerFactoryClass");
diff --git 
a/components/camel-xslt-saxon/src/generated/resources/META-INF/org/apache/camel/component/xslt/saxon/xslt-saxon.json
 
b/components/camel-xslt-saxon/src/generated/resources/META-INF/org/apache/camel/component/xslt/saxon/xslt-saxon.json
index 0f7a705f1a4..cf5f7c8bf64 100644
--- 
a/components/camel-xslt-saxon/src/generated/resources/META-INF/org/apache/camel/component/xslt/saxon/xslt-saxon.json
+++ 
b/components/camel-xslt-saxon/src/generated/resources/META-INF/org/apache/camel/component/xslt/saxon/xslt-saxon.json
@@ -50,18 +50,19 @@
     "deleteOutputFile": { "index": 4, "kind": "parameter", "displayName": 
"Delete Output File", "group": "producer", "label": "", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If you have 
output=file then this option dictates whether or not the output file should be 
deleted when the Exchange is done processing. For example suppose the output 
file is a temporary file, then it ca [...]
     "failOnNullBody": { "index": 5, "kind": "parameter", "displayName": "Fail 
On Null Body", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "description": "Whether or not to throw 
an exception if the input body is null." },
     "output": { "index": 6, "kind": "parameter", "displayName": "Output", 
"group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "org.apache.camel.component.xslt.XsltOutput", "enum": [ "string", 
"bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "string", "description": "Option to specify which output 
type to use. Possible values are: string, bytes, DOM, file. The first three 
options are all in memory based, whe [...]
-    "transformerCacheSize": { "index": 7, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
-    "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
-    "entityResolver": { "index": 9, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
-    "errorListener": { "index": 10, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
-    "resultHandlerFactory": { "index": 11, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
-    "saxonConfiguration": { "index": 12, "kind": "parameter", "displayName": 
"Saxon Configuration", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "net.sf.saxon.Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom Saxon configuration" },
-    "saxonExtensionFunctions": { "index": 13, "kind": "parameter", 
"displayName": "Saxon Extension Functions", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Allows you to use a custom 
net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon 
to the classpath. The function is looked up in the registry, where you can 
comma to separ [...]
-    "secureProcessing": { "index": 14, "kind": "parameter", "displayName": 
"Secure Processing", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Feature for XML secure processing (see javax.xml.XMLConstants). This is 
enabled by default. However, when using Saxon Professional you may need to turn 
this off to allow Saxon to be able to use Jav [...]
-    "transformerFactory": { "index": 15, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
-    "transformerFactoryClass": { "index": 16, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
-    "transformerFactoryConfigurationStrategy": { "index": 17, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
-    "uriResolver": { "index": 18, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
-    "xsltMessageLogger": { "index": 19, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
+    "source": { "index": 7, "kind": "parameter", "displayName": "Source", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Source to use, instead of message body. You 
can prefix with variable:, header:, or property: to specify kind of source. 
Otherwise, the source is assumed to be a variable. Use empty or null to use 
default source, which is the message body." },
+    "transformerCacheSize": { "index": 8, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
+    "lazyStartProducer": { "index": 9, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
+    "entityResolver": { "index": 10, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
+    "errorListener": { "index": 11, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
+    "resultHandlerFactory": { "index": 12, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
+    "saxonConfiguration": { "index": 13, "kind": "parameter", "displayName": 
"Saxon Configuration", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "net.sf.saxon.Configuration", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom Saxon configuration" },
+    "saxonExtensionFunctions": { "index": 14, "kind": "parameter", 
"displayName": "Saxon Extension Functions", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "Allows you to use a custom 
net.sf.saxon.lib.ExtensionFunctionDefinition. You would need to add camel-saxon 
to the classpath. The function is looked up in the registry, where you can 
comma to separ [...]
+    "secureProcessing": { "index": 15, "kind": "parameter", "displayName": 
"Secure Processing", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Feature for XML secure processing (see javax.xml.XMLConstants). This is 
enabled by default. However, when using Saxon Professional you may need to turn 
this off to allow Saxon to be able to use Jav [...]
+    "transformerFactory": { "index": 16, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
+    "transformerFactoryClass": { "index": 17, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
+    "transformerFactoryConfigurationStrategy": { "index": 18, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
+    "uriResolver": { "index": 19, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
+    "xsltMessageLogger": { "index": 20, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
   }
 }
diff --git 
a/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonEndpoint.java
 
b/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonEndpoint.java
index 5137e02f832..df9f3e8d2b8 100644
--- 
a/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonEndpoint.java
+++ 
b/components/camel-xslt-saxon/src/main/java/org/apache/camel/component/xslt/saxon/XsltSaxonEndpoint.java
@@ -52,6 +52,7 @@ import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.support.EndpointHelper;
 import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.support.builder.ExpressionBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -240,6 +241,7 @@ public class XsltSaxonEndpoint extends XsltEndpoint {
         xslt.setEntityResolver(getEntityResolver());
         xslt.setAllowStAX(allowStAX);
         xslt.setDeleteOutputFile(isDeleteOutputFile());
+        xslt.setSource(ExpressionBuilder.singleInputExpression(getSource()));
 
         if (getXsltMessageLogger() != null) {
             xslt.setXsltMessageLogger(getXsltMessageLogger());
diff --git 
a/components/camel-xslt-saxon/src/test/java/org/apache/camel/component/xslt/saxon/XsltSaxonTest.java
 
b/components/camel-xslt-saxon/src/test/java/org/apache/camel/component/xslt/saxon/XsltSaxonTest.java
index 416565361a1..cd027e37f32 100644
--- 
a/components/camel-xslt-saxon/src/test/java/org/apache/camel/component/xslt/saxon/XsltSaxonTest.java
+++ 
b/components/camel-xslt-saxon/src/test/java/org/apache/camel/component/xslt/saxon/XsltSaxonTest.java
@@ -49,6 +49,57 @@ public class XsltSaxonTest extends CamelTestSupport {
         sendMessageAndHaveItTransformed(body);
     }
 
+    @Test
+    public void testSendStringMessageSourceHeader() throws Exception {
+        
sendMessageAndHaveItTransformedFromHeader("<mail><subject>Hey</subject><body>Hello
 world!</body></mail>");
+    }
+
+    @Test
+    public void testSendBytesMessageSourceHeader() throws Exception {
+        
sendMessageAndHaveItTransformedFromHeader("<mail><subject>Hey</subject><body>Hello
 world!</body></mail>".getBytes());
+    }
+
+    @Test
+    public void testSendDomMessageSourceHeader() throws Exception {
+        XmlConverter converter = new XmlConverter();
+        Document body = 
converter.toDOMDocument("<mail><subject>Hey</subject><body>Hello 
world!</body></mail>", null);
+        sendMessageAndHaveItTransformedFromHeader(body);
+    }
+
+    @Test
+    public void testSendStringMessageSourceVariable() throws Exception {
+        
sendMessageAndHaveItTransformedFromVariable("<mail><subject>Hey</subject><body>Hello
 world!</body></mail>");
+    }
+
+    @Test
+    public void testSendBytesMessageSourceVariable() throws Exception {
+        
sendMessageAndHaveItTransformedFromVariable("<mail><subject>Hey</subject><body>Hello
 world!</body></mail>".getBytes());
+    }
+
+    @Test
+    public void testSendDomMessageSourceVariable() throws Exception {
+        XmlConverter converter = new XmlConverter();
+        Document body = 
converter.toDOMDocument("<mail><subject>Hey</subject><body>Hello 
world!</body></mail>", null);
+        sendMessageAndHaveItTransformedFromVariable(body);
+    }
+
+    @Test
+    public void testSendStringMessageSourceProperty() throws Exception {
+        
sendMessageAndHaveItTransformedFromProperty("<mail><subject>Hey</subject><body>Hello
 world!</body></mail>");
+    }
+
+    @Test
+    public void testSendBytesMessageSourceProperty() throws Exception {
+        
sendMessageAndHaveItTransformedFromProperty("<mail><subject>Hey</subject><body>Hello
 world!</body></mail>".getBytes());
+    }
+
+    @Test
+    public void testSendDomMessageSourceProperty() throws Exception {
+        XmlConverter converter = new XmlConverter();
+        Document body = 
converter.toDOMDocument("<mail><subject>Hey</subject><body>Hello 
world!</body></mail>", null);
+        sendMessageAndHaveItTransformedFromProperty(body);
+    }
+
     private void sendMessageAndHaveItTransformed(Object body) throws Exception 
{
         MockEndpoint endpoint = getMockEndpoint("mock:result");
         endpoint.expectedMessageCount(1);
@@ -69,12 +120,91 @@ public class XsltSaxonTest extends CamelTestSupport {
         assertTrue(xml.indexOf("<body>Hello world!</body>") > -1);
     }
 
+    private void sendMessageAndHaveItTransformedFromHeader(Object body) throws 
Exception {
+        MockEndpoint endpoint = getMockEndpoint("mock:sourceHeader");
+        endpoint.expectedMessageCount(1);
+
+        template.send("direct:sourceHeader", exchange -> {
+            exchange.getIn().setHeader("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        List<Exchange> list = endpoint.getReceivedExchanges();
+        Exchange exchange = list.get(0);
+        String xml = exchange.getIn().getBody(String.class);
+
+        assertNotNull("The transformed XML should not be null", xml);
+        assertTrue(xml.indexOf("transformed") > -1);
+        // the cheese tag is in the transform.xsl
+        assertTrue(xml.indexOf("cheese") > -1);
+        assertTrue(xml.indexOf("<subject>Hey</subject>") > -1);
+        assertTrue(xml.indexOf("<body>Hello world!</body>") > -1);
+    }
+
+    private void sendMessageAndHaveItTransformedFromVariable(Object body) 
throws Exception {
+        MockEndpoint endpoint = getMockEndpoint("mock:sourceVariable");
+        endpoint.expectedMessageCount(1);
+
+        template.send("direct:sourceVariable", exchange -> {
+            exchange.setVariable("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        List<Exchange> list = endpoint.getReceivedExchanges();
+        Exchange exchange = list.get(0);
+        String xml = exchange.getIn().getBody(String.class);
+
+        assertNotNull("The transformed XML should not be null", xml);
+        assertTrue(xml.indexOf("transformed") > -1);
+        // the cheese tag is in the transform.xsl
+        assertTrue(xml.indexOf("cheese") > -1);
+        assertTrue(xml.indexOf("<subject>Hey</subject>") > -1);
+        assertTrue(xml.indexOf("<body>Hello world!</body>") > -1);
+    }
+
+    private void sendMessageAndHaveItTransformedFromProperty(Object body) 
throws Exception {
+        MockEndpoint endpoint = getMockEndpoint("mock:sourceProperty");
+        endpoint.expectedMessageCount(1);
+
+        template.send("direct:sourceProperty", exchange -> {
+            exchange.setProperty("xmlSource", body);
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        List<Exchange> list = endpoint.getReceivedExchanges();
+        Exchange exchange = list.get(0);
+        String xml = exchange.getIn().getBody(String.class);
+
+        assertNotNull("The transformed XML should not be null", xml);
+        assertTrue(xml.indexOf("transformed") > -1);
+        // the cheese tag is in the transform.xsl
+        assertTrue(xml.indexOf("cheese") > -1);
+        assertTrue(xml.indexOf("<subject>Hey</subject>") > -1);
+        assertTrue(xml.indexOf("<body>Hello world!</body>") > -1);
+    }
+
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
                 from("direct:start")
                         .to("xslt-saxon:xslt/transform.xsl")
                         .to("mock:result");
+
+                from("direct:sourceHeader")
+                        
.to("xslt-saxon:xslt/transform.xsl?source=header:xmlSource")
+                        .to("mock:sourceHeader");
+
+                from("direct:sourceVariable")
+                        
.to("xslt-saxon:classpath:xslt/transform.xsl?source=variable:xmlSource")
+                        .to("mock:sourceVariable");
+
+                from("direct:sourceProperty")
+                        
.to("xslt-saxon:classpath:xslt/transform.xsl?source=property:xmlSource")
+                        .to("mock:sourceProperty");
+
             }
         };
     }
diff --git 
a/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltEndpointConfigurer.java
 
b/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltEndpointConfigurer.java
index c9bcea53faf..9756ef50edb 100644
--- 
a/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltEndpointConfigurer.java
+++ 
b/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltEndpointConfigurer.java
@@ -40,6 +40,7 @@ public class XsltEndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "output": target.setOutput(property(camelContext, 
org.apache.camel.component.xslt.XsltOutput.class, value)); return true;
         case "resulthandlerfactory":
         case "resultHandlerFactory": 
target.setResultHandlerFactory(property(camelContext, 
org.apache.camel.component.xslt.ResultHandlerFactory.class, value)); return 
true;
+        case "source": target.setSource(property(camelContext, 
java.lang.String.class, value)); return true;
         case "transformercachesize":
         case "transformerCacheSize": 
target.setTransformerCacheSize(property(camelContext, int.class, value)); 
return true;
         case "transformerfactory":
@@ -76,6 +77,7 @@ public class XsltEndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "output": return org.apache.camel.component.xslt.XsltOutput.class;
         case "resulthandlerfactory":
         case "resultHandlerFactory": return 
org.apache.camel.component.xslt.ResultHandlerFactory.class;
+        case "source": return java.lang.String.class;
         case "transformercachesize":
         case "transformerCacheSize": return int.class;
         case "transformerfactory":
@@ -113,6 +115,7 @@ public class XsltEndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "output": return target.getOutput();
         case "resulthandlerfactory":
         case "resultHandlerFactory": return target.getResultHandlerFactory();
+        case "source": return target.getSource();
         case "transformercachesize":
         case "transformerCacheSize": return target.getTransformerCacheSize();
         case "transformerfactory":
diff --git 
a/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltEndpointUriFactory.java
 
b/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltEndpointUriFactory.java
index b81a5e6e25b..b235a972e27 100644
--- 
a/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltEndpointUriFactory.java
+++ 
b/components/camel-xslt/src/generated/java/org/apache/camel/component/xslt/XsltEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class XsltEndpointUriFactory extends 
org.apache.camel.support.component.E
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(16);
+        Set<String> props = new HashSet<>(17);
         props.add("allowTemplateFromHeader");
         props.add("contentCache");
         props.add("deleteOutputFile");
@@ -34,6 +34,7 @@ public class XsltEndpointUriFactory extends 
org.apache.camel.support.component.E
         props.add("output");
         props.add("resourceUri");
         props.add("resultHandlerFactory");
+        props.add("source");
         props.add("transformerCacheSize");
         props.add("transformerFactory");
         props.add("transformerFactoryClass");
diff --git 
a/components/camel-xslt/src/generated/resources/META-INF/org/apache/camel/component/xslt/xslt.json
 
b/components/camel-xslt/src/generated/resources/META-INF/org/apache/camel/component/xslt/xslt.json
index f9740e43686..e5e09f23ebe 100644
--- 
a/components/camel-xslt/src/generated/resources/META-INF/org/apache/camel/component/xslt/xslt.json
+++ 
b/components/camel-xslt/src/generated/resources/META-INF/org/apache/camel/component/xslt/xslt.json
@@ -45,15 +45,16 @@
     "deleteOutputFile": { "index": 3, "kind": "parameter", "displayName": 
"Delete Output File", "group": "producer", "label": "", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If you have 
output=file then this option dictates whether or not the output file should be 
deleted when the Exchange is done processing. For example suppose the output 
file is a temporary file, then it ca [...]
     "failOnNullBody": { "index": 4, "kind": "parameter", "displayName": "Fail 
On Null Body", "group": "producer", "label": "", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": true, "description": "Whether or not to throw 
an exception if the input body is null." },
     "output": { "index": 5, "kind": "parameter", "displayName": "Output", 
"group": "producer", "label": "", "required": false, "type": "object", 
"javaType": "org.apache.camel.component.xslt.XsltOutput", "enum": [ "string", 
"bytes", "DOM", "file" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "string", "description": "Option to specify which output 
type to use. Possible values are: string, bytes, DOM, file. The first three 
options are all in memory based, whe [...]
-    "transformerCacheSize": { "index": 6, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
-    "lazyStartProducer": { "index": 7, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
-    "entityResolver": { "index": 8, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
-    "errorListener": { "index": 9, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exch [...]
-    "resultHandlerFactory": { "index": 10, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
-    "transformerFactory": { "index": 11, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
-    "transformerFactoryClass": { "index": 12, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
-    "transformerFactoryConfigurationStrategy": { "index": 13, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
-    "uriResolver": { "index": 14, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
-    "xsltMessageLogger": { "index": 15, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
+    "source": { "index": 6, "kind": "parameter", "displayName": "Source", 
"group": "producer", "label": "", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Source to use, instead of message body. You 
can prefix with variable:, header:, or property: to specify kind of source. 
Otherwise, the source is assumed to be a variable. Use empty or null to use 
default source, which is the message body." },
+    "transformerCacheSize": { "index": 7, "kind": "parameter", "displayName": 
"Transformer Cache Size", "group": "producer", "label": "", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 0, "description": "The number of 
javax.xml.transform.Transformer object that are cached for reuse to avoid calls 
to Template.newTransformer()." },
+    "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produc [...]
+    "entityResolver": { "index": 9, "kind": "parameter", "displayName": 
"Entity Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "org.xml.sax.EntityResolver", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
org.xml.sax.EntityResolver with javax.xml.transform.sax.SAXSource." },
+    "errorListener": { "index": 10, "kind": "parameter", "displayName": "Error 
Listener", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.ErrorListener", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows to configure to use 
a custom javax.xml.transform.ErrorListener. Beware when doing this then the 
default error listener which captures any errors or fatal errors and store 
information on the Exc [...]
+    "resultHandlerFactory": { "index": 11, "kind": "parameter", "displayName": 
"Result Handler Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.ResultHandlerFactory", "deprecated": false, 
"autowired": false, "secret": false, "description": "Allows you to use a custom 
org.apache.camel.builder.xml.ResultHandlerFactory which is capable of using 
custom org.apache.camel.builder.xml.ResultHandler types." },
+    "transformerFactory": { "index": 12, "kind": "parameter", "displayName": 
"Transformer Factory", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": "javax.xml.transform.TransformerFactory", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom XSLT transformer factory" },
+    "transformerFactoryClass": { "index": 13, "kind": "parameter", 
"displayName": "Transformer Factory Class", "group": "advanced", "label": 
"advanced", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "To use a custom XSLT transformer factory, specified as a FQN 
class name" },
+    "transformerFactoryConfigurationStrategy": { "index": 14, "kind": 
"parameter", "displayName": "Transformer Factory Configuration Strategy", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": 
"org.apache.camel.component.xslt.TransformerFactoryConfigurationStrategy", 
"deprecated": false, "autowired": false, "secret": false, "description": "A 
configuration strategy to apply on freshly created instances of 
TransformerFactory." },
+    "uriResolver": { "index": 15, "kind": "parameter", "displayName": "Uri 
Resolver", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "javax.xml.transform.URIResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom 
javax.xml.transform.URIResolver" },
+    "xsltMessageLogger": { "index": 16, "kind": "parameter", "displayName": 
"Xslt Message Logger", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.xslt.XsltMessageLogger", "deprecated": false, 
"autowired": false, "secret": false, "description": "A consumer to messages 
generated during XSLT transformations." }
   }
 }
diff --git 
a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XmlSourceHandlerFactoryImpl.java
 
b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XmlSourceHandlerFactoryImpl.java
index a8b1e228d11..636b9a908d8 100644
--- 
a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XmlSourceHandlerFactoryImpl.java
+++ 
b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XmlSourceHandlerFactoryImpl.java
@@ -29,6 +29,7 @@ import org.w3c.dom.Node;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.ExpectedBodyTypeException;
+import org.apache.camel.Expression;
 import org.apache.camel.RuntimeTransformException;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.support.builder.xml.XMLConverterHelper;
@@ -56,13 +57,13 @@ public class XmlSourceHandlerFactoryImpl implements 
SourceHandlerFactory {
     }
 
     @Override
-    public Source getSource(Exchange exchange) throws Exception {
+    public Source getSource(Exchange exchange, Expression source) throws 
Exception {
         // only convert to input stream if really needed
         if (isInputStreamNeeded(exchange)) {
             InputStream is = exchange.getIn().getBody(InputStream.class);
             return getSource(exchange, is);
         } else {
-            Object body = exchange.getIn().getBody();
+            Object body = source != null ? source.evaluate(exchange, 
Object.class) : exchange.getMessage().getBody();
             return getSource(exchange, body);
         }
     }
diff --git 
a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java
 
b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java
index b765efdd7f6..41bbf1cefa4 100644
--- 
a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java
+++ 
b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltBuilder.java
@@ -42,6 +42,7 @@ import javax.xml.transform.stream.StreamSource;
 import org.xml.sax.EntityResolver;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.support.ExchangeHelper;
@@ -75,6 +76,7 @@ public class XsltBuilder implements Processor {
     private ErrorListener errorListener;
     private EntityResolver entityResolver;
     private XsltMessageLogger xsltMessageLogger;
+    private Expression source;
 
     private final XMLConverterHelper converter = new XMLConverterHelper();
     private final Lock sourceHandlerFactoryLock = new ReentrantLock();
@@ -113,7 +115,7 @@ public class XsltBuilder implements Processor {
         // the underlying input stream, which we need to close to avoid 
locking files or other resources
         InputStream is = null;
         try {
-            Source source = getSourceHandlerFactory().getSource(exchange);
+            Source source = getSourceHandlerFactory().getSource(exchange, 
this.source);
 
             source = prepareSource(source);
 
@@ -502,6 +504,14 @@ public class XsltBuilder implements Processor {
         }
     }
 
+    public Expression getSource() {
+        return source;
+    }
+
+    public void setSource(Expression source) {
+        this.source = source;
+    }
+
     private static final class XsltBuilderOnCompletion extends 
SynchronizationAdapter {
         private final String fileName;
 
diff --git 
a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
 
b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
index e2df947ec7f..f7f6b4f825d 100644
--- 
a/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
+++ 
b/components/camel-xslt/src/main/java/org/apache/camel/component/xslt/XsltEndpoint.java
@@ -45,6 +45,7 @@ import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.ProcessorEndpoint;
 import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.support.builder.ExpressionBuilder;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -95,6 +96,8 @@ public class XsltEndpoint extends ProcessorEndpoint {
     private TransformerFactoryConfigurationStrategy 
transformerFactoryConfigurationStrategy;
     @UriParam(label = "advanced")
     private XsltMessageLogger xsltMessageLogger;
+    @UriParam
+    private String source;
 
     public XsltEndpoint(String endpointUri, Component component) {
         super(endpointUri, component);
@@ -461,6 +464,7 @@ public class XsltEndpoint extends ProcessorEndpoint {
         xslt.setUriResolver(uriResolver);
         xslt.setEntityResolver(entityResolver);
         xslt.setDeleteOutputFile(deleteOutputFile);
+        xslt.setSource(ExpressionBuilder.singleInputExpression(getSource()));
 
         configureOutput(xslt, output.name());
 
@@ -499,6 +503,19 @@ public class XsltEndpoint extends ProcessorEndpoint {
         }
     }
 
+    public String getSource() {
+        return source;
+    }
+
+    /**
+     * Source to use, instead of message body. You can prefix with variable:, 
header:, or property: to specify kind of
+     * source. Otherwise, the source is assumed to be a variable. Use empty or 
null to use default source, which is the
+     * message body.
+     */
+    public void setSource(String source) {
+        this.source = source;
+    }
+
     @Override
     protected void doStop() throws Exception {
         super.doStop();
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XJEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XJEndpointBuilderFactory.java
index 9ad0c2a2824..86e30cb746a 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XJEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XJEndpointBuilderFactory.java
@@ -266,6 +266,23 @@ public interface XJEndpointBuilderFactory {
             doSetProperty("output", output);
             return this;
         }
+        /**
+         * Source to use, instead of message body. You can prefix with
+         * variable:, header:, or property: to specify kind of source.
+         * Otherwise, the source is assumed to be a variable. Use empty or null
+         * to use default source, which is the message body.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param source the value to set
+         * @return the dsl builder
+         */
+        default XJEndpointBuilder source(String source) {
+            doSetProperty("source", source);
+            return this;
+        }
         /**
          * Transform direction. Either XML2JSON or JSON2XML.
          * 
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XsltEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XsltEndpointBuilderFactory.java
index fe9770c80eb..552ebf55676 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XsltEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XsltEndpointBuilderFactory.java
@@ -230,6 +230,23 @@ public interface XsltEndpointBuilderFactory {
             doSetProperty("output", output);
             return this;
         }
+        /**
+         * Source to use, instead of message body. You can prefix with
+         * variable:, header:, or property: to specify kind of source.
+         * Otherwise, the source is assumed to be a variable. Use empty or null
+         * to use default source, which is the message body.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param source the value to set
+         * @return the dsl builder
+         */
+        default XsltEndpointBuilder source(String source) {
+            doSetProperty("source", source);
+            return this;
+        }
         /**
          * The number of javax.xml.transform.Transformer object that are cached
          * for reuse to avoid calls to Template.newTransformer().
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XsltSaxonEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XsltSaxonEndpointBuilderFactory.java
index 41ca97549c5..fd4e77357da 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XsltSaxonEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/XsltSaxonEndpointBuilderFactory.java
@@ -266,6 +266,23 @@ public interface XsltSaxonEndpointBuilderFactory {
             doSetProperty("output", output);
             return this;
         }
+        /**
+         * Source to use, instead of message body. You can prefix with
+         * variable:, header:, or property: to specify kind of source.
+         * Otherwise, the source is assumed to be a variable. Use empty or null
+         * to use default source, which is the message body.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param source the value to set
+         * @return the dsl builder
+         */
+        default XsltSaxonEndpointBuilder source(String source) {
+            doSetProperty("source", source);
+            return this;
+        }
         /**
          * The number of javax.xml.transform.Transformer object that are cached
          * for reuse to avoid calls to Template.newTransformer().

Reply via email to