On 7/19/07, Abel Braaksma (online) <abel(_dot_)online(_at_)xs4all(_dot_)nl>
wrote:
I think I believed the wrong term, I meant method overloading
instead of polymorphism. I don't agree with your statement that
single polymorphism is what is offered by XSLT. I
Not out-of-the box, but you can re-create it. "Polymorphism" is
still a suitable term imho.
POLYMORPHISM
If such a thing would exist it might look something like this:
<xsl:module name="mod:cat" implements="animal">
<xsl:function name="talk">Meow!</xsl:function>
<xsl:function name="name">Cat</xsl:function>
</xsl:module>
<xsl:module name="mod:dog" implements="animal">
<xsl:function name="fu:talk">Bark!</xsl:function>
<xsl:function name="fu:name">Cat</xsl:function>
</xsl:module>
<xsl:module name="mod:animal">
<xsl:function name="fu:talk" deferred="yes">
<xsl:function name="fu:name" deferred="yes">
<xsl:function name="fu:say-name">
<xsl:sequence select="fu:talk(), ' I am a ', fu:name()" />
<xsl:function>
</xsl:module>
<!-- suppose that a module can be called like a xpath axis, then -->
<xsl:template match="/">
<xsl:sequence select="'mod:dog:', mod:dog::say-name()" />
<xsl:sequence select="'mod:cat:', mod:cat::say-name()" />
</xsl:template>
<!-- output will then be -->
mod:dog: Bark! I am a dog
mod:cat: Meow! I am a cat
Not quite - that should really be "mod:animal::say-name()" called
twice to be polymorphism - you're calling the "concrete" method there
rather than the abstract.
So to recreate your example using named templates and import precedence:
Animal.xslt
<xsl:template name="sayName">
<xsl:value-of select="$name"/>
</xsl:template>
And then Dog.xslt:
<xsl:import href="animal.xslt"/>
<xsl:variable name="name" select="'Dog'"/>
<xsl:template match="/">
<xsl:call-template name="sayName"/>
</xsl:template>
And the equivalent Cat.xslt would just have the different variable:
<xsl:variable name="name" select="'Cat'"/>
So why is this polymorphism? Because the common Animal.xslt will use
the $name variable depending on how the transform was constructed.
You call "sayName" in the Animal stylesheet and that uses the $name
variable in the Dog/Cat stylesheet.
The Animal stylesheet is kind-of abstract in that it won't run on it's
own because it lacks a declaration for $name.
Perhaps in the future if "compiled stylesheet modules" become a
reality then abstract and final modifiers for templates and functions
will be included too.
http://www.biglist.com/lists/xsl-list/archives/200506/msg00429.html
--
http://andrewjwelch.com
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--