XSLT from the command line

A command is available to apply a given stylesheet to a given source XML document.

For simple transformations using SaxonJ, use the command:

java net.sf.saxon.Transform -s:source -xsl:stylesheet -o:output

For SaxonCS, there are two ways of running the product from the command line. If you download SaxonCS as an executable application from the Saxonica download page, then you can run a transformation with the command:

SaxonCS transform -s:source -xsl:stylesheet -o:output

But if you install SaxonCS as a nuget package then you need to prefix the command with dotnet, like this:

dotnet SaxonCS transform -s:source -xsl:stylesheet -o:output

For SaxonC, the transform executable file must first be built. To do this, compile the Transform.c C command line program by running the batch script ./build64-linux.sh on Linux, ./build64-mac.sh on MacOS, or build-windows.bat on Windows.

Then the command takes the form:

./transform -s:source -xsl:stylesheet -o:output

Here source, stylesheet, and output are the source XML file, the XSLT stylesheet, and the output file respectively.

For a schema-aware transformation, specify the option -sa. For more details see Schema-aware transformations.

For backwards compatibility with previous releases, the prefixes -s: and -xsl: can be omitted provided that the source document and the stylesheet are the last two options before any keyword=value parameters.

More generally, the arguments consist of a number of options prefixed with "-", then optionally (for backwards compatibility) the source filename and/or stylesheet filename, then a number of parameters provided as keyword=value pairs. The options must come first, then the file names if present, then the parameters.

For this to work, all the necessary Java components must be available on the classpath. See Installation for details of how to set up the classpath.

If you are are not using any additional Java libraries, you can use the simpler form of command (this example is for Saxon-HE 12.0):

java  -jar dir/saxon-he-12.0.jar [options] [params]

Note, however, that this does not work if you need to load user-written extension functions or other classes (such as the ICU localization library) from the classpath. It will therefore not work if your stylesheet uses extension functions or other plug-in components such as parsers or URI resolvers.

Command line options

The options are as follows (in any order). Square brackets indicate an optional value.


Use the xml-stylesheet processing instruction in the source document to identify the stylesheet to be used. The stylesheet argument must not be present on the command line. For more details see Using the -a option.


filenames is either a file name or a list of file names separated by semicolons; the files are OASIS XML catalogs used to define how public identifiers and system identifiers (URIs) used in a source document, stylesheet, or schema are to be redirected, typically to resources available locally. For more details see Using XML catalogs.

This option is not available on SaxonCS.


Indicates that configuration information should be taken from the supplied configuration file. Any options supplied on the command line override options specified in the configuration file.


Setting -dtd:on requests DTD-based validation of the source file and of any files read using the document() function. Requires an XML parser that supports validation. The setting -dtd:off (which is the default) suppresses DTD validation. The setting -dtd:recover performs DTD validation but treats the error as non-fatal if it fails. Note that any external DTD is likely to be read even if not used for validation, because DTDs can contain definitions of entities.


Setting -ea:on enables assertions both at compile time and at run time. Assertions (defined using the XSLT 3.0 xsl:assert instruction) are disabled by default at compile time, and enabled by default at run-time provided they were enabled at compile time.


Normally, if validation using a DTD or schema is requested, any fixed or default values defined in the DTD or schema will be expanded. Specifying -expand:off suppresses this. (In the case of DTD-defined defaults, this might not work with all XML parsers. It does work with the Xerces parser (default for Java) and the Microsoft parser (default for .NET).)


Display an execution plan and other diagnostic information for the stylesheet. This is a representation of the expression tree after rewriting by the optimizer. It combines the XSLT instructions and the XPath expressions into a single tree. If no file name is specified the output is sent to the standard error stream. The output is in XML format.


Export the compiled stylesheet, in a form suitable for subsequent execution. For more details, see Compiling a stylesheet.


If ext:off is specified, suppress access to certain external resources. Specifically it sets the configuration option ALLOW_EXTERNAL_FUNCTIONS, whose effect is rather wider than the name suggests. This option is useful when loading an untrusted stylesheet, perhaps from a remote site using an http:// URL; it ensures that the stylesheet cannot call arbitrary Java methods and thereby gain privileged access to resources on your machine.


Selects the initial mode for the transformation. If this is namespaced, it can be written as {uri}localname.


The value identifies user-supplied code that is called during the initialization process, and may be used to set any options required on the Saxon configuration.

For SaxonJ, the value is the name of a user-supplied class that implements the interface Initializer. The class must be on the classpath.

For SaxonCS, the value is the filename of a user-written assembly that contains an implementation of the interface Saxon.Api.IProcessorInitializer. For details see Callbacks.

