Hi Yitzhak That is an incredibly helpful Xquery example.
Unfortunately I'm unable to get it to run on my Linux machine. While this (Saxon-HE) works ok: saxon -s:small.xml -xsl:transform.xsl -o:result.html basex returns a stacktrace (shown at the bottom of my email) when I run the basex query below, modelled on yours but using quoting which I think is correct for linux. basex -b '$input=small.xml' -b '$stylesheet=transform.xsl' wrapper.xqy This fails with a java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8 error, although I don't believe I'm using any range/iterator expressions. I'm using the following files: transform:xsl: ```xsl <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:akn="http://docs.oasis-open.org/legaldocml/ns/akn/3.0" exclude-result-prefixes="akn"> <xsl:template match="/akn:akomaNtoso"> <main id="main-content"> <xsl:apply-templates select="akn:judgment"/> </main> </xsl:template> </xsl:stylesheet> ``` small.xml: ```xml <akomaNtoso xmlns="http://docs.oasis-open.org/legaldocml/ns/akn/3.0"> <judgment name="judgment"> <meta> </meta> <header> <p>A Header Paragraph</p> </header> <judgmentBody> <paragraph eId="para_1"> <num>1.</num> <content> <p>This is the first paragraph of the judgment.</p> </content> </paragraph> </judgmentBody> </judgment> </akomaNtoso> ``` wrapper.xqy: ``` declare variable $input as xs:string external; declare variable $stylesheet as xs:string external; let $output := substring-before($input, ".") || "_output.xml" return xslt:transform($input, $stylesheet) -> file:write($output, .) ``` stack trace: ``` $ basex -b '$input=small.xml' -b '$stylesheet=transform.xsl' wrapper.xqy [warning] /usr/bin/basex: Unable to locate /usr/share/java/tagsoup.jar in /usr/share/java [warning] /usr/bin/basex: Unable to locate /usr/share/java/jing.jar in /usr/share/java Improper use? Potential bug? Your feedback is welcome: Contact: basex-talk@mailman.uni-konstanz.de Version: BaseX 10.5 Java: Debian, 21.0.6 OS: Linux, amd64 Stack Trace: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8 at org.basex.query.var.QueryStack.set(QueryStack.java:111) at org.basex.query.QueryContext.set(QueryContext.java:535) at org.basex.query.expr.gflwor.Let$LetEval.next(Let.java:146) at org.basex.query.expr.gflwor.GFLWOR$1.next(GFLWOR.java:78) at org.basex.query.scope.MainModule$1.next(MainModule.java:55) at org.basex.core.cmd.AQuery.run(AQuery.java:90) at org.basex.core.Command.run(Command.java:233) at org.basex.core.Command.execute(Command.java:93) at org.basex.api.client.LocalSession.execute(LocalSession.java:131) at org.basex.api.client.Session.execute(Session.java:36) at org.basex.core.CLI.execute(CLI.java:94) at org.basex.BaseX.<init>(BaseX.java:109) at org.basex.BaseX.main(BaseX.java:45) Query "wrapper.xqy" executed in 938.59 ms. ``` On 22/07/25, Yitzhak Khabinsky via BaseX-Talk (basex-talk@mailman.uni-konstanz.de) wrote: > Hi Rory, > > It is very easy to run XSLT transformations directly in BaseX. > > BaseX has a built-in XSLT module for that. > By default it supports XSLT 1.0 standard. > If needed you can extend it up to XSLT 4.0 via Saxon. > > First, you need to prepare a tiny XQuery file for that.\ > It accepts two parameters: > - $input, to specify input XML file > - $stylesheet, to specify XSLT file > > In my example the result output file gets calculated name with a specific > suffix: "_output.xml" > But it could be a 3rd parameter too. > > xquery_xslt.qy > ============================== > declare variable $input as xs:string external; > declare variable $stylesheet as xs:string external; > > let $output := substring-before($input, ".") || "_output.xml" > return xslt:transform($input, $stylesheet) -> file:write($output, .) > > Second, launch XSLT transformation at the command prompt: > basex.bat -b $input="path/to/input.xml" -b > $stylesheet="path/to/transform.xslt" "path/to/xquery_xslt.qy" > > Regards, > Yitzhak Khabinsky