Re: [xsl] dynamically set priority in xsl:template

Subject: Re: [xsl] dynamically set priority in xsl:template
From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx>
Date: Fri, 2 Mar 2007 09:37:22 +0000
On 3/2/07, Georges Schmitz <georges.schmitz@xxxxxxxxx> wrote:
I want to dynamically set the priority of a template (with
$expand.level), with the objective to control the "amount of output"
from outside the stylesheet via parameter setting.

<xsl:param name="slenderise.level" select="-1" />

  <xsl:template match="@db:type |
                       @db:size |
                       @db:nullable"
                       mode="slenderise"
                       priority="$slenderise.level" />

  <xsl:template match="@* | node()" mode="slenderise">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="slenderise"/>
    </xsl:copy>
  </xsl:template>

But I get this error:
  XTSE0530: Invalid numeric value for priority (0.0)

Is it not possible at all, to set the priority by a parameter? Because
it makes no difference if I declare $slenderise.level to be of type
xs:integer ,xs:double, etc. (which are numbers I suppose) or if I use
the function number() in the priority attribute. I couldn't find any
example to such a use case on the net.

Priorities are compile time values, so you can't change them. Don't you just need:

<xsl:template match="somenode[$param = -1]"/>

...depending on the number of other priorities in you stylesheet?

If you selectively want to suppress elements through a parameter then
you can do the following:

<xsl:param name="names" as="xs:string"/>
<xsl:variable name="suppress" select="tokenize($names, ' ')" as="xs:string*"/>

<xsl:template match="*[name() = $suppress]"/>

The names of the elements you want to suppress are passed to the
stylesheet as a space separated list, the $suppress variable tokenizes
the list into a sequence of strings, and the no-op template matches
any element with name equal to any item in that sequence.

cheers
andrew

Current Thread