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