我正在使用Orbeon Form Builder生成表单。我想在保存表单时从模型中删除一个元素(最后一个)。
我尝试根据示例in this link 创建删除操作,但无法使其工作
鉴于实例
<xf:instance id="fr-form-instance">
<guide>
<title/>
<media>
<format>image</format>
</media>
<media>
<format>video</format>
</media>
</guide>
</xf:instance>
我在删除最后一个媒体元素
中有以下删除操作<xf:delete ev:event="xforms-submit" nodeset="guide/media" at="last()"/>
但它不起作用。
我也尝试过更改xpath
<xf:delete ev:event="xforms-submit" nodeset="media" at="last()"/>
并包装在一个动作中
<xf:action ev:event="xforms-submit">
<xf:delete nodeset="guide/media" at="last()"/>
</xf:action>
但仍然没有快乐!
XForm是有效的,您可以保存数据,只是第二个媒体元素仍然出现在最终的XML数据中。
答案 0 :(得分:1)
猜测,您最初的问题是您的XPath表达式没有选择要删除的元素。表达“guide / media”不会选择任何东西(除非有重要内容你没有向我们展示),因为“guide”是实例的最外层元素,而这是XPath中的默认上下文节点。
识别删除目标的规则很复杂,我从来没有学过它们,每次我需要删除任何内容时都必须查看示例。但是,执行删除的最简单方法(至少对我而言)是在nodeset属性中标识要删除的节点,并将“at”属性保留在其中。所以,如果是我,我会尝试
<xf:delete ev:event="..."
nodeset="media[last()]"/>
您还应检查以确保您的听众实际上是在听取此事件。将消息放入相同的操作是测试此问题的一种好方法,同时调试 - 如果您没有收到消息,很明显您有事件绑定问题而不是(或不仅仅是)XPath问题。