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

Reply via email to