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: [email protected]
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
([email protected]) 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