如何在最后不需要 xforms:delete 的情况下执行 xforms:insert?
Posted
技术标签:
【中文标题】如何在最后不需要 xforms:delete 的情况下执行 xforms:insert?【英文标题】:How to do an xforms:insert without the need of xforms:delete at the end? 【发布时间】:2017-02-11 06:36:10 【问题描述】:<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" />
这种方法有什么问题吗,或者有没有办法可以直接插入而不需要初始为空?
【问题讨论】:
【参考方案1】:两个答案:
你真的不需要初始类型元素
您的原始实例可以是:
<subInstance/>
然后你可以插入 到 subInstance
元素:
<xf:action ev:event="xforms-model-construct">
<xf:insert
context="instance('subInstance')"
origin="instance('defaultType')/type""/>
</xf:action>
使用context
而不使用nodeset
或ref
表示您要插入到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>
-
通过定位目标实例的根元素,整个实例将被替换。 XForms 1.1 就是这种情况。
通过
origin
属性使用 XForms 2.0 中的 xf:element()
函数,您可以动态地创建一个以 subInstance
为根并仅包含来自 defaultType
实例的 type
元素的 XML 文档。
为了使其更加现代,可以将 nodeset
替换为 ref
,因为在 XForms 2.0 中不推荐使用 nodeset
:
<xf:action ev:event="xforms-model-construct">
<xf:insert
ref="instance('subInstance')"
origin="
xf:element(
'subInstance',
instance('defaultType')/type
)
"/>
</xf:action>
【讨论】:
谢谢。第一个答案(上下文)是我正在寻找的。span>以上是关于如何在最后不需要 xforms:delete 的情况下执行 xforms:insert?的主要内容,如果未能解决你的问题,请参考以下文章