Sylvain Wallez wrote:
>>Since i'm using xsl2 for all my forms, i'm looking for a way to enable
>>ajax in FormsGenerator.
>>
>
> Interesting. Can you explain how you use XSLT 2 and the FormGenerator?
>
Of course. For now it's not exactly compatible with the template language.
The main difference concern repeaters. I declare my templates enclosed in a
variable 'template' like this:
---
<xsl:include href="stylesheets/forms/forms.xsl"/>
<xsl:variable name="template">
<ft:form-template action="{$continuation}.continue" method="post"
enctype="multipart/form-data">
...
<ft:widget id="maintab_state">
<fi:styling type="hidden"/>
</ft:widget>
...
<ft:repeater-size id="myrepeater"/>
<!--<ft:repeater-widget id="myrepeater">-->
<xsl:for-each select="ft:repeater-rows('myrepeater')">
<xsl:variable name="row" select="ft:row-prefix('myrepeater',
position())"/>
<ft:widget id="{$row}roomarea">
<fi:styling size="2"/>
</ft:widget>
</xsl>
</xsl:variable>
---
As you see it's not as clean as jx syntax, but writing a metastylesheet to
transform <ft:repeater> in an xsl loop and prefix all widgets id seems
quite simple (still efficient with cache and precompilation).
widgets are indexed on their id attribute to speedup lookups. forms.xsl is
pretty simple :
---
<xsl:param name="continuation"/>
<xsl:key name="widgets" match="fi:*" use="string(@id)"/>
<xsl:variable name="widgets"
select="/fi:form-generated/fi:form[1]/fi:widgets//[EMAIL PROTECTED]"/>
<!-- -->
<xsl:template match="/">
<xsl:apply-templates select="$template/page"/>
</xsl:template>
<!-- -->
<xsl:function name="ft:repeater-rows" as="node()*">
<xsl:param name="id"/>
<xsl:sequence select="ft:widget($id)/fi:repeater-row"/>
</xsl:function>
<!-- -->
<xsl:template match="ft:widget">
<xsl:variable name="widget" select="ft:widget(@id)"/>
<xsl:element name="{name($widget)}">
<xsl:sequence select="$widget/@* | $widget/*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
---
Things look suboptimal (use of variables, 2x evaluation of $template), but
for my case (lot of xpath processing in big templates) it's still faster
than jx (with saxon8). However this is temporary stuff. I found a way to
remove the
<xsl:apply-templates select="$template/page"/>
and replace the
<xsl:variable name="template">
by a
<xsl:template match="/">
and make lookups of widgets directly on input (get rid of this 'widgets'
variable), but it means to replace all
<ft:..>
with something like
<xsl:sequence select="ft:..()"/>
which is less readable (style will be handled via attribute-sets given as
parameters to ft functions in that case). Just need some time to implement.
What was important from now was speed and stability. Readability will come
with meta-stylesheet and i think that the syntax will finally be very close
from jx macros.
>
> I guess you're referring to the FIXME in
> AbstractWidget.generateSaxFragment.
>
yes
>>Will the generator generate the bu tags, or will it generate the tags for
>>updated widgets only (without bu) ?
>>
>>
>
> If Widget.generateSaxFragment() was producing the bu:replace elements,
> then that would mostly translate to piping the result of the
> FormsGenerator through the BUTransformer.
>
> Unfortunately, this is not what happens and it should not happen as the
> <bu:replace> tag is really a view concern.
>
I'm agree.
> A way to achieve this is for widgets to produce an additional
> updated="true" attribute when they were updates. The FormsGenerator can
> then easily wrap such widget elements with a <bu:replace> that can then
> be consumed by the BUTransformer and whatever comes next.
>
It's clear. I will try to implement it. Our forms are so fat (this is a
feature :-) that ajax for me is not an option :-)
>
> Hope this helped :-)
>
> Sylvain
>
yep.
Regards.