= JSLT Component
:doctitle: JSLT
:shortname: jslt
:artifactid: camel-jslt
:description: Query or transform JSON payloads using an JSLT.
:since: 3.1
:supportlevel: Stable
:component-header: Only producer is supported
//Manually maintained attributes
:camel-spring-boot-name: jslt

*Since Camel {since}*

*{component-header}*

The Jslt component allows you to process a JSON messages using an
https://github.com/schibsted/jslt[JSLT] expression. This can be
ideal when doing JSON to JSON transformation or querying data.

Maven users will need to add the following dependency to
their `pom.xml` for this component:

[source,xml]
------------------------------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jslt</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>
------------------------------------------------------------


== URI format

-----------------------
jslt:specName[?options]
-----------------------

Where *specName* is the classpath-local URI of the specification to
invoke; or the complete URL of the remote specification
(eg: \file://folder/myfile.vm).


// component-configure options: START

// component-configure options: END

// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
// component options: END

// endpoint options: START

// endpoint options: END


== Passing values to JSLT

Camel can supply exchange information as variables when applying a JSLT expression on the body. The available variables from the *Exchange* are:

[width="100%",cols="2,5",options="header"]
|===
| name | value
| headers | The headers of the In message as a json object
| exchange.properties | The *Exchange* properties as a json object. _exchange_ is the name of the variable and _properties_ is the path to the exchange properties. Available if _allowContextMapAll_ option is true.
|===

All the values that cannot be converted to json with Jackson are denied and will not be available in the jslt expression.

For example, the header named "type" and the exchange property "instance" can be accessed like

[source,json]
--------------------------------------
{
  "type": $headers.type,
  "instance": $exchange.properties.instance
}
--------------------------------------

== Samples

For example you could use something like

[source,java]
--------------------------------------
from("activemq:My.Queue").
  to("jslt:com/acme/MyResponse.json");
--------------------------------------

And a file based resource:

[source,java]
---------------------------------------------------------------
from("activemq:My.Queue").
  to("jslt:file://myfolder/MyResponse.json?contentCache=true").
  to("activemq:Another.Queue");
---------------------------------------------------------------

You can also specify which JSLT expression the component should use
dynamically via a header, so for example:

[source,java]
---------------------------------------------------------------------
from("direct:in").
  setHeader("CamelJsltResourceUri").constant("path/to/my/spec.json").
  to("jslt:dummy?allowTemplateFromHeader=true");
---------------------------------------------------------------------

Or send whole jslt expression via header: (suitable for querying)
 
[source,java]
---------------------------------------------------------------------
from("direct:in").
  setHeader("CamelJsltString").constant(".published").
  to("jslt:dummy?allowTemplateFromHeader=true");
---------------------------------------------------------------------

Passing exchange properties to the jslt expression can be done like this

[source,java]
---------------------------------------------------------------------
from("direct:in").
  to("jslt:com/acme/MyResponse.json?allowContextMapAll=true");
---------------------------------------------------------------------


include::spring-boot:partial$starter.adoc[]
