xsl-list
[Top] [All Lists]

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

2020-01-08 14:44:48
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(_dot_)piez(_at_)nist(_dot_)gov 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:


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 – but to whom a tunnel parameter might 
be a Neat Thing.
 
Cheers, Wendell
 
From: Michael Kay mike(_at_)saxonica(_dot_)com 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> 
Sent: Tuesday, January 7, 2020 6:21 AM
To: xsl-list <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
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(_dot_)honnen(_at_)gmx(_dot_)de 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:
 
Am 07.01.2020 um 11:51 schrieb rus tle 
profrustyleafiii(_at_)yahoo(_dot_)co(_dot_)uk:
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'))/payload”/>
 
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="$PayloadName”/>
</xsl:call-template>
 
 <xsl:template name="create-html-tables">
        <xsl:param name=“PayloadName"/>
       <xsl:apply-templates select="$pom//Event" mode=“$payloadName”/>
</xsl:template>
 
Is that a possibility in anyway shape or form…? 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)
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>