Under the preoccupation of not to change the document data structure, you can use the processing-instruction to do the job. Even though purists have some reserve of pi, but it might stay for still a long while.
Suppose you want to set a top-level parameter nmode (or whatever name) in the xsl document.
[1] Make a new pi.
You give a name (actually quite arbitrarily) the pi, say, adding to the possible confusion, nmode.
[tt]
<?xml-stylesheet type='text/xsl' href='some-url'?>
[blue]<?nmode 1?>[/blue] <!-- the position of this can be very much free -->
[/tt]
Then in the xsl top-level parameter is scripted like this.
[tt]
<xsl

aram name="nmode">
<xsl:value-of select="(//processing-instruction()[name()='nmode'])[1]" />
</xsl

aram>
[/tt]
For more than one parameters to pass, just add accordingly more pi.
[2] In the same spirit, and if you prefer to handle all in the xml-stylesheet pi, you can similarly do this.
[tt]
<?xml-stylesheet type='text/xsl' href='some-url' [blue]nmode="1"[/blue]?>
[/tt]
and then script the xsl param like this.
[tt]
<xsl

aram name="nmode">
<xsl:variable name="x" select="(//processing-instruction()[name()='xml-stylesheet'])[1]" />
<xsl:variable name="y" select="substring-after($x,'nmode=')" />
<xsl:variable name="z" select="substring-before($y,' ')" />
<xsl:variable name="a" select="translate($z,'"','')" /> <!-- " double-quote -->
<xsl:variable name="b" select='translate($a,"'","")' /> <!-- ' single-quote -->
<xsl:value-of select="$b" />
</xsl

aram>
[/tt]
(There seems a lot of aux variables just for clarity.) The same for more parameters to pass: just add on more name/value pairs.
[3] You can also in fact making more closely ressemble a query string. It is indeed possible, but you must properly encode & if you have more than one parameter to pass, in contrast to a ordinary querystring. And the parsing complicates further. It is doable.
I would prefer method [1] for its simplicity and clarity.