This option is not available on SaxonC.


Selects the initial named template to be executed. If this is namespaced, it can be written as {uri}localname. If the template name is omitted, the default is xsl:initial-template. When this option is used, you do not need to supply a source file, but if you do, you must supply it using the -s option.


Determines whether just-in-time compilation of template rules is in force. The default is on, unless the nogo or explain option is set. When JIT is enabled, the body of a template rule is not compiled until the rule first fires. This gives faster compilation when a stylesheet has been written to handle a large XML vocabulary, but the source document only uses a fraction of the vocabulary. The drawback is that static errors in the stylesheet may go undetected.


Selects a JSON file to act as the primary input of the transformation. The file is parsed (typically producing a map or array) following the rules of the json-doc function, and the resulting item becomes the global context item for the transformation; if there is no -it option then it is also used as the initial match selection.

This option cannot be combined with -s.


If -l or -l:on is specified, causes line and column numbers to be maintained for source documents. These are accessible using the extension functions saxon:line-number() and saxon:column-number(). Line numbers are useful when the purpose of the stylesheet is to find errors or anomalies in the source XML file. Without this option, line numbers are available while source documents are being parsed and validated, but they are not retained in the tree representation of the document.


A list of filenames containing library packages. The filenames are separated by ";" on Windows systems, or ":" on Linux and Mac. Each filename must identify either (a) a top-level module in a source XSLT package, or (b) a SEF file containing an exported library package. There is no constraint on the order of the packages.


Relevant only when SaxonJ-PE or SaxonJ-EE software is loaded. By default, Saxon will look for a license and report a warning if none is found, which escalates to a fatal error if licenseable features (such as schema-awareness) are used. If -license:off is specified, Saxon will not look for a license unless it is needed, and will fall back silently if none is found (this means that the transformation might succeed, but without taking advantage of Saxon-EE optimizations). The option -license:off is useful to suppress warnings in the case where it is known that a compiled stylesheet containing an embedded license key is being executed.


From Saxon 11.1 this option has no effect.


If set, the stylesheet is analysed for errors, and any requested -explain or -export output is generated, but the stylesheet is not executed.


Sets the value of current-dateTime() (and implicit-timezone()) for the transformation. This is designed for testing, to enable repeatable results to be obtained for comparison with reference results, or to test that stylesheets can handle significant dates and times such as end-of-year processing.


Defines the handling of unprefixed element names appearing as name tests in path expressions and match patterns in the stylesheet.

  • Supplying a URI sets the default namespace for elements and types (effectively a default value for xpath-default-namespace — note that an explicit value for this attribute takes precedence).
  • The value ##any declares that unprefixed names are treated as a test on the local name of the element only: they will match regardless of namespace.
  • The value ##html5 declares that an unprefixed element name will match either a name in the XHTML namespace, or a name in no namespace. This option is intended primarily for use when generating stylesheets to run under SaxonJS in the browser, since the resulting behavior is close to that defined by the special rules in the HTML5 specification for XSLT and XPath running against an HTML5 DOM.


Send output to named file.

If the source (-s) argument identifies a directory, this option is mandatory and must also identify a directory; on completion it will contain one output file for each file in the source directory.

In other cases, this option has two effects: it defines the file where the principal output of the transformation will be written, and it defines the base URI used for resolving the value of the xsl:result-document/@href attribute when secondary result documents are written.

In the absence of this option, (a) the principal output is written to the standard output stream, and (b) secondary output file locations are resolved relative to the current working directory.

Output files are created if they do not already exist; any necessary directories will also be created. If a file does already exist, it is generally overwritten, though this will not necessarily happen if the transformation fails.


Allows individual optimizations to be enabled or disabled selectively. There is a set of single-letter flags identifying particular optimizations:

  • c: (no longer used)
  • d: detect void path expressions
  • e: cache regular expressions
  • f: inline functions
  • g: extract global variables
  • j: just-in-time compilation of template rules
  • k: create keys
  • l: loop lifting
  • m: miscellaneous
  • n: constant folding
  • p: predicate reordering
  • r: template rule-sets
  • s: extract common subexpressions
  • t: tail call optimization
  • v: inline variables
  • w: create switch statements
  • x: index predicates

A value such as opt:gs runs with only the selected optimizations; opt:-gs runs with the selected optimizations disabled and all others enabled. The value opt:0 suppresses all optimizations. The default is full optimization; this feature allows optimization to be suppressed in cases where reducing compile time is important, or where optimization gets in the way of debugging, or causes extension functions with side-effects to behave unpredictably. (Note however, that even with no optimization, lazy evaluation may still cause the evaluation order to be not as expected.)


Use the specified OutputURIResolver to process output URIs appearing in the href attribute of xsl:result-document. The OutputURIResolver is a user-defined class that implements the net.sf.saxon.lib.OutputURIResolver interface.


Normally, if validation of result documents is requested, a validation error is fatal. Setting the option -outval:recover causes such validation failures to be treated as warnings. The validation message is written both to the standard error stream, and (where possible) as a comment in the result document itself.

This option does not by itself cause result documents to be validated; that happens only as a consequence of the type or validation attribute on an xsl:result-document instruction. The only effect of the option is to determine what happens when validation fails.

Validating result documents can be very useful while debugging a stylesheet, because it provides instant feedback when the output is incorrect. However, it can sometimes be frustrating during development when you know that parts of the code have not yet been written. The option outval:recover is designed to give you the best of both worlds: it tells you that the output is wrong, but still enables you to see the complete result document that your code is producing.


Enable recognition of query parameters (such as xinclude=yes) in the StandardURIResolver. This option is available in Saxon-PE and Saxon-EE only. It cannot be used in conjunction with the -r option, and it automatically switches on the -u and -sa options. The effect is that Saxon-specific query parameters are recognized in a URI. One query parameter that is recognized is validation. This may take the values strict, lax, or strip. For example, source.xml?validation=strict loads a document with strict schema validation.


With the default setting, on, the command will quit the Java VM and return an exit code if a failure occurs. This is useful when running from an operating system shell. With the setting quit:off the command instead throws a RunTimeException, which is more useful when the command is invoked from another Java application such as Ant.


Use the specified URIResolver to process all URIs. The URIResolver is a user-defined class, that implements the javax.xml.transform.URIResolver interface, whose function is to take a URI supplied as a string, and return a SAX Source object. It is invoked to process URIs used in the document() function, in the xsl:include and xsl:import elements, and (if -u is also specified) to process the URIs of the source file and stylesheet file provided on the command line.


Used with -export to produce an export package which can be deployed to a different location, with a different base URI. If on, then static-base-uri() represents the deployed location of the package, rather than its compile time location. The default is off.

The practical effect of this is that if relocate:off (the default) is specified, then the generated SEF file will contain references to the stylesheet's original location as its static base URI, and run-time operations that are relative to this base URI (for example, calling doc() with a relative URI) will retrieve resources exactly as if the stylesheet had not been exported. By contrast, if relocate:on is specified, the SEF file will contain no reference to the original location of the source stylesheet, and operations such as doc() will be relative to the location from which the SEF file was loaded.


Performs the transformation N times, where N is the specified integer. This option is useful for performance measurement, since timings for the first transformation are often dominated by Java warm-up time.


Identifies the source file or directory. Mandatory unless the -it option is used. The source file is parsed to create a tree, and the document node of this tree acts as the initial context item for the transformation.

The filename can be given as "-" to take the source from standard input, in which case the base URI is taken from that of the current directory.

If the name identifies a directory, all the files in the directory will be processed individually. In this case the -o option is mandatory, and must also identify a directory, to contain the corresponding output files. A directory must be specified as a filename, not as a URL.

For backwards compatibility the source filename can also be specified immediately before the stylesheet filename, without the -s flag, provided that the -it option is not present.


Invoke a schema-aware transformation. Requires Saxon-EE to be installed. This option is not needed if either (a) another option implying schema-awareness is present (for example -val:strict) or (b) the stylesheet contains an xsl:import-schema declaration.


Loads a precompiled schema component model from the given file. The file should be generated in a previous run of com.saxonica.Validate using the -export option. When this option is used, the -xsd option should not be present. Schemas loaded from an SCM file are assumed to be valid, without checking.

This option is retained for compatibility. From Saxon 9.7, SCM files can also be supplied in the -xsd option.


Specifies what whitespace is to be stripped from source documents (applies both to the principal source document and to any documents loaded for example using the document() function). The default is ignorable: all ignorable whitespace is stripped. Whitespace text nodes are ignorable if they appear in elements defined in the DTD or schema as having element-only content. Specifying all strips all whitespace text nodes from source documents before any further processing, regardless of any xsl:strip-space declarations in the stylesheet, or any xml:space attributes in the source document. Specifying ignorable strips all ignorable whitespace text nodes from source documents before any further processing, regardless of any xsl:strip-space declarations in the stylesheet, or any xml:space attributes in the source document. Specifying none suppresses all whitespace stripping unless requested elsewhere, for example using xsl:strip-space.


Display version and timing information to the standard error output. The output also traces the files that are read and written, and extension modules that are loaded.


Display stylesheet tracing information. This traces execution of each instruction in the stylesheet, so the output can be quite voluminous. Also switches line numbering on for the source document. If a classname is specified, it is a user-defined class, which must implement TraceListener. If the classname is omitted, a system-supplied trace listener is used. For performance profiling, set classname to net.sf.saxon.trace.TimingTraceListener. This creates an output file giving timings for each instruction executed. This output file can subsequently be analyzed to give an execution time profile for the stylesheet. See Performance analysis.


Relevant only when -export is specified, identifies the target platform on which the exported stylesheet is to run. When exporting for SaxonJS, the value "JSx" must be specified, because this adds information to the SEF file that is required by SaxonJS, and it also outputs the SEF file in JSON format. Specifying "JS" or "JS2" means the SEF is for use with SaxonJS 2.x. The option "JS3" targets SaxonJS 3.x (not yet available at the time of writing). To generate SEF files for Saxon-JS 1.x, you need to revert to Saxon-EE 9.9.

In principle, specifying "HE" or "PE" will inhibit optimizations that generate code which Saxon-HE/Saxon-PE cannot execute; however, this is not fully tested.


Used only when the -s option specifies a directory. Controls the number of threads used to process the files in the directory. Each transformation runs in a single thread.


Switches on tracing of the binding of calls to external Java methods. This is useful when analyzing why Saxon fails to find a Java method to match an extension function call in the stylesheet, or why it chooses one method over another when several are available.


Controls the level of detail of the tracing produced by the -T option. The values are:

  • none effectively switches tracing off.
  • low traces function and template calls.
  • normal traces execution of instructions.
  • high traces execution of finer-grained expressions.


Directs the output of tracing to a specified file (assuming that -T is enabled).


This is equivalent to setting -T:net.sf.saxon.trace.TimedTraceListener and -traceout:filename; that is, it causes trace profile information to be set to the specified file. This output file can subsequently be analyzed to give an execution time profile for the stylesheet. See Performance analysis.


Supplies a stylesheet for formatting the performance data generated by the -TP option, allowing it to be output in XML or JSON format rather than HTML. See Performance analysis.


Indicates that the output of the trace() function should be directed to a specified file. Alternatively, specify #out to direct the output to System.out, #err to send it to System.err (the default), or #null to have it discarded. This option is ignored when a trace listener is in use: in that case, trace() output goes to the registered trace listener.


Selects the implementation of the internal tree model: tiny selects the "tiny tree" model (the default), linked selects the linked tree model, tinyc selects the "condensed tiny tree" model. See Choosing a tree model.


Indicates that the names of the source document and the stylesheet document are URLs; otherwise they are taken as filenames, unless they start with http:, https:, file: or classpath:, in which case they are taken as URLs.


Requests schema-based validation of the source file and of any files read using the document() or similar functions. Validation is available only with Saxon-EE, and this flag automatically switches on the -sa option. Specify -val or -val:strict to request strict validation, or -val:lax for lax validation.


No longer used.


Use the specified SAX parser for the source file and any files loaded using the document() function. The parser must be the fully-qualified class name of a Java class that implements the org.xml.sax.XMLReader or javax.xml.parsers.SAXParserFactory interface, and it must be instantiable using a zero-argument public constructor. One use of this option is to select an HTML parser such as John Cowan's TagSoup rather than an XML parser. In this case, the TagSoup JAR file must be on the classpath, and the class name to use is org.ccil.cowan.tagsoup.Parser. Another common use is to specify org.apache.xml.resolver.tools.ResolvingXMLReader. This parser is provided by the Apache commons project, and it customizes the default parser by using an EntityResolver that resolves external entity references (note the reference to an external DTD in a DOCTYPE declaration) by reference to an OASIS catalog file. This can be used to avoid repeated calls to external web servers (such as the W3C server) for commonly used DTDs such as the XHTML DTD. The option to supply a SAXParserFactory was introduced in 9.6 for the benefit of the Aalto parser, whose XMLReader implementation cannot be directly instantiated; this parser can therefore be requested by nominating its factory class, com.fasterxml.aalto.sax.SAXParserImpl.


Apply XInclude processing to all XML documents, with the exception of stylesheet modules. This relies on XInclude support in the XML parser. The option affects documents read using functions such as doc(), document(), and collection() as well as the primary input document. It also affects schema documents.


If -xmlversion:1.1 is specified, allows XML 1.1 and XML Namespaces 1.1 constructs. This option must be set if source documents using XML 1.1 are to be read, or if result documents are to be serialized as XML 1.1. This option also enables use of XML 1.1 constructs within the stylesheet itself.


