|
Subject: Re: [xsl] Run-time polymorphism in XSL 1.0 From: Dimitre Novatchev <dnovatchev@xxxxxxxxx> Date: Mon, 21 Mar 2005 13:56:22 +1100 |
Hi Andrey,
Yes, this is one way to simulate virtual functions. The description
seems a little-bit too-complicated.
This approach was first described (in a more simple way -- just by an
example) at:
http://www.biglist.com/lists/xsl-list/archives/200111/msg01100.html
and later in:
http://www.mulberrytech.com/Extreme/Proceedings/xslfo-pdf/2003/Novatchev01/EML2003Novatchev01.pdf
My personal observations indicate that such type of run-time
polymorphism is much-too clumsy and to the best of my knowledge has
not been used in a system that exploits the much more powerful,
natural and convenient mechanism of using Higher Order Functions
(HOFs).
Another stumbling block is that no type-checking can be provided in
both XSLT/XPath 1.0 *and* 2.0.
It is extremely awkward not to be able to define the necessary types
inline in a stylesheet. One has to define them separately in XSD.
The C-Omega language gives the ability to conveniently define such
types inline and in this respect provides a better programming
environment than XSLT 2.0.
Cheers,
Dimitre Novatchev.
On Sun, 20 Mar 2005 18:51:21 -0500, Andrey Basko
<andrey_basko@xxxxxxxxxxxxxxxx> wrote:
> Hi, All!
>
> Some time ago I tried to find reliable approach how to implement run-time
> polymorphism in XSL 1.0. Initially I used inbuilt polymorphism-like template
> overriding mechanism based on import precedence. However I encountered the
> issues described in: ("Reliance on import precedence considered dangerous"
> http://sources.redhat.com/ml/xsl-list/2001-02/msg00996.html, and
> http://sources.redhat.com/ml/xsl-list/2001-02/msg01003.html).
>
> In XSL forums I found several messages that mentioned how to implement
> polymorphism in XSL 1.0 based on generic templates proposed by Dmity
> Novatchev
> (http://lists.fourthought.com/pipermail/exslt/2001-May/000169.html).
>
> Eventually I came up with some approach that I would like to share with the
> XSL community. The idea how to implement run-time polymorphism in XSL is
> similar to approach used in generic templates:
>
> 1. Declare special customized data structures (under non-xsl namespace,
> embedded in the stylesheet) which define:
> a. Virtual methods in logically defined class.
> b. Virtual methods table variable by inheriting methods from virtual
> methods table of base "class".
>
> 2. Pass reference to virtual methods table to all virtual methods as a
> parameter.
>
> Below I describe several "how to" steps in order to explain how to declare
> two classes: Base "class" and Child "class" that inherits from Base "class".
>
> 1. How to declare Base class.
>
> a. Declare Base class namespace:
>
> <xsl:stylesheet [...] xmlns:Base="Base">
>
> b. Declare Base class methods and virtual table:
>
> <Base:class>
> <Base:Method1 method="Method1"/>
> <Base:Method2 method="Method2"/>
> </ Base:class>
>
> <xsl:variable name="Base:class" select="document('')// Base:class"/>
> <xsl:variable name="Base:vtable" select="$Base:class/*"/>
>
> The variable "$Base:vtable" is a virtual table for Base class.
>
> 2. How to declare Base class method handlers.
>
> <xsl:template match="Base:Method1">
> <xsl:param name="this"/>
> <xsl:param name="vtable"/>
> <!-- code is here -->
> </xsl:template>
>
> Each method should declare "vtable" parameter. The "this" parameter is
> supposed to be used as a node reference to real XML data.
>
> 3. How to declare Child class
>
> a. Declare Base and Child class namespaces:
>
> <xsl:stylesheet [...] xmlns:Child="Child" xmlns:Base="Base">
>
> b. Use <xsl:include> if necessary:
>
> <xsl:include href="Base.xsl"/>
>
> c. Declare Child class methods and inherit virtual methods from Base class:
>
> <Child:class>
> <Child:Method1 method="Method1"/>
> <Child:NewMethod3 method="NewMethod3"/>
> </Child:class>
>
> <xsl:variable name="Child:class" select="document('')//Child:class"/>
> <xsl:variable name="Child:BaseMethods"
> select="$Base:vtable[not(@method=$Child:class/*/@method)]"/>
>
> <xsl:variable name="Child:vtable" select="$Child:class/* |
> $Child:BaseMethods"/>
>
> Variable "$Child:BaseMethods" contains only those methods that are declared
> in the Base class but not declared in the Child class.
>
> So, each class declares its own virtual table that is accessible by
> "${ClassNamespace}:vtable" variable. In this example virtual tables are:
> "$Base:vtable" and "$Child:vtable".
>
> 4. How to make virtual method call:
>
> <xsl:template match="Base:Method1">
> <xsl:param name="this"/>
> <xsl:param name="vtable"/>
>
> <xsl:apply-templates select="$vtable[local-name()='Method2']">
> <xsl:with-param name="this" select="$this"/>
> <xsl:with-param name="vtable" select="$vtable"/>
> <!-- Other Method2 parameters -->
> </xsl:apply-templates>
> </xsl:template>
>
> 5. How to call base class methods from child classes:
>
> <xsl:template match="Child:Method1"> <!-- declaration of Child:Method1
> handler -->
> <xsl:param name="this"/>
> <xsl:param name="vtable"/>
> <doSomethingNew>
> <xsl:apply-templates select="$Base:vtable[local-name()='Method1']">
> <xsl:with-param name="this" select="$this"/>
> <xsl:with-param name="vtable" select="$vtable"/>
> </xsl:apply-templates>
> </doSomethingNew>
> </xsl:template>
>
> It means that in order to call base class methods you need to select method
> from concrete class virtual table. But it is still necessary to pass source
> $vtable parameter to it.
>
> 6. How to define special handler for abstract methods:
>
> It is easy to force overriding of all abstract methods by declaring the
> following template in corresponding class (in this case it is Base class):
>
> <xsl:template match="*[namespace-uri()='Base']" priority="-1">
> <xsl:message terminate="yes">
> Abstract method "Base:<xsl:value-of select="local-name()"/>" was
> called
> </xsl:message>
> </xsl:template>
>
> Hope somebody will enjoy this approach while developing with XSL.
>
> Best Regards,
> Andrey Basko
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Run-time polymorphism in XSL , Andrey Basko | Thread | Re: [xsl] Run-time polymorphism in , Andrey Basko |
| Re: [xsl] Faxing, Chris_Graham | Date | Re: [xsl] Run-time polymorphism in , Andrey Basko |
| Month |