Re: [xsl] Is it possible to set the mode dynamically?

Subject: Re: [xsl] Is it possible to set the mode dynamically?
From: "Ruski Blogg profrustyleafiii@xxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 8 Jan 2020 20:44:42 -0000
Many thanks for all the advice. Was not aware of how powerful higher order
functions were in XSLT 3.0 -  may have to delve deeper.

Sent via iPigeon...

> On 7 Jan 2020, at 14:57, Piez, Wendell A. (Fed) wendell.piez@xxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> o;?
> Hi,
>
> Steering clear of higher-order functions and indeed of the question as
posted, one can work around the requirement by doing something entirely
different.
>
> For example, one could pass that file name in as a tunnel parameter and then
reference it in templates lower down, without having to switch modes at the
top.
>
> Of course, YMMV but in many cases, this approach is more parsimonious of
code than multiple modes, and it beats mode overloading for maintenance
programmers who are baffled by modes b but to whom a tunnel parameter might
be a Neat Thing.
>
> Cheers, Wendell
>
> From: Michael Kay mike@xxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
> Sent: Tuesday, January 7, 2020 6:21 AM
> To: xsl-list <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> Subject: Re: [xsl] Is it possible to set the mode dynamically?
>
> Another way would be to associate a function with each mode:
>
> <xsl:function name="f:apply-pivot-table">
>   <xsl:param name="select"/>
>   <xsl:apply-templates select="$select" mode="pivot-table"/>
> </xsl:function>
>
> <xsl:function name="f:apply-default">
>   <xsl:param name="select"/>
>   <xsl:apply-templates select="$select" mode="#unnamed"/>
> </xsl:function>
>
> <xsl:variable name="apply" select="if ($table-name = 'pivot-table-payload')
then f:apply-pivot-table#1 else f:apply-default#1"/>
>
> and then replace the <xsl:apply-templates select="X"/> instruction with
<xsl:sequence select="$apply(X)"/>
>
> (But having introduced higher order functions, you might then find you can
do everything with higher order functions and don't need template rule
matching at all).
>
> Michael Kay
> Saxonica
>
>
> On 7 Jan 2020, at 11:01, Martin Honnen martin.honnen@xxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Am 07.01.2020 um 11:51 schrieb rus tle profrustyleafiii@xxxxxxxxxxx:
> Is it possible to set the mode dynamically?
>
> The use case:
>
> 1. Setting a variable to a file name
>
> <xsl:variable name="PayloadName" select="/POM/Netflix/@payload" />
>
> 2. Using that variable to load the file dynamically into another variable
>
> <xsl:variable name="payload" select="document(concat($PayloadName,
'.xml'))/payloadb/>
>
> 3. Calling a template and passing the file name as as a param to be used in
that called template as the mode.
>
>  <xsl:call-template name="create-html-tables">
>       <xsl:with-param name="PayloadName" select="$PayloadNameb/>
> </xsl:call-template>
>
>  <xsl:template name="create-html-tables">
>         <xsl:param name=bPayloadName"/>
>        <xsl:apply-templates select="$pom//Event" mode=b$payloadNameb/>
> </xsl:template>
>
> Is that a possibility in anyway shape or formb&? Otherwise I am thinking
the only alternative would be to use a choose and then hardcode the mode -
which works, but just wondering if there was a cleaner way?
>
>
> <xsl:choose>
>     <xsl:when test="$PayloadName = 'pivot-table-payload'">
>         <xsl:apply-templates select="$pom//Event" mode="pivot-table"/>
>     </xsl:when>
>     <xsl:otherwise>
>         <xsl:apply-templates select="$pom//Event" mode="default"/>
>     </xsl:otherwise>
> </xsl:choose>
>
> Many thanks,
>
> Rusty
>
> Using a shadow attribute in XSLT 3 it might work:
https://www.w3.org/TR/xslt-30/#shadow-attributes
>
> The variable/param would need to be global and static.
>
> Additionally there is fn:transform to run on the fly generated XSLT.
>
> XSL-List info and archive
> EasyUnsubscribe (by email)
>
> XSL-List info and archive
> EasyUnsubscribe (by email)
> XSL-List info and archive
> EasyUnsubscribe (by email)

Current Thread