Thinking aloud on in-browser development languages and tools.
In the concept of 3-tiered HTML page design ( structure/HTML, presentation/CSS, behavior/JS ) none of tiers has given good enough OOP or aspect-OP capabilities I get used to. Could be any language be used on all tiers? Sure, yes.
JS is capable of all. Could not see much of positive sides besides of
❤ sufficient to achieve the goal.
❤ Weakly support of OOP.
☢ lack of strict definitions and validation
☢ Weak interaction with other tiers (css&html). Browser does not support sufficient native interfaces to be used by JS:
§Do you recall how and why getComputedStyle used? Browser does not give API for CSS parameters get and set. Even most popular layout computation routine get box dimentions needed quite CPU expencive work around.
§Structure/HTML dom tree also suffering of lack support on JS level. No transactional and detached/group operations. Each dom node operation accomplished by layout recalculation, while that should be explicit function to finalize series of dom changes.
CSS covers just own tier and almost none of others. IE behaviours do not count since absent in other browsers.
HTML tags. Interesting beast.
❤ Has limited support on all tiers. Styles as inline attribute and result of HTML structure. Behavior as inline scripting and tags( reload meta, MARQUEE, animateTransform, etc. )
☢ Obviously, nothing toward OOP or any serious modular development. IFrame or HTC do not count.
HTC need to be highlighted as BEST solution for HTML modularization on ALL page tiers(structure,layout,behavior). Sadly it did not became a standard even with effort to be part of W3C.
FLASH, Silverlight, Java are just proprietory plugins and have no support on all 3-tiers.
XSL till 2006 was not available in major browsers. Not the issue since.
Has no direct support for either of 3 tiers. But:
❤ natively capable to use any natively supported languages. HTML as structure, behaviors as JS, layout as CSS
❤ not to mention the mix of all 3 for efficiency.
❤ there is no more need to separate tiers for either development or efficiency.
❤ new higher level entities could be introduced on native level: themes, languages, etc. AspectRule (see XSL pipeline implementations ) is one of them.
☢ no frameworks ( working on one)
☢ no developers ( need HTML stack and XSLT in same hands )
Working on XslAspect, I found the need to define own language for "Aspect" rules. I.e. what(rule), where(in model) and when(environment) should be applied. The thing is that the rule should be functional on any point of delivery chain: back-end, before DOM loaded in browser, in run-time. From another side, it should have OOP and AOP capabilities. XSL has all needed, but for syntax makes me uncomfortable. So there is a dilemma: should be new(or some existing) XML-based language invented/used or use old-fasioned XSL for things it is not meant to be ( like methods definition ).
Since XslAspect uses XSL templates, they also need to be OOP capable. ( AOP has XSL nature anyway ). If that will be done, than invention of new things is not necessary. I guess. And even if some new features need to be added, there is still a way to alter XSL with own namespace or add the data into XSL code.
To make the OOP match, it would be wise to make basic OOP stuff defined in XSL terms:
o deployment or source module (group of files). Not OOP stuff, but still needed
o package/namespace ( to separate "classes" )
o Type/Class
o Object
o Method
o Parameters
o return values
Than AOP things. But the join/attach points will define not just what and where the code should be applied but also the (server, browser, runtime) environment and model peaces.
At our disposal XSL has:
· template mode.
· template name.
· template match filter. Which is good for model navigation.
In addition in XSL could be used:
o XslAspect namespace to define own attributes on
§rules,
§xsl:stylesheet as grouping tool
o folder and file name convention
o embedded xml with own namespace
In general, it would be better to use as much native XSL stuff as possible and as last resort - own namespace.
Procedural vs AOP.
Another problem - developer convenience in procedural programming. Aspect assumes applying of rules all instantly and on whole model.
Which is quite different than sequential step-by-step execution. While the efficiency of parallel execution in AOP is not under question, the order of operations and their encapsulation in XSL is not developer and data-driven dev-t friendly: rules applied to same data could be spread in modules and there is no dependency to make strict order. In XSL that dependency could be done on data level by RuleSet ( embedding XML with recurrently enclosed rules ). Usually rules are quite simple (do not confuse with implementation). That way 1st implementation of XslAspect has been done. Another name for such use data processing is pipelining. Result of XSL processing is the source data for further processing.
Is there native XSL way of strictly define the sequence and enclose-dependency?
Sure, there are few ways in addition to RuleSet. Question is, what is more convenient?
· xsl:call-template with parameters. Parameters are calculated first. The parameter value could be the call to another template.
· xsl:apply-template has ability to pass parameters. Unfortunately not cross-browser capable. (or it is in modern ones?)
· Blend input with RuleSet and use complex filtering in xsl:apply-template making select on original data set AND on joint RuleSet.
Actually all methods in framework could be equal and transformed one into another during platform-targeted packaging. So no actual restrictions are in place, just developer's convenience. Speaking of which, lets compare 3 approaches:
· RuleSet
<xa:AcpectRule aspectName="ScrollableTable" >
<xa:AcpectRule aspectName="SortableTable_UI" >
<xa:AcpectRule aspectName="SortableTable_DataSort" >
<xa:sort colNum="2" order="ascending" data-type="text" />
<xa:sort colNum="1" order="descending" data-type="text" />
<xa:AcpectRule aspectName="TestTable" />
</xa:AcpectRule>
</xa:AcpectRule>
</xa:AcpectRule>
· xsl:call-template
It is definitely native XSL. Bulky at least.
<xsl:template name="AspectRule1">
<xsl:call-template name="ScrollableTable">
<xsl:with-param name="data" >
<xsl:call-template name="SortableTable_UI">
<xsl:with-param name="data">
<xsl:call-template name="SortableTable_DataSort">
<xsl:with-param name="data" select="."/>
<xsl:with-param name="Sort">
<xa:sort colNum="2" order="ascending" data-type="text" />
<xa:sort colNum="1" order="descending" data-type="text" />
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
· xsl:apply-template. How to to make the match reference only to the select with 2 nodes(data & rule) and access data from both. It could be done by mode but it will exclude the use of mode for other purposes (like define the module). From another side why module name should differ from aspect rule name? Another problem is pipelining. To make it work apply-template should be called from parent.
<xsl:template mode="AspectRule1_asApply">
<xsl:variable name="d1">
<xsl:apply-templates select="." mode="AspectRule2_asApply"/>
</xsl:variable>
<xsl:apply-templates select="$d1" mode="ScrollableTable" />
</xsl:template>
<xsl:template mode="AspectRule2_asApply">
<xsl:variable name="d1">
<xsl:apply-templates select=" . | $sort " mode="SortableTable_DataSort"/>
</xsl:variable>
<xsl:apply-templates select="$d1" mode="SortableTable_UI" />
</xsl:template>
...
It is obvious to see that AspectRule is shorter and more readable. Note that in all implementation the result of previous processing used as an argument for following one. XSL 1.0 is strictly prohibiting that. But with some tricks and magic it could be worked around on all browsers.
The performance impact which you could see on additional data processing could be relocated to packaging routine, that way xsl:call-template will be generated and delivered to client instead of AspectRule.
In terms of native/interpreted languages the xsl:call-template is natively compiled and AspectRule is the interpreted scripting.