Loads additional schema documents. The declarations in these schema documents are available when validating source documents (or for use by the validate{} expression). This option may also be used to supply the locations of schema documents that are imported into the stylesheet, in the case where the xsl:import-schema declaration gives the target namespace of the schema but not its location.


If -xsdversion:1.1 is specified (the default), allows schema documents using XML Schema 1.1 to be read, and permits XML Schema 1.1 constructs such as assertions.


If set to on (the default) the schema processor attempts to load any schema documents referenced in xsi:schemaLocation and xsi:noNamespaceSchemaLocation attributes in the instance document, unless a schema for the specified namespace (or non-namespace) is already available. If set to off, these attributes are ignored.


Specifies the file containing the principal stylesheet module. Mandatory unless the -a option is used. The value "-" identifies the standard input stream, in which case the static base URI is taken from that of the current directory. If the -u option is specified then the value must be a URI rather than a filename.

The selected file can contain either XSLT source code, or a compiled version of the stylesheet (a SEF file) as produced using the -export option.


Use the specified SAX parser for stylesheet files, including any loaded using xsl:include or xsl:import. The supplied classname must be the fully-qualified class name of a Java class that implements the org.xml.sax.XMLReader or javax.xml.parsers.SAXParserFactory interface, and it must be instantiable using a zero-argument public constructor.


Set a feature defined in the Configuration interface. The names of features are defined in the Javadoc for class Feature (alternatively see Configuration features): the value used here is the part of the name after the last "/", for example --allow-external-functions:off. Only features accepting a string or boolean may be set; for booleans the values true/false, on/off, yes/no, and 1/0 are recognized.


Display command syntax.

Note: under some shell languages, this needs to be escaped as -\?.


Display a list of features that are available using the --feature:value syntax.

Note: under some shell languages, this needs to be escaped as --\?.

Command line parameters

A param takes the form name=value, name being the name of the parameter, and value the value of the parameter. These parameters are accessible within the stylesheet as normal variables, using the $name syntax, provided they are declared using a top-level xsl:param element. If there is no such declaration, the supplied parameter value is silently ignored. If the xsl:param element has an as attribute indicating the required type, then the string value supplied on the command line is cast to this type: this may result in an error, for example if an integer is required and the supplied value cannot be converted to an integer. If the parameter is declared with the option static="yes" (new in XSLT 3.0) then the value is supplied as a static parameter value.

A param preceded by a leading question mark (?) is interpreted as an XPath expression. For example, ?time=current-dateTime() sets the value of the stylesheet parameter $time to the value of the current date and time, as an instance of xs:dateTime, while ?debug=false() sets the value of the parameter $debug to the boolean value false. If the parameter has a required type (for example <xsl:param name="p" as="xs:date"/>), then the supplied value must be compatible with this type according to the standard rules for converting variable values and function arguments. The static context for this XPath expression includes only the standard namespaces conventionally bound to the prefixes xs, fn, xsi, and saxon. The static base URI (used when calling the doc() function) is the current directory. The dynamic context contains no context item, position, or size, and no variables.

A param preceded by a leading exclamation mark (!) is interpreted as an output parameter. For example, !indent=yes requests indented output. This is equivalent to specifying the attribute indent="yes" on an xsl:output declaration in the stylesheet. An output parameter specified on the command line overrides one specified within the stylesheet. For parameters doctype-system, doctype-public, and saxon:next-in-chain, a zero-length value is treated as "absent", that is, the effect is to cancel any value that was set within the stylesheet.

A param preceded by a leading plus sign (+) is interpreted as a filename or directory. The content of the file is parsed as XML, and the resulting document node is passed to the stylesheet as the value of the parameter. If the parameter value is a directory, then all the immediately contained files are parsed as XML, and the resulting sequence of document nodes is passed as the value of the parameter. For example, +lookup=lookup.xml sets the value of the stylesheet parameter lookup to the document node at the root of the tree representing the parsed contents of the file lookup.xml.

Under most operating systems it is possible to supply a value containing spaces by enclosing it in double quotes, for example name="John Smith". This is a feature of the operating system shell, not something Saxon does, so it may not work the same way under every operating system or command processor. (In the jEdit console plugin, for example, it has to be written as "name=John Smith".)

If the parameter name is in a non-null namespace, the parameter can be given a value using the syntax {uri}localname=value. Here uri is the namespace URI of the parameter's name, and localname is the local part of the name.

This applies also to output parameters. For example, you can set the indentation level to 4 by using the parameter !{http://saxon.sf.net/}indent-spaces=4. In this case, however, lexical QNames using the prefix saxon are also recognized, for example !saxon:indent-spaces=4. See also Additional serialization parameters.