XSLT Module, how to specify XSLT's Initial Template name
Thursday, 4 June 2026 · 3 messages · last reply 9 Jun 2026
Y
ykhabins4 Jun 2026 16:15 #
Hello,
I am using BaseX 12.4 and its XSLT Module.
The XSLT engine is SaxonHE13-0J, so the XSLT 3.0 standard could be used!
My XSLT needs to process XML files in a directory on the file system. The XSLT is implementing a so called Modified Identity Transform pattern. Unfortunately, it seems it is impossible to pass "-it", i.e. Initial Template name parameter.
I tried 2 lines XQuery as follows:
XQuery
==========
declare variable $stylesheet as xs:string external;
xslt:transform("<dummy/>", $stylesheet, { "-it": "xsl:initial-template" })
The XSLT is using an Initial Template <xsl:template
name="xsl:initial-template">
So, I tried to pass it in BaseX as a parameter to no avail.
The XSLT is working properly in Oxygen XML IDE when the "-it" parameter is specified.
Please see below a full repro.XML files have the following (simplified) structure:
====================================================
<root>
<body>
<text>
<text>second level text</text>
<text>second level text</text>
</text>
</body>
</root>XSLT
===========
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version="3.0">
<xsl:output indent="yes" method="xml"/>
<xsl:mode on-no-match="shallow-copy"/> <xsl:param name="input_dir" select="'file:///c:/XSLT30/Process Multiple XML Files?select=*.xml'"/>
<xsl:param name="output-dir" select="'file:///c:/XSLT30/Process Multiple XML Files/Output/'"/>
<xsl:template name="xsl:initial-template">
<xsl:for-each select="collection($input_dir)">
<xsl:variable name="input_fileName"
select="tokenize(base-uri(.), '/')[last()]"/>
<xsl:variable name="output_fileName" select="'new_' ||
$input_fileName"/>
<xsl:result-document href="{$output-dir || $output_fileName}">
<xsl:apply-templates />
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="text/text">
<comment>
<xsl:apply-templates/>
</comment>
</xsl:template>
</xsl:stylesheet>Regards,
Yitzhak Khabinsky
Regards,
Yitzhak Khabinsky
GR
Gunther Rademacher6 Jun 2026 09:14 #
Hi Yitzhak,
sorry - BaseX does not support the "-it" option.
However, if you can modify the stylesheet, you could add a root template that refers to the initial template:
<xsl:template match="/">
<xsl:call-template name="xsl:initial-template"/>
</xsl:template>Also note that you might want to use function
xslt:transform-text rather than xslt:transform, otherwise BaseX will expect the stylesheet to return an XML document, which your sample stylesheet does not do.
Adding the template could even be done dynamically, like so: declare namespace xsl = "http://www.w3.org/1999/XSL/Transform";
let $stylesheet := doc("stylesheet.xsl")/*
let $stylesheet-with-initial-template := document {
element {$stylesheet/node-name()} {
$stylesheet/@*,
$stylesheet/node(),
<xsl:template match="/">
<xsl:call-template name="xsl:initial-template"/>
</xsl:template>
}
}
return xslt:transform-text(<dummy/>, $stylesheet-with-initial-template)Hope this helps.
Best regards,
Gunther
Gesendet: Donnerstag, 4. Juni 2026 um 16:15
Quoted text · Yitzhak Khabinsky · 63 lines
Von: "Yitzhak Khabinsky via BaseX-Talk" <basex-talk at mailman.uni-konstanz.de> An: basex-talk at mailman.uni-konstanz.de Betreff: [basex-talk] XSLT Module, how to specify XSLT's Initial Template name Hello, I am using BaseX 12.4 and its XSLT Module. The XSLT engine is SaxonHE13-0J, so the XSLT 3.0 standard could be used! My XSLT needs to process XML files in a directory on the file system. The XSLT is implementing a so called Modified Identity Transform pattern. Unfortunately, it seems it is impossible to pass "-it", i.e. Initial Template name parameter. I tried 2 lines XQuery as follows: XQuery ========== declare variable $stylesheet as xs:string external; xslt:transform("<dummy/>", $stylesheet, { "-it": "xsl:initial-template" }) The XSLT is using an Initial Template <xsl:template name="xsl:initial-template"> So, I tried to pass it in BaseX as a parameter to no avail. The XSLT is working properly in Oxygen XML IDE when the "-it" parameter is specified. Please see below a full repro. XML files have the following (simplified) structure: ==================================================== <root> <body> <text> <text>second level text</text> <text>second level text</text> </text> </body> </root> XSLT =========== <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version="3.0"> <xsl:output indent="yes" method="xml"/> <xsl:mode on-no-match="shallow-copy"/> <xsl:param name="input_dir" select="'file:///c:/XSLT30/Process Multiple XML Files?select=*.xml'"/> <xsl:param name="output-dir" select="'file:///c:/XSLT30/Process Multiple XML Files/Output/'"/> <xsl:template name="xsl:initial-template"> <xsl:for-each select="collection($input_dir)"> <xsl:variable name="input_fileName" select="tokenize(base-uri(.), '/')[last()]"/> <xsl:variable name="output_fileName" select="'new_' || $input_fileName"/> <xsl:result-document href="{$output-dir || $output_fileName}"> <xsl:apply-templates /> </xsl:result-document> </xsl:for-each> </xsl:template> <xsl:template match="text/text"> <comment> <xsl:apply-templates/> </comment> </xsl:template> </xsl:stylesheet> Regards, Yitzhak Khabinsky Regards, Yitzhak Khabinsky
Y
ykhabins9 Jun 2026 16:21 #
Hi Gunther,
I tried the proposed workaround.
It is working quite well.
Thanks a lot.
By the way, the text in your replies in the hyperkitty is not visible.
Unfortunately, it is always like that.
Please see below.
Regards,
Yitzhak Khabinsky
Quoted text · Gunther Rademacher · 91 lines
From: Gunther Rademacher <grd at gmx.net> Sent: Saturday, June 6, 2026 3:14 AM To: ykhabins at bellsouth.net; basex-talk at mailman.uni-konstanz.de Subject: Re: [basex-talk] XSLT Module, how to specify XSLT's Initial Template name Hi Yitzhak, sorry - BaseX does not support the "-it" option. However, if you can modify the stylesheet, you could add a root template that refers to the initial template: <xsl:template match="/"> <xsl:call-template name="xsl:initial-template"/> </xsl:template> Also note that you might want to use function xslt:transform-text rather than xslt:transform, otherwise BaseX will expect the stylesheet to return an XML document, which your sample stylesheet does not do. Adding the template could even be done dynamically, like so: declare namespace xsl = "http://www.w3.org/1999/XSL/Transform"; let $stylesheet := doc("stylesheet.xsl")/* let $stylesheet-with-initial-template := document { element {$stylesheet/node-name()} { $stylesheet/@*, $stylesheet/node(), <xsl:template match="/"> <xsl:call-template name="xsl:initial-template"/> </xsl:template> } } return xslt:transform-text(<dummy/>, $stylesheet-with-initial-template) Hope this helps. Best regards, Gunther Gesendet: Donnerstag, 4. Juni 2026 um 16:15 Von: "Yitzhak Khabinsky via BaseX-Talk" <basex-talk at mailman.uni-konstanz.de <mailto:basex-talk at mailman.uni-konstanz.de> > An: basex-talk at mailman.uni-konstanz.de <mailto:basex-talk at mailman.uni-konstanz.de> Betreff: [basex-talk] XSLT Module, how to specify XSLT's Initial Template name Hello, I am using BaseX 12.4 and its XSLT Module. The XSLT engine is SaxonHE13-0J, so the XSLT 3.0 standard could be used! My XSLT needs to process XML files in a directory on the file system. The XSLT is implementing a so called Modified Identity Transform pattern. Unfortunately, it seems it is impossible to pass "-it", i.e. Initial Template name parameter. I tried 2 lines XQuery as follows: XQuery ========== declare variable $stylesheet as xs:string external; xslt:transform("<dummy/>", $stylesheet, { "-it": "xsl:initial-template" }) The XSLT is using an Initial Template <xsl:template name="xsl:initial-template"> So, I tried to pass it in BaseX as a parameter to no avail. The XSLT is working properly in Oxygen XML IDE when the "-it" parameter is specified. Please see below a full repro. XML files have the following (simplified) structure: ==================================================== <root> <body> <text> <text>second level text</text> <text>second level text</text> </text> </body> </root> XSLT =========== <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version="3.0"> <xsl:output indent="yes" method="xml"/> <xsl:mode on-no-match="shallow-copy"/> <xsl:param name="input_dir" select="'file:///c:/XSLT30/Process Multiple XML Files?select=*.xml'"/> <xsl:param name="output-dir" select="'file:///c:/XSLT30/Process Multiple XML Files/Output/'"/> <xsl:template name="xsl:initial-template"> <xsl:for-each select="collection($input_dir)"> <xsl:variable name="input_fileName" select="tokenize(base-uri(.), '/')[last()]"/> <xsl:variable name="output_fileName" select="'new_' || $input_fileName"/> <xsl:result-document href="{$output-dir || $output_fileName}"> <xsl:apply-templates /> </xsl:result-document> </xsl:for-each> </xsl:template> <xsl:template match="text/text"> <comment> <xsl:apply-templates/> </comment> </xsl:template> </xsl:stylesheet> Regards, Yitzhak Khabinsky Regards, Yitzhak Khabinsky
Written for BaseX 12.4. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery