1

<xf:action ev:event="xforms-model-construct">
    <xf:insert nodeset="instance('subInstance')/type" origin="instance('defaultType')/type"/>
</xf:action>

我想根据另一个实例填充一个实例。我可以使用 xf:insert 来做到这一点,如上所示。

但是,我意识到实例 'subInstance' 在启动 xf:inserts 之前必须包含一个空类型元素。

<subInstance>
  <type/>
</subInstance>

所以在所有的 xf:inserts 之后,我需要执行以下操作来删除第一个空的:

<xf:delete nodeset="instance('subInstance')/type" at="1" />

这种方法有什么问题吗,或者有没有一种方法可以直接插入而无需初始为空?

4

1 回答 1

2

两个答案:

你真的不需要一个初始类型元素

您的原始实例可以简单地是:

<subInstance/>

然后你可以插入subInstance元素中:

<xf:action ev:event="xforms-model-construct">
    <xf:insert
        context="instance('subInstance')"
        origin="instance('defaultType')/type""/>
</xf:action>

使用contextwithout nodesetorref表示您要插入.指向的节点context

您仍然可以做您想做的事,但需要 XForms 2.0 支持

如果你想保留原来的嵌套type元素,你可以这样写:

<xf:action ev:event="xforms-model-construct">
    <xf:insert
        nodeset="instance('subInstance')"
        origin="
            xf:element(
                'subInstance',
                instance('defaultType')/type
            )
        "/>
</xf:action>
  1. 通过定位目标实例的根元素,整个实例将被替换。XForms 1.1 就是这种情况。
  2. 使用 XForms 2.0 中的该origin属性的xf:element()函数,您可以动态地创建一个以实例为根subInstance且仅包含实例type元素的 XML 文档defaultType

为了使其更加现代,您可以替换nodesetref,正如nodesetXForms 2.0 中已弃用的那样:

<xf:action ev:event="xforms-model-construct">
    <xf:insert
        ref="instance('subInstance')"
        origin="
            xf:element(
                'subInstance',
                instance('defaultType')/type
            )
        "/>
</xf:action>
于 2016-10-03T16:42:25.497 回答