我正在使用Orbeon Forms 3.8.0.201005141856 CE。
当页面上的模型太多时,Orbeon会抛出堆栈溢出错误。在初始化期间,在主模型上完成xforms-rebuild,然后在每个模型上启动rebuild / revalidate / recalculate。
如果模型太多,由于堆栈溢出,它永远不会完成。
我可以理解有一些递归,也许第一个模型没有完成验证,除非所有其他模型也是如此,但堆栈是这样的:
前几行是随机的,这些是在溢出时实际调用的方法,其余的是无限循环:
org.orbeon.oxf.xforms.xbl.XBLContainer synchronizeAndRefresh XBLContainer.java 696 org.orbeon.oxf.xforms.xbl.XBLContainer endOutermostActionHandler XBLContainer.java 669 org.orbeon.oxf.xforms.XFormsModel rebuildRecalculateRevalidateIfNeeded XFormsModel.java 1120 org.orbeon.oxf.xforms.xbl.XBLContainer rebuildRecalculateRevalidateIfNeeded XBLContainer.java 723 org.orbeon.oxf.xforms.xbl.XBLContainer rebuildRecalculateRevalidateIfNeeded XBLContainer.java 733 org.orbeon.oxf.xforms.xbl.XBLContainer rebuildRecalculateRevalidateIfNeeded XBLContainer.java 733 org.orbeon.oxf.xforms.xbl.XBLContainer rebuildRecalculateRevalidateIfNeeded XBLContainer.java 733
这里可以避免某些级别的递归?
无论如何,我怀疑我能解决这个问题。但也许我可以在我的表格上修改一些东西。我想确认这是一个太多的模型问题。
我的情况有点特别,因为我的表单是动态构建的,没有关于将使用的数据的信息。稍微简化它看起来像这样(这只是伪代码给出一个想法)。
我有定义可能数据的模板,可以有severa模板,每个模板都可以包含多个属性。
<!-- This defines data templates, known at form creation -->
<xf:instance>
<templates>
<template id="template_1">
<attribute id="attribute_1_1" type="string" />
<attribute id="attribute_1_2" type="date" />
</template>
<template id="template_2">
<attribute id="attribute_2_1" type="int" />
<attribute id="attribute_2_2" type="dateTime" />
</template>
</templates>
</xf:instance>
然后是数据。可以有多个对象,每个对象使用上面的模板之一。它可以包含模板中的属性,但可能不是全部。它还可以包含不会被忽略的模板的属性。可以有多个对象使用相同的模板。可以存在任何对象都不使用的模板。
<!-- This is the data, unknown at form creation -->
<xf:instance id="objects">
<data>
<object template="template_1">
<attribute name="attribute_1_1">value</attribute>
<attribute name="unknownAttribute">value</attribute>
</object>
...
</data>
</xf:instance>
现在显示:
<!-- Repeat on objects -->
<xf:repeat nodeset="instance('objects')/object">
<!-- A XBL that can display a template from its template definition node
<fr:templateDisplay template="instance('templates')/template[@id = ./@template]" />
</xf:repeat>
XBL本身在模板级别做同样的事情:
<xbl:binding id="templateDisplay" />
<xbl:implementation>
<xf:model>
...
</xf:model>
</xbl:implementation>
<xbl:template>
<!-- A repeat on the attribute definition of the attributes -->
<xf:repeat>
<!-- A XBL that changes its control depending on datatype -->
<fr:genericInput type="" data=""/>
</xf:repeat>
<xbl:template>
</xbl:binding>
genericInput XBL在输入上包含不同类型,具体取决于数据类型,它可以在绑定上使用不同的@type,它可以是简单的xbl,它可以是一个日期选择器等。它可以是读写/只读,它可以是单个/多值的。
问题是如果我有一个包含5个属性的模板,它会按对象生成(至少)6个XBL,因此需要重建6个模型。
一开始我可以在崩溃之前管理20个对象。我还有一个本地化xbl被所有其他xbl使用(所以至少12 xbl /模型按对象),我删除了那些和其他一些东西,我在崩溃之前达到了60个对象,但目标是200。 / p>
我想过可能在我的xbl中使用xsl来尝试删除genericInput。但我不熟悉XSL,我想确定它会导致改进。
或者是否可以过滤这些重建并具有静止功能的形式?一种减少递归的方法吗?
或许我错了,这不是一些模型问题?
任何暗示都会受到赞赏。