[Xsltforms-support] Improved handling of in-scope evaluation context
Brought to you by:
alain-couthures
From: Mats E. <mat...@li...> - 2017-11-05 23:34:26
|
Hi Alain, Want to share an observation and possible improvement to the xsltforms code. In XsltForms v1.0, when a binding expression on a bound element X in the form references no node(s), descendant bound elements seem to be evaluated with the same in-scope evaluation context as that of X, whereas according to the XForms spec, binding expressions of descendant bound elements should not be evaluated at all in such situations. While it may seem that this is not an important issue, since element X and descendant elements will be marked as disabled anyway, it may happen (and it did so in my form) that XsltForms throws errors/exceptions during build/refresh processing of nested bound elements when their binding expressions are evaluated in an unexpected in-scope evaluation context. I found that it may be possible to fix this issue with the following modifications in the definition of the function XsltForms_globals.build(): 1) replace the line: var newctx = element.node || ctx; with: var newctx = (hasXFElement && xf.hasBinding && !element.node ? null : element.node || ctx); ... in order to pass an in-scope evaluation context with no context item instead of the current context item to the processing of descendant controls if the current element's binding expressions references no node. 2) insert the lines: if (hasXFElement && xf.hasBinding && !ctx) { return {ctx: ctx, hasXFElement: hasXFElement}; } ...towards the top of the function body in order to skip build processing of bound elements whose in-scope evaluation context contains no context item. / Mats |