To optimize XSLT processing, the extension needs to know the locations of the XSLT templates at build time.
The XSLT source URIs have to be passed via the `quarkus.camel.xslt.sources` property. Multiple URIs can be separated
by comma.

[source,properties]
----
quarkus.camel.xslt.sources = transform.xsl, classpath:path/to/my/file.xsl
----

Scheme-less URIs are interpreted as `classpath:` URIs.

Only `classpath:` URIs are supported on Quarkus native mode. `file:`, `http:` and other kinds of URIs can be used on JVM mode only.

`<xsl:include>` and `<xsl:messaging>` XSLT elements are also supported in JVM mode only right now.

If `aggregate` DSL is used, `XsltSaxonAggregationStrategy` has to be used such as
[source,java]
----
from("file:src/test/resources?noop=true&sortBy=file:name&antInclude=*.xml")
   .routeId("aggregate").noAutoStartup()
   .aggregate(new XsltSaxonAggregationStrategy("xslt/aggregate.xsl"))
   .constant(true)
   .completionFromBatchConsumer()
   .log("after aggregate body: ${body}")
   .to("mock:transformed");
----
Also, it's only supported on JVM mode.

=== Configuration
TransformerFactory features can be configured using following property:
[source,properties]
----
quarkus.camel.xslt.features."http\://javax.xml.XMLConstants/feature/secure-processing"=false
----
=== Extension functions support
https://xml.apache.org/xalan-j/extensions.html[Xalan's extension functions]
do work properly only when:

1. Secure-processing is disabled
2. Functions are defined in a separate jar
3. Functions are augmented during native build phase. For example, they can be registered for reflection:
[source,java]
----
@RegisterForReflection(targets = { my.Functions.class })
public class FunctionsConfiguration {
}
----

[NOTE]
====
The content of the XSLT source URIs is parsed and compiled into Java classes at build time. These Java classes are the
only source of XSLT information at runtime. The XSLT source files may not be included in the application archive at all.